Linux内核加载到内存的过程

CPU只能执行内存的代码(CS:IP指向的内存位置),而在按下电源键启动时,内存(RAM)是空的,如何运行程序呢?软件不行,靠硬件。
一旦加电,CS的值立即置为0xffff, IP的值置为0×0000, BIOS程序将自己加载到内存中,其入口地址为CS:IP,即0xffff0。这一步完全靠硬件实现。

这时,CPU可以执行代码了,执行的是BIOS程序,因为CS:IP指向的是BIOS程序在内存的位置。
(ps: BIOS程序不属于内核,我们不去分析它)

BIOS程序在内存区0×00000处开辟1KB的空间用于构建中断向量表,紧挨着中断向量表后面用256B的内存作为BIOS数据区。在之后大约56KB的位置加载了8KB左右的中断服务程序。
(ps: 中断向量表有256个中断向量,每个中断向量4字节,前两个字节是CS,后两个字节是IP. CPU根据中断类型码,在中断向量表中查找对应的表项<中断向量表类似一个数组,中断类型码类似于数组下标>,从而得到中断服务程序的入口地 址,这样CPU就可以执行中断服务程序。中断服务程序属于BIOS程序,它从BIOS加载进内存,不属于内核)

CPU 执行int 0×19中断(略去了很多BIOS代码功能),转到相应的中断服务程序入口,该中断服务程序的功能是:找到软盘(比较古老,可以理解为系统盘),并加载第 一扇区至0x07c00处,该扇区存储着linux 0.11的引导程序,对应着源文件linux0.11/boot/bootsect.s。

下面就开始执行内核程序了,首先是bootsect.s,这是汇编程序,它首先将自己复制到0×90000处,这是因为内核要重新布局内存空间了。

bootsect.s中有一个int 0×13 中断,将软盘第2扇区至第5扇区的内容(对应/boot/setup.s)加载到内存的0×90200处。bootsect.s和setup.s在内存是紧挨着的。

现在bootsect.s还没有执行完, 还有一块代码要加载进来,还是调用 int 0×13中断 ,将从第6扇区开始的约240个扇区的system模块加载到内存0×10000位置。bootsect.s执行完成,它的任务也全部完成。

执行setup.s代码,通过中断获取硬盘参数表1和2,有510字节,覆盖bootsect.s内存(512字节)。

内核加载工作完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值