- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux代码导读-基于x86的Linux 2.6.26的启动
Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen@ustc.edu.cn Spring 2009 回顾编译得到的bzImage的结构 Setup.bin+vmlinux.bin(具有自解压能力) 基于I386的Linux的启动 计算机是如何启动的 BIOS 软盘启动 硬盘启动 Grub Lilo 启动协议 特殊的几个地址 BIOS:第一个扇区?0x07c0 第一个扇区的内容是什么? 观察setup.ld 了解第一个扇区的内容 关键: 实模式 保护模式 分页模式 页表 GDT表 IDT表 I386内核从实模式开始运行 首先看一下什么是实模式 实模式是为了兼容早期的CPU而设置的 i386系统总是始于实模式 实模式下 地址总线:20位 内存范围:0~1MB 逻辑地址 = 段地址 + 段内偏移 段地址 = 段寄存器中的值*16 (或左移4位) 段寄存器长度:16bit 段寄存器有: cs/ds/es/fs/gs 保护模式下, 地址总线32位,访存范围为4GB 原来的段寄存器现在被称作段选择子,与GDT表配合使用 GDT表由gdtr指示其位置和长度 使用特殊的指令进行操作:sgdt/lgdt 图示 一般装载gdt和idt之后,要重新装载段寄存器 cs、ds、es、fs、gs cs通常通过一条长跳转指令装载 其他数据段寄存器直接设置 控制寄存器(Control Registers) CR0 CR1 CR2 CR3 CR4(扩展相关,忽略) 与内存相关 CR0 CR0, MSW register (Machine Status Word, 32-bit version) 包含系统控制位,用于控制操作模式和状态 Instruction: lmsw LINUX’ setup.S: movw $1, %ax lmsw %ax jmp flush_instr // why? flush_instr: To turn on the PE-bit (enables protected-mode), CR1、CR2、CR3 CR1:保留 CR2:在缺页异常的时候,记录缺页地址 CR3:记录页目录所在的物理地址和两个标记(PCD PWT) 阅读documentation/i386/boot.txt 对于i386平台,由于一些历史的原因,因此Linux的启动比较复杂 这个文档包含如下内容 1、Linux/i386的启动协议(10个+) 2、内存布局图(大内核,小内核) 3、实模式下的内核头结构(即setup header)以及各参数的解释 4、内核的命令行(command line) 5、实模式代码的内存布局 6、启动配置示例 7、装载Linux的剩余部分 8、特殊的命令行参数 9、运行内核 10、高级启动回调函数 关于其中的一些内容,我们将在合适的时候说明 加载I386内核的内存布局图 zImage/Image的内核加载器所使用的经典的内存布局(1M=0x100000)为 Header.S分析 前512个字节的内容 关于msg_loop输出的字符串 Header.S分析 关于512字节的最后(setup header) Header.S分析 第二个扇区开始 接下来仍然是setup header参数部分,直到start_of_setup start_of_setup 设置堆栈 检查setup中的标签 清除BSS段 调用C入口main Main.c分析 关于go_to_protected_mode 关键 关于protected_mode_jump 关键 进入保护模式 通过设置cr0 进入32位代码 通过一条手工设置的代码 最后进入setup header中指定的code32_start 关于boot_params.hdr.code32_start 对boot_params.hdr的赋值之处:copy_boot_params Hdr的定义之处 code32_start在setup header的第二部分 此处对应于压缩映像的head_32.S 解压缩头中的head_32.S 32位代码 关键1:调用decompress_kernel 关键2:跳转到vmlinux的头head_32.S 阅读此目录下的vmlinux_32.lds 了解入口处的代码 关于解压缩head_32.S中的relocated相关 即“.text”部分 Clear BSS Setup the stack for the decompressor Do t
文档评论(0)