Linux0.11 引导程序Boot学习

原创 2007年10月12日 18:06:00

1          引导启动程序Boot学习

1.1         bootsect.s 程序学习

该程序驻留在启动盘的第一个扇区中,系统上电后会由bios自动加载到0x7c00处,之后它会将自己转移到0x90000处继续执行,之所以移动是为以后的system腾出位置。

    该程序主要完成了三项工作:

    <1> 加载setup模块的2K代码到0x90200处。

    <2> 加载system模块到0x10000

    <3> 确定跟文件系统的所在设备号,如果跟文件系统所在位置没有被明确指定,则通过获取启动盘的每磁道扇区数来确定根文件系统所在设备号。

1.2         setup.s程序学习

该程序驻留在启动盘的25个扇区中,该模块被bootsect加载到了0x90200处(576.5K),长度为2K

该模块主要完成了以下六项工作: 

<1> 通过BIOS中断调用来获取系统参数,包括光标位置,硬盘参数……。该参数表霸占了原来Bootsect模块的位置。即其存在于0x900000x90200的区域。原来bootsect中的根文件系统所在设备号字段(0x901FC—0x901FD)并没有被覆盖掉。获取后的参数表如下:

 

 

 

 

 

注:硬盘参数表的获取足够BT,第一个硬盘参数表的收地址竟然是中断向量0x41的向量值。中断向量0x46的向量值则指向第二个硬盘的参数表首地址。

<2> system模块从0x10000(64K)处,移到0地址处,因为自此以后就不会再用到bios中断调用了。

<3> 加载中断向量表和全局描述符表。中断向量表为一个空表,全局描述附表为一个长度为2K的表,它存在于setup模块的数据段(和代码段重合)中。

<4> 开启A20地址线,让处理器能够访问1M以上的地址空间。

<5> 重新设置8259A芯片,设置外部中断的向量号为0x20—0x2F

<6> 将处理器切换到保护模式、并转向system模块中的head模块运行。

该模块结束后内存中程序的布局如下:

1.3         head.s程序学习

该部分代码驻留在system模块的头部,这也是其称为head的原因。该模块主要完成以

下五方面的工作:

<1> 重新设置系统堆栈,这次将堆栈设置在了user_stack[]的尾端。这已经是第二次设置堆栈了,第一次是在bootseck中。该堆栈将来就被用做了task0task1的用户态堆栈。

<2> 重新设置了IDT表和GDT表,这两个表紧密相连,每个大小为2KIDT表存在与0x5000位置处。IDT表将所有中断门描述符设置为了一同一个处理函数,该函数简单的调用printk来打印一些提示信息而已。GDT表与先前在setup模块中设置的GDT表除了所处位置和内核代码段/数据段的长度不同外没有其它的不同。

<3> 监测A20地址线是否已经成功开启了

<4> 探测数字协处理器是否存在,根据探测结果正确配置CR0中的EM(协处理器仿真位)和MP位(协处理器存在位)。这两个为在任务切换过程中要被参考。

<5> 初始化了公共资源页目录和内核需要使用的4个页表(覆盖16M线性空间)。并初始化了映射关系,使内核的线性地址就等于物理地址。之后开启了分页功能,并转入到main中去执行。

该模块结束后内存布局如下:

 

 

 

 

 

 

 

 

linux环境下编译linux0.11内核

原博客地址  http://itlab.idcquan.com/linux/soft/878778.html  最近在看《linux内核0.11完全注释》一书,由于书中涉及汇编语言的地方众多,本人...
  • DeltaForce_eagle
  • DeltaForce_eagle
  • 2015年11月30日 10:51
  • 1492

Linux 引导启动程序(boot)

主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示。正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式。bootsect.s 和 setup.s 采用近似于 I...
  • njuitjf
  • njuitjf
  • 2014年03月04日 10:49
  • 1301

搭建Linux0.11系统环境

http://sourceforge.net/projects/bochs/files/bochs/2.4/Bochs-2.4.exe/download
  • cmdssd1
  • cmdssd1
  • 2014年09月24日 07:10
  • 2585

Linux-0.11学习总结——引导启动程序部分

Linux-0.11学习总结——引导启动程序部分 1.   BIOS启动 Intel设计CPU开机加电即进入16位的实模式下运行,CS的值预设为0xFFFF,IP的值预设为0x0000,这样CS:...
  • whuheming
  • whuheming
  • 2013年04月04日 22:07
  • 631

linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader

转自:http://www.cnblogs.com/linucos/archive/2012/04/01/2428262.html   直接看代码,即使已经理解了代码,但是还是会有种没有学到手的感...
  • li4850729
  • li4850729
  • 2012年07月18日 14:57
  • 874

linux0.11学习笔记-技术铺垫-简单AB任务切换程序(3)-调试手段和方法

转自:http://www.cnblogs.com/linucos/archive/2012/04/01/2428862.html   写底层代码,我们需要特别的手段去调试,去debug.本文针对...
  • li4850729
  • li4850729
  • 2012年07月18日 15:00
  • 384

从linux0.11学习linux内核设计之程序加载

作者:朱克锋 转载请注明出处:http://blog.csdn.net/linux_zkf   从这篇文章开始我将正式开始分析学习linux,大家一起努力。     Linux0.11的启动...
  • linux_zkf
  • linux_zkf
  • 2012年05月13日 10:23
  • 563

linux0.11学习笔记-技术铺垫-简单AB任务切换程序(2)-可加载执行其他程序的bootloader

转自:http://www.cnblogs.com/linucos/archive/2012/04/01/2428402.html   上篇文章我们完成了一个简单的bootloader,与其说是b...
  • li4850729
  • li4850729
  • 2012年07月18日 14:59
  • 476

阅读linux0.11——boot

linux0.11boot主要分为三个部分,分别在三个程序里面实现,bootsect.s、head.s和setup.s。下面我们简单来分析分析这三个文件。一、bootsect.s这个程序是最先被执行的...
  • sium__
  • sium__
  • 2016年03月16日 18:04
  • 538

linux0.11内核boot分析

1)bootsect.s源码总结bootsect.s编译后的二进制代码存放在磁盘的第一个扇区(引导区),开机启动后会被BIOS加载到内存的0x07c0处,并跳转到0x07c0处执行。下面开始解释程序源...
  • xyls220
  • xyls220
  • 2011年07月25日 22:10
  • 434
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux0.11 引导程序Boot学习
举报原因:
原因补充:

(最多只允许输入30个字)