



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这篇文章的目的 在将 linuxkernel 的 boot 部份做一个介绍 因为笔者觉得很少有这样的文章介绍一个 作业系统最最开始的一步 把 kernel 本身载入至内存中 同时进行一些机器相关 machinedependent 的初始化工作 由于 linux 刚好使用的是大家最熟悉的 386 486 系列 PC 所以在说明其程序流程时 也刚好可以对其相关的 PC 硬体架构做探讨 可以说是一举两得 不过 我必须假设读者对于组合语言及 PC 最基础的架构 如寄存器 分段 分页 中断服务等有大概的认识 读者可在 linuxsourcecode 的 boot 子目录下找到几个以 S 作为副档名的组合语言档 本文要说明 的即是其中的 bootsect S 及 setup S 两个档案 及尽量简单的说明其所牵涉的相关硬体部份 bootsect S 这个程序是 linuxkernel 的第一个程序 包括了 linux 自己的 bootstrap 程序 但是在说明这个程 序前 必须先说明一般 IBMPC 开机时的动作 此处的开机是指 打开 PC 的电源 一般 PC 在电源一开时 是由内存中地址 FFFF 0000 开始执行 这个地址一定在 ROMBIOS 中 ROMBIOS 一般是在 FEOOOh 到 FFFFFh 中 而此处的内容则是一个 jump 指令 jump 到另一个位 于 ROMBIOS 中的位置 开始执行一系列的动作 包括了检查 RAM keyboard 显示器 软硬磁盘等 等 这些动作是由系统测试码 systemtestcode 来执行的 随着制作 BIOS 厂商的不同而会有些许差异 但都是大同小异 读者可自行观察自家机器开机时 萤幕上所显示的检查讯息 紧接着系统测试码之后 控制权会转移给 ROM 中的启动程序 ROMbootstraproutine 这个程序 会将磁盘上的零道零扇区读入内存中 这就是一般所谓的 bootsector 如果你曾接触过电脑病毒 就大概 听过它的大名 至于被读到内存的哪里呢 绝对位置 07C0 0000 即 07C00h 处 这是 IBM 系列 PC 的特性 而位在 linux 开机磁盘的 bootsector 上的正是 linux 的 bootsect 程序 也就是说 bootsect 是第一个被读入内存中并执行的程序 现在 我们可以开始来看看到底 bootsect 做了什么 第一步 首先 bootsect 将它 自己 从被 ROMBIOS 载入的绝对地址 0 x7C00 处搬到 0 x90000 处 然后利 用一个 jmpi jumpindirectly 的指令 跳到新位置的 jmpi 的下一行去执行 关键的 assemblycode 如 下 搬移 bootsect 本身 jmpigo INITSEC go 表示将跳到 CS 为 0 x9000 IP 为 offset go 的位置 CS IP 0 x9000 offsetgo 其中 INITSEC 0 x9000 定义于程序开头的部份 而 go 这个 label 则恰好是下一行指令所在的位置 第二步 接着 将其它 segmentregisters 包括 DS ES SS 都指向 0 x9000 这个位置 与 CS 看齐 另外 将 SP 及 DX 指向一任意位移地址 offset 这个地址等一下会用来存放磁盘参数表 diskpara metertable 提到磁盘参数表 就必须提到 BIOS 中断 1Eh 先简单的介绍一下 BIOS 的中断服务 80 x86 将内存 最低的 256 4byte 保留给 256 个中断向量 每个 interruptvector 大小为 4byte 所以一共有 256 4 1024byte 而其中的第 1Eh 个向量指向 磁盘参数表 这个表会告诉电脑如何去读取磁盘机 而我们所要做的事是搬移磁盘参数表到刚才所设定的任意地址 接着 改变搬移来的参数表的参数 以符合我们的需要 再将中断向量 1Eh 指向我们所修改过的磁 盘参数表 然后呼叫 BIOSinterrupt 的 int13h function0 即 AH 0 重置磁盘控制卡及磁盘驱动器 之后磁盘机就会照我们的意思动作了 如果你曾 trace 过 DOS 的 kernel 你会发现 上述的动作在 DOS 中也有类似的对应流程 现在让我们来看看关键的程序码 push 0 popfs movbx 0 x78 使 GS SI FS BX 指向磁盘参数表 再将 GS SI 所指地址的内容搬移 6 个 word 至 ES DI 所指的地址 此段程序是将 FS BX 调整成 0000 0078 接着再将 GS SI 的内容设成与 FS BX 相同 此处 0 x78h 即为 int1Eh 的起始位置 7 16 8 120 1 16 14 4 120 调整 ES DI 为刚才所设定的任 意地址 从 GS SI 搬移 6 个 word 即 12byte 到 ES DI 所指的位置 显然磁盘参数表的长度就是 6 个 word 不过事实上 磁盘参数表的确实长度是 11 个 byte 关于磁盘参数表 有兴趣的读者可自行参 阅讲述 BIOSinterruptservices 的技术手册 会有详细的说明 读者可以用 debug 自行观察自家机器上 DOS 的磁盘参数表的起始位置 即 int1Eh 的内容 以下是 笔者机器的情形 笔者使用的作业系统是 MSDOS6 2 C debug d0000 0000 0000 00008A101601F4067000 1600CB04F4067000 p p 0000 0010F40670000301790E 43EB00F0EBEA00F0 p y C 0000 002004108E340C118E34 5700CB046F00CB04 4 4W o 0000 00308700CB0408079433 B700CB04F4067000 3 p 0000 00400C01790E4DF800F0 41F800F0BA165F06 y M A 0000 005039E700F01B01790E 70118E341201790E9 y p 4 y 0000 006000E000F085175F06 6EFE00F0EE067000 n p 0000 007053FF00F0A4F000F0 220500003E4600C0S F 由上图中可知 在 DOS 中磁盘参数表的起始位置 int1Eh 的内容 为 0000 0522 接着观察 DOS 中位 置 0000 0522 开始的 11 个 byte 也就是磁盘参数表的内容 C debug d0000 0520l10 0000 05204D53DF022502121B FF54F60F08000000MS T 此 11byte 即为磁盘参数表的内容 分别是 byte00h 到 0Ah 在程序中我们所更动的是第五个 byte byte04h 改为 18h 在上图例子中为 12h 这个 byte 的 功能是定义磁轨上一个磁区的资料笔数 关键的程序码如下 movb4 di 18 第 3 步 接着利用 BIOS 中断服务 int13h 的第 0 号功能 重置磁盘控制器 使得刚才的设定发挥功能 xor ah ah ah 置 0 xor dl dl dl 置 0 int 0 x13 第四步 完成重置磁盘控制器之后 bootsect 就从磁盘上读入紧邻着 bootsect 的 setup 程序 也就是以后 将会介绍的 setup S 此读入动作是利用 BIOS 中断服务 int13h 的第 2 号功能 setup 的 image 将会 读入至程序所指定的内存绝对地址 0 x90200 处 也就是在内存中紧邻着 bootsect 所在的位置 待 setup 的 image 读入内存后 利用 BIOS 中断服务 int13h 的第 8 号功能读取目前磁盘机的参数 第五步 再来 就要读入真正 linux 的 kernel 了 也就是你可以在 linux 的根目录下看到的 vmlinuz 在 读入前 将会先呼叫 BIOS 中断服务 int10h 的第 3 号功能 读取游标位置 之后再呼叫 BIOS 中断服务 int10h 的第 13h 号功能 在萤幕上输出字符串 Loading 这个字符串在 bootlinux 时都会首先被看到 相信大家应该觉得很眼熟吧 linux 的 kernel 将会被读入至内存绝对地址 0 x10000 处 键关的程序码如下 mov ax SYSSEG mov es ax call read it call kill motor 其中 SYSSEG 于程序开头时定义为 0 x1000 先将 ES 内容设为 0 x1000 接着在 read it 这个子 程序便以 ES 为目的地的节地址 将 kernel 读入内存中 至于 read it 子程序的详细内容笔者并不想一 一介绍 不过聪明的读者们应该已经猜到 read it 一定又利用了 BIOSint13h 与磁盘有关的 I O 中断 服务了 至于 kill motor 子程序 它的功能在于停止软盘机的马达 各位聪明的读者会不会觉得这个子程序的 名称取得颇为传神呢 其程序码如下 kill motor push dx mov dx 0 x3f2 xor al al outb pop dx ret 首先利用 DX 指定要输出的 port 而 03f2 这个 port 则是代表了软盘控制器 floppydiskcontroller 的 所在 再利用 outb 将资料送出 而我们送出的资料 当然就是归零过的 AL 了 如此一来 软盘的马达 就停止了 第六步 接下来做的事是检查 rootdevice 之后就仿照一开始的方法 利用 indirectjump 跳至刚刚已读入 的 setup 部份 程序码如下 jmpi0 SETYPSEG 其中 SETUPSEG 已在先前定义为 0 x9020 所以 CS IP 会设定为 9020 0000 即跳到绝对地址为 0 x90200 也就是 setup 的起点 而 bootsect 也大功告成了 到此为止 内存的内容应该如下图所示 比较 把大家所熟知的 MSDOS 与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德州数学新课标考试题及答案
- 天文系考试题目及答案
- 时空量子纠缠-洞察及研究
- 2025年公需科目人工智能与健康试题及答案
- 2025年公需科目考试试题集及答案
- 2025年公需科目《专业技术人员创新能力培养》题库(含答案)
- 2025年高级电工证考试试题含答案
- 系统实施与管理办法
- 人道救助管理办法无锡
- 蜀绣地标保护管理办法
- DB65-T 4762-2023 油田地面工程建设节能技术规范
- 2024-2025 学年度武汉市部分学校高三九月调研考试 物理试卷(含答案)
- 输血治疗中的大数据分析
- DL-T 297-2023 汽轮发电机合金轴瓦超声检测
- 2024-2029年中国红外热像技术在建筑物检测中的应用行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 《福建省建筑工程施工文件管理规程2》
- 幼儿园小班早操活动方案
- 新媒体广告-课件-第三章-新媒体广告伦理与法规
- 关于车的英语原版书
- 产品定制管理制度
- 沙里宁的大赫尔辛基规划
评论
0/150
提交评论