04 操作系统怎么把自己从硬盘搬运到内存?
你好,我是闪客。
上一讲,咱们说过了为访问内存,操作系统做的最最基础的准备工作。这一讲,我们要讨论的问题是,操作系统是怎么把在硬盘中的自己搬运到内存中来的。

如上图所示,此时操作系统用短短几行代码,将数据段寄存器 ds 和代码段寄存器 cs 设置为了 0x9000,方便之后程序访问代码和数据。并且,将栈顶地址 ss:sp 设置在了离代码的位置 0x9000 足够遥远的 0x9FF00,保证栈向下发展不会轻易覆盖掉已有的代码。
简单说,就是设置了如何访问数据的数据段,如何访问代码的代码段,以及如何访问栈的栈顶指针,也即初步做了一次内存规划。从 CPU 的角度看,访问内存就这么三块地方而已。

做好这些基础工作后,接下来又到了新一翻的“折腾”。上一讲结尾说过,我们目前仅仅把硬盘中最开始的 512 字节加载到内存中了,但操作系统还有很多代码仍然在硬盘的其他扇区里,不能抛下他们不管呀。
把剩下的操作系统代码从硬盘请到内存
所以下一步,自然是把仍然在硬盘里的操作系统代码请到内存中来。
我们接着往下看代码:
load_setup:
mov dx,#0x0000 ; drive 0, head 0
mov cx,#0x0002 ; sector 2, track 0
mov bx,#0x0200 ; address = 512, in 0x9000
mov ax,#0x0200+4 ; service 2, nr of sectors
int 0x13 ; read it
jnc ok_load_setup ; ok - continue
mov dx,#0x0000
mov ax,#0x0000 ; reset the diskette
int 0x13
jmp load_setup
ok_load_setup:
...