linux0.11学习全记录

来源:互联网 发布:天刀脸型数据怎么捏好 编辑:程序博客网 时间:2024/04/27 01:46
一个基本的linux系统有两部分构成:
内核映像文件,根文件系统。
内核映像文件是用linux的原代码编译成的,由三部分构成:bootsect,setup,system.

具体方法是对 boot/中的 bootsect.s、setup.s 使用 8086 汇编器
进行编译,分别生成各自的执行模块。再对源代码中的其它所有程序(head,main,kernel,mm,fs,lib)使用 GNU 的编译器 gcc/gas 进行编译,并连接成模块 system。然后使用 build 工具将这三块组合成一个内核映象文件 image.

其中 bootsect.s 代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0 磁道(柱面) ,0磁头,第 1 个扇区)

该内核映象文件 image被写入启动盘。

启动的时候,当 PC 的电源打开后,80x86 结构的
CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-BIOS 中的
地址。PC 机的 BIOS 将执行某些系统的检测,并在物理地址 0 处开始初始化中断向量。此后,它将可启
动设备的第一个扇区(磁盘引导扇区,512 字节)读入内存绝对地址 0x7C00 处,并跳转到这个地方。启
动设备通常是软驱或是硬盘。

即:BIOS 将bootsect读入内存绝对地址 0x7C00 处。



总结:
  在引导加载程序 bootsect.s 将 setup.s 代码和 system 模块加载到内存中,并且分别把自己和 setup.s 代
码移动到物理内存 0x90000 和 0x90200 处后,就把执行权交给了 setup 程序。其中 system 模块的首部包
含有 head.s 代码。
  setup 程序的主要作用是利用 ROM BIOS 的中断程序获取机器的一些基本参数,并保存在 0x90000
开始的内存块中,    供后面程序使用。     同时把 system 模块往下移动到物理地址 0x00000 开始处, 这样,
                                                               system
中的 head.s 代码就处在 0x00000 开始处了。然后加载描述符表基地址到描述符表寄存器中,为进行 32
位保护模式下的运行作好准备。         接下来对中断控制硬件进行重新设置,        最后通过设置机器控制寄存器 CR0
并跳转到 system 模块的 head.s 代码开始处,使 CPU 进入 32 位保护模式下运行。
  Head.s 代码的主要作用是初步初始化中断描述符表中的 256 项门描述符,           检查 A20 地址线是否已经
打开,测试系统是否含有数学协处理器。然后初始化内存页目录表,为内存的分页管理作好准备工作。
最后跳转到 system 模块中的初始化程序 init.c 中继续执行。