日期:2014-05-16  浏览次数:20634 次

关于linux启动过程中的一个疑问
在看linux的启动过程,不太明白:
现在有一个bootsect.s位于0x90000
一个setup.s位于0x90200
一个压缩的内核映象,存放于0x1000(64k)位置

Setup.s结束的时候,跳转到0x10000(1m,也就是head.s的startup_32位置)开始执行
我的疑问是:
1   压缩的内核映是怎么出现的?在启动过程中动态编译压缩出来的,还是已经存在,直接读取的?
2   0x9c0200处存放的setup.s也不可能是源代码而是经过编译的吧,那这个编译的过程是在什么时候?
3   arch/i386/boot/compressed/ "中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的   这个动作发生在什么时候?




------解决方案--------------------
1 压缩的内核映是怎么出现的?在启动过程中动态编译压缩出来的,还是已经存在,直接读取的?
:已经存在,不可能在启动时动态编译
2 0x9c0200处存放的setup.s也不可能是源代码而是经过编译的吧,那这个编译的过程是在什么时候?
:所有的东西都是事先编译好的,你安装系统时所安装的文件即时早就编译好的映象
3 arch/i386/boot/compressed/ "中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的 这个动作发生在什么时候?
:setup.s执行完后,直接跳到0x10000去执行该压缩的内核,压缩的内核由“解压缩部分”+“真正的内核”组成,解压动作就发生在“跳到0x10000”之后即进行了