[03LINUX内核引导启动程序.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[03LINUX内核引导启动程序

LINUX内核引导程序 武汉大学计算机学院 郑鹏 Email:pzheng51@163.com LINUX系统初始化1 1.当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码(只用于实模式高地址位忽略),也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区,也就是bootsect.S,装入到0x7C00(31K)处,并开始执行此处的代码。 LINUX系统初始化2 2.当bootsect.S开始运行时,将自己装入到绝对地址0x90000 (576K)处,再将其后的2k字节代码(boot/setup.s)装入到地址0x90200处,最后将核心的其余部分(system 模块)装入到0x10000。当系统装入时,会显示Loading...信息。 装入完成后,控制转向另一个实模式下的汇编语言代码boot/setup.S。 因为当时system 模块的长度不会超过0x80000 字节大小(即512KB),所以它不会覆盖在0x90000处开始的bootsect 和setup 模块。随后将system 模块移动到内存起始处,这样system 模块中代码的地址也即等于实际的物理地址。便于对内核代码和数据的操作。 LINUX系统初始化3 3.Setup部分首先设置一些系统的硬件设备,然后将核心从0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。 LINUX系统初始化4 4.接下来是内核的解压缩。0x1000处的代码来自于文件zBoot/head.S,它用来初始化寄存器和调用decompress_kernel()程序。decompress_kernel()程序由zBoot/inflate.c, zBoot/unzip.c 和zBoot/misc.c组成。解压缩后的数据被装入到了0x100000处,这也是Linux不能在内存小于2M的环境下运行的主要原因。 5.解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过程。这大概是整个内核中最为复杂的部分。 LINUX系统初始化5 6.start_kernel()程序用于初始化系统内核的各个部分,包括: 设置内存边界,调用paging_init()初始化内存页面。 初始化陷阱,中断通道和调度。 对命令行进行语法分析。 初始化设备驱动程序和磁盘缓冲区。 校对延迟循环。 7.最后,系统核心转向move_to_user_mode(),以便创建初始化进程(init)。此后,进程0开始进入无限循环。 LINUX系统初始化6 启动引导时内核在内存中的位置和移动后的位置情况 bootsect.s 程序 功能描述 bootsect.s 代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0 磁道(柱面),0 磁头,第1 个扇区)。在PC 机加电ROM BIOS 自检后,引导扇区由BIOS 加载到内存0x7C00 处,然后将自己移动到内存0x90000 处。该程序的主要作用是首先将setup 模块(由setup.s 编译成)从磁盘加载到内存,紧接着bootsect 的后面位置(0x90200),然后利用BIOS 中断0x13取磁盘参数表中当前启动引导盘的参数,接着在屏幕上显示“Loading system...”字符串。再者将system 模块从磁盘上加载到内存0x10000 开始的地方。随后确定根文件系统的设备号,若没有指定,则根据所保存的引导盘的每磁道扇区数判别出盘的类型和种类(是1.44M A 盘?)并保存其设备号于root_dev(引导块的0x508 地址处),最后长跳转到setup 程序的开始处(0x90200)执行setup 程序。 setup.s 程序 功能描述 setup 程序的作用主要是利用ROM BIOS 中断读取机器系统数据,并将这些数据保存到0x90000 开始的位置(覆盖掉了bootsect 程序所在的地方)。内核相关程序使用这些参数将。 然后setup 程序将system 模块从0x10000-0x8ffff(当时认为内核系统模块system 的长度不会超过此值:512KB)整块向下移动到内存绝对地址0x00000 处。接下来加载中断描述符表寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20 地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20 - 0x2f。最后设置CPU 的控制寄存器CR0(也称机器状态字),从而进入32 位保护模式运行,并跳转到位于

文档评论(0)

1789811832 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档