1.2.3 加载第三部分代码—system模块(2)
2015-10-03 07:56
363 查看
1.2.3 加载第三部分代码—system模块(2)
现在,bootsect程序的任务都已经完成!
下面要通过执行“jmpi 0, SETUPSEG”这行语句跳转至0x90200处,就是前面讲过的第二批程序—setup程序加载的位置。CS:IP指向setup程序的第一条指令,意味着由setup程序接着bootsect程序继续执行。图1-14形象地描述了跳转到setup程序后的起始状态,对应的代码如下:
setup程序现在开始执行。它做的第一件事请就是利用BIOS提供的中断服务程序从设备上提取内核运行所需的机器系统数据,其中包括光标位置和显示页面等数据,并分别从中断向量0x41和0x46向量值所指的内存地址处获取硬盘参数表1和硬盘参数表2,把它们存放在0x9000:0x0080和0x9000:0x0090处。
这些机器系统数据被加载到内存的0x90000~0x901FC位置,图1-15标出了其内容及准确的位置。这些数据将在以后main函数执行时发挥重要作用。
提取机器系统数据的具体代码如下:
这段代码大约70行,由于篇幅限制,我们省略了大部分代码。
注意,BIOS提取的机器系统数据将覆盖bootsect程序所在的部分区域。由于这些数据是要留用的,因此在它们失去使用价值之前,一定不能被覆盖掉。
点评
机器系统数据所占的内存空间为0x90000~0x901FD,共510个字节,即原来的bootsect只有2字节未被覆盖。可见,操作系统对内存的使用是非常严谨的。在空间上,操作系统对内存严格按需使用,要加载的数据刚好占用一个扇区的位置(只差2字节),而启动扇区bootsect又恰好是一个扇区,内存的使用规划像一个账本,前后对应;在时间上,使用完毕的空间立即挪作他用,启动扇区bootsect程序刚结束其使命,执行setup时立刻就将其用数据覆盖,内存的使用率极高。虽然这与当时的硬件条件有限不无关系,但这种严谨的内存规划风格是很值得学习的。
到此为止,操作系统内核程序的加载工作已经完成。接下来的操作对Linux 0.11而言具有战略意义,系统通过已经加载到内存中的代码,将实现从实模式到保护模式的转变,使Linux 0.11真正成为“现代”操作系统。
现在,bootsect程序的任务都已经完成!
下面要通过执行“jmpi 0, SETUPSEG”这行语句跳转至0x90200处,就是前面讲过的第二批程序—setup程序加载的位置。CS:IP指向setup程序的第一条指令,意味着由setup程序接着bootsect程序继续执行。图1-14形象地描述了跳转到setup程序后的起始状态,对应的代码如下:
//代码路径:boot/bootsect.s jmpi 0, SETUPSEG
图1-14 setup开始执行 |
这些机器系统数据被加载到内存的0x90000~0x901FC位置,图1-15标出了其内容及准确的位置。这些数据将在以后main函数执行时发挥重要作用。
提取机器系统数据的具体代码如下:
//代码路径:boot/setup.s mov ax, #INITSEG ! this is done in bootsect already, but... mov ds, ax mov ah, #0x03 ! read cursor pos xor bh, bh int 0x10 ! save it in known place, con_init fetches mov [0],dx ! it from 0x90000. ! Get memory size (extended mem, kB) mov ah, #0x88 int 0x15 mov [2], ax … … mov cx, #0x10 mov ax, #0x00 rep stosb
这段代码大约70行,由于篇幅限制,我们省略了大部分代码。
图1-15 加载机器系统数据 |
点评
机器系统数据所占的内存空间为0x90000~0x901FD,共510个字节,即原来的bootsect只有2字节未被覆盖。可见,操作系统对内存的使用是非常严谨的。在空间上,操作系统对内存严格按需使用,要加载的数据刚好占用一个扇区的位置(只差2字节),而启动扇区bootsect又恰好是一个扇区,内存的使用规划像一个账本,前后对应;在时间上,使用完毕的空间立即挪作他用,启动扇区bootsect程序刚结束其使命,执行setup时立刻就将其用数据覆盖,内存的使用率极高。虽然这与当时的硬件条件有限不无关系,但这种严谨的内存规划风格是很值得学习的。
到此为止,操作系统内核程序的加载工作已经完成。接下来的操作对Linux 0.11而言具有战略意义,系统通过已经加载到内存中的代码,将实现从实模式到保护模式的转变,使Linux 0.11真正成为“现代”操作系统。
相关文章推荐
- 1.2.3 加载第三部分代码—system模块(1)
- 1.2.2 加载第二部分代码—setup(2)
- 1.2.2 加载第二部分代码—setup(1)
- 1.2.1 加载第一部分代码—引导程序(bootsect)
- Python安全编码与代码审计
- Python语法基础_控制流语句_if、while、for
- java -version javac -version 版本不一致
- PHP学习笔记
- 试用Python+Psycopg操作PostgreSQL
- 那些令人喷饭的代码注释
- 从 PHP 5.4.x 迁移到 PHP 5.5.x
- Python学习笔记<LearnPythonHardWay>
- Python学习笔记<LearnPythonHardWay>
- ThinkPHP3.2.3升级的若干问题和注意事项
- 服务器端编程的十大性能问题
- C++ STL vector assign用法
- C语言快速入门系列-详解
- C#学习之路,学习笔记 2.6 变量的命名规则、常量 及 关键字
- Django后台整合TinyMCE富文本编辑器
- C#学习之路,学习笔记 2.5 +运算符 与 变量的格式化输出