当前位置: 技术问答>linux和unix
关于可执行文件的问题,请大家多多指教!
来源: 互联网 发布时间:2015-09-21
本文导语: 之所以选择这个社区,我想只有这里面的人懂得最透,这个问题我问了老师好多次,可他怎么也讲不明白,拜托各位了! 在操作系统中,一种可执行的二进制文件都有一定的格式,或者说有一个程序头,包含一些程序类型,...
之所以选择这个社区,我想只有这里面的人懂得最透,这个问题我问了老师好多次,可他怎么也讲不明白,拜托各位了!
在操作系统中,一种可执行的二进制文件都有一定的格式,或者说有一个程序头,包含一些程序类型,标志,程序大小等信息。
1。当它被调到内存去执行时,这个文件头还在不在,还是存储到了相应的数据结构中了?在判断程序是否执行完时,是根据程序大小还是在程序的结尾有程序结束的指令?
2。程序头是在编译时由编译器给加上的还是在存入文件系统时由文件系统加上的?
3。程序头部分不是机器指令,在执行时OS知道如何处理,但这样的程序在裸机上怎样运行?以引导程序为例,若在OS中写一个引导程序,像其它可执行程序一样,它有一个文件头,现在要把它放到软盘第一扇区,用此软盘启动,让机器执行这个引导程序,若有这个程序头,那此程序还能不能执行?若不能执行,就要把这个程序头去掉,只留下指令序列,那是在编译时通过某种方式让它不产生程序头,还是在写入软盘第一扇区时从程序头后的第一条真正指令开始复制?
4。把一个程序直接复制到一张空白的软盘中,它是否会从软盘的第一扇区开始写?
在操作系统中,一种可执行的二进制文件都有一定的格式,或者说有一个程序头,包含一些程序类型,标志,程序大小等信息。
1。当它被调到内存去执行时,这个文件头还在不在,还是存储到了相应的数据结构中了?在判断程序是否执行完时,是根据程序大小还是在程序的结尾有程序结束的指令?
2。程序头是在编译时由编译器给加上的还是在存入文件系统时由文件系统加上的?
3。程序头部分不是机器指令,在执行时OS知道如何处理,但这样的程序在裸机上怎样运行?以引导程序为例,若在OS中写一个引导程序,像其它可执行程序一样,它有一个文件头,现在要把它放到软盘第一扇区,用此软盘启动,让机器执行这个引导程序,若有这个程序头,那此程序还能不能执行?若不能执行,就要把这个程序头去掉,只留下指令序列,那是在编译时通过某种方式让它不产生程序头,还是在写入软盘第一扇区时从程序头后的第一条真正指令开始复制?
4。把一个程序直接复制到一张空白的软盘中,它是否会从软盘的第一扇区开始写?
|
想起曾经的学生年代,不过你比我当时出息多啦:) ,我只知道骂老师大水。
你想得不错每种可执行文件确实是有个主头文件的,具体的分析网上有个很好的文章
http://linux.chinaunix.net/doc/system/2005-01-13/777.shtml
1,这个主要是为载入程序提供必要的信息,如段数、段大小、段偏移、程序指令起始的偏移地址,另外在每个段前也有段头,记载段信息如类型、大小及偏移量、访问属性等。
当程序被载入时依照操作系统相应可执行文件的特点形成了相应数据映象。程序的终结有几种方式:1、正常退出(exit(int)),2、收到结束程序的消息(kill(pid_t,int)),3、意外中止(abort(void)),4、严重出错被OS 接管退出。
2,由编译器生成的,由OS 读入构成主文件头映象。
3,程序在被OS 调入时,生成了对应的PCB ,在PCB 中登记的有代码段及相应偏移,程序运行时有指令指针,用以确定程序此时的执行位置,程序执行总是从代码断开始读入第一条指令的。
引导程序通常是指BIOS 的引导部分,读入磁盘某扇区放入内存哪个位置,控制权交给程序于是开始了系统的启动过程。
4,我不是很清楚,但做成引导盘一定是这样的,就像DOS 的SYS 命令,就是把启动程序搬到第一扇区。
你想得不错每种可执行文件确实是有个主头文件的,具体的分析网上有个很好的文章
http://linux.chinaunix.net/doc/system/2005-01-13/777.shtml
1,这个主要是为载入程序提供必要的信息,如段数、段大小、段偏移、程序指令起始的偏移地址,另外在每个段前也有段头,记载段信息如类型、大小及偏移量、访问属性等。
当程序被载入时依照操作系统相应可执行文件的特点形成了相应数据映象。程序的终结有几种方式:1、正常退出(exit(int)),2、收到结束程序的消息(kill(pid_t,int)),3、意外中止(abort(void)),4、严重出错被OS 接管退出。
2,由编译器生成的,由OS 读入构成主文件头映象。
3,程序在被OS 调入时,生成了对应的PCB ,在PCB 中登记的有代码段及相应偏移,程序运行时有指令指针,用以确定程序此时的执行位置,程序执行总是从代码断开始读入第一条指令的。
引导程序通常是指BIOS 的引导部分,读入磁盘某扇区放入内存哪个位置,控制权交给程序于是开始了系统的启动过程。
4,我不是很清楚,但做成引导盘一定是这样的,就像DOS 的SYS 命令,就是把启动程序搬到第一扇区。
|
刚才写了详细的答案 结果发送失败 郁闷 以下简述各问题
1。当它被调到内存去执行时,这个文件头还在不在,还是存储到了相应的数据结构中了?在判断程序是否执行完时,是根据程序大小还是在程序的结尾有程序结束的指令?
看系统实现,另一般程序是从_start开始; 例子intel 退出程序,命令执行到这里就退出了
mov ebx, 0
mov eax, 1
int 0x80
2。程序头是在编译时由编译器给加上的还是在存入文件系统时由文件系统加上的?
编译器
3。程序头部分不是机器指令,在执行时OS知道如何处理,但这样的程序在裸机上怎样运行?以引导程序为例,若在OS中写一个引导程序,像其它可执行程序一样,它有一个文件头,现在要把它放到软盘第一扇区,用此软盘启动,让机器执行这个引导程序,若有这个程序头,那此程序还能不能执行?若不能执行,就要把这个程序头去掉,只留下指令序列,那是在编译时通过某种方式让它不产生程序头,还是在写入软盘第一扇区时从程序头后的第一条真正指令开始复制?
我做嵌入,机器启电时会有个固定flash地址(硬件电路确定的),然后从此地址逐个命令执行,简单的boot不启文件系统只初始化内存信息,复杂点的启fs. 一般在稍大点的boot中会加载运行时库,驱动cpu上的串口网口等
4。把一个程序直接复制到一张空白的软盘中,它是否会从软盘的第一扇区开始写?
不是, 一般你用软盘前要作格式化建立文件系统, 这个文件系统也是需要空间的一般写在前面几个扇区, dos 好像不加扩充的是两个
1。当它被调到内存去执行时,这个文件头还在不在,还是存储到了相应的数据结构中了?在判断程序是否执行完时,是根据程序大小还是在程序的结尾有程序结束的指令?
看系统实现,另一般程序是从_start开始; 例子intel 退出程序,命令执行到这里就退出了
mov ebx, 0
mov eax, 1
int 0x80
2。程序头是在编译时由编译器给加上的还是在存入文件系统时由文件系统加上的?
编译器
3。程序头部分不是机器指令,在执行时OS知道如何处理,但这样的程序在裸机上怎样运行?以引导程序为例,若在OS中写一个引导程序,像其它可执行程序一样,它有一个文件头,现在要把它放到软盘第一扇区,用此软盘启动,让机器执行这个引导程序,若有这个程序头,那此程序还能不能执行?若不能执行,就要把这个程序头去掉,只留下指令序列,那是在编译时通过某种方式让它不产生程序头,还是在写入软盘第一扇区时从程序头后的第一条真正指令开始复制?
我做嵌入,机器启电时会有个固定flash地址(硬件电路确定的),然后从此地址逐个命令执行,简单的boot不启文件系统只初始化内存信息,复杂点的启fs. 一般在稍大点的boot中会加载运行时库,驱动cpu上的串口网口等
4。把一个程序直接复制到一张空白的软盘中,它是否会从软盘的第一扇区开始写?
不是, 一般你用软盘前要作格式化建立文件系统, 这个文件系统也是需要空间的一般写在前面几个扇区, dos 好像不加扩充的是两个