1.2.3 加载第三部分代码—system模块(2)
来源:互联网 发布:和合期货软件下载 编辑:程序博客网 时间:2024/05/17 15:20
1.2.3 加载第三部分代码—system模块(2)
现在,bootsect程序的任务都已经完成!
下面要通过执行“jmpi 0, SETUPSEG”这行语句跳转至0x90200处,就是前面讲过的第二批程序—setup程序加载的位置。CS:IP指向setup程序的第一条指令,意味着由setup程序接着bootsect程序继续执行。图1-14形象地描述了跳转到setup程序后的起始状态,对应的代码如下:
图1-14 setup开始执行
- //代码路径:boot/bootsect.s
- jmpi 0, SETUPSEG
setup程序现在开始执行。它做的第一件事请就是利用BIOS提供的中断服务程序从设备上提取内核运行所需的机器系统数据,其中包括光标位置和显示页面等数据,并分别从中断向量0x41和0x46向量值所指的内存地址处获取硬盘参数表1和硬盘参数表2,把它们存放在0x9000:0x0080和0x9000:0x0090处。
这些机器系统数据被加载到内存的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 加载机器系统数据注意,BIOS提取的机器系统数据将覆盖bootsect程序所在的部分区域。由于这些数据是要留用的,因此在它们失去使用价值之前,一定不能被覆盖掉。
点评
机器系统数据所占的内存空间为0x90000~0x901FD,共510个字节,即原来的bootsect只有2字节未被覆盖。可见,操作系统对内存的使用是非常严谨的。在空间上,操作系统对内存严格按需使用,要加载的数据刚好占用一个扇区的位置(只差2字节),而启动扇区bootsect又恰好是一个扇区,内存的使用规划像一个账本,前后对应;在时间上,使用完毕的空间立即挪作他用,启动扇区bootsect程序刚结束其使命,执行setup时立刻就将其用数据覆盖,内存的使用率极高。虽然这与当时的硬件条件有限不无关系,但这种严谨的内存规划风格是很值得学习的。
到此为止,操作系统内核程序的加载工作已经完成。接下来的操作对Linux 0.11而言具有战略意义,系统通过已经加载到内存中的代码,将实现从实模式到保护模式的转变,使Linux 0.11真正成为“现代”操作系统。
- 1.2.3 加载第三部分代码—system模块(2)
- 1.2.3 加载第三部分代码—system模块(1)
- 1.2.2 加载第二部分代码—setup(2)
- 1.2.2 加载第二部分代码—setup(1)
- 代码大全——第三部分
- 1.2.1 加载第一部分代码—引导程序(bootsect)
- 模块加载过程代码分析2
- 模块加载过程代码分析2
- 编写netfilter模块 第三部分 Netfilter核心
- 内核模块(3)模块加载
- 【算法导论(第三版)】第二章部分习题代码
- 【算法导论(第三版)】第四章部分习题代码
- PX4FLOW光流模块DIY(含部分代码讲解)
- 【Ubuntu】自动加载第三方ko模块
- Ubuntu 自动加载第三方ko模块
- Struts 2与AJAX(第三部分)
- Struts 2与AJAX(第三部分)
- Struts 2与AJAX(第三部分)
- Reverse Integer
- 实时系统的基本特性?
- CodeForces 3A Shortest path of the king(贪心)——Codeforces Beta Round #3
- 1.2.2 加载第二部分代码—setup(2)
- 1.2.3 加载第三部分代码—system模块(1)
- 1.2.3 加载第三部分代码—system模块(2)
- Learning Spark 第四章 处理键值对 已翻译整理完毕,PDF可下载
- 1.3.1 关中断并将system移动到内存地址起始位置0x00000
- C/C++堆区、栈区、常量区、静态数据区、代码区详解
- Obj-C中内存的管理一瞥
- CodeForces 581A Vasya the Hipster(简单题)——Codeforces Beta Round #322 (Div. 2)
- 看一眼凌晨四点的哈佛,就会明白中国缺什么
- Servlet 要点总结
- NAND FLASH大页和小页