建材企业网站营销怎么做,中国企业500强榜单2021,精品网站欣赏,sns社交网站源码前面两回是把启动区的代码复制来复制去的#xff0c;这里我们要讨论的就是操作系统怎么为程序访问内存的方式做初步规划的#xff1f;
操作系统的代码最开头的 512 字节的数据#xff0c;先从硬盘的启动区移动到了内存 0x7c00 处#xff0c;然后又立刻被移动到 0x90000 处…前面两回是把启动区的代码复制来复制去的这里我们要讨论的就是操作系统怎么为程序访问内存的方式做初步规划的
操作系统的代码最开头的 512 字节的数据先从硬盘的启动区移动到了内存 0x7c00 处然后又立刻被移动到 0x90000 处并且跳转到 0x90000 加上 go 这个标签所代表的偏移量。 接下来就是关注后续的代码
go: mov ax,csmov ds,axmov es,ax
; put stack at 0x9ff00.mov ss,axmov sp,0xFF00 ; arbitrary value 512一眼望去全都是 mov 操作那就很好办了。这段代码的直接意思很容易理解就是把 cs 寄存器的值分别复制给 ds、es 和 ss 寄存器然后又把 0xFF00 给了 sp 寄存器。
回顾CPU寄存器的图解 所以其实操作系统的代码目的性都是非常明确的每一条代码都是为后续做铺垫的你只需要关注它要完成什么事情要理解它们要完成的事情。
这些寄存器是干嘛的 cs 寄存器表示代码段寄存器CPU 即将要执行的代码在内存中的位置就是由 cs:ip 这组寄存器配合指向的其中 cs 是基址ip 是偏移地址。
由于之前执行过一个段间跳转指令还记得不
jmpi go,0x9000这个指令用另一种伪代码表示就是
cs 0x9000
ip go所以现在 cs 寄存器里的值就是 0x9000ip 寄存器里的值是 go 这个标签的偏移地址。那么刚刚说的三个 mov 指令就分别给 ds、es 和 ss 寄存器赋值为了 0x9000也就是 cs 寄存器里的值。
ds 是数据段寄存器作为访问内存数据时的基地址。之前我们说过了当时它被赋值为 0x07c0是因为之前的代码在 0x7c00 处现在代码已经被挪到了 0x90000 处所以现在自然又改赋值为 0x9000 了。
es 是扩展段寄存器先不用理它。
ss 是栈段寄存器后面要配合栈指针寄存器 sp 来表示此时的栈顶地址。而此时 sp 寄存器被赋值为 0xFF00 了所以目前的栈顶地址就是 ss:sp 所指向的地址 0x9FF00 处。 CPU访问内存的三种途径 总结上面的内容就是CPU访问内存有三种途径——访问代码的CS:IP访问数据的ds:xxx以及访问栈的ss:sp。其实就是一个程序分成了不同的段数据段代码段堆栈段。
其中 cs 作为访问指令的代码段寄存器被赋值为了 0x9000。ds 作为访问数据的数据段寄存器也被赋值为了 0x9000。ss 和 sp 作为栈段寄存器和栈指针寄存器分别被赋值为了 0x9000 和 0xFF00由此计算出栈顶地址 ss:sp 为 0x9FF00之后的压栈和出栈操作就以这个栈顶地址为基准。
概括来说这一部分其实就是把代码段寄存器 cs、数据段寄存器 ds、栈段寄存器 ss 和栈指针寄存器 sp 分别设置好了值方便后续使用。
从操作系统的角度来看就是初步规划了内存给程序如何访问代码如何访问数据还有如何访问栈制定了规则。其中访问代码和数据的规划方式就是设置了一个基址访问栈就是设置了栈顶指针指向了一个远离代码位置的地方。 总结
到这里最操作系统最最最基础的准备工作就做好了。
把代码从硬盘移动到内存又从内存移动到另一个地方0x90000。数据段寄存器ds和代码段寄存器cs此时都被设置成了0x9000也就是为了跳转代码和访问内存数据设置了一个内存的基地址以方便代码的编写。栈顶地址被设置成了0x9FF00具体表现为栈段寄存器ss为0x9000栈指针寄存器sp为0xFF00.
现在仅仅是考虑启动区的512字节代码不难想到像BIOS一样操作系统还有很多代码位于硬盘中不能抛下它们不管啊。所以下面就是把仍然在硬盘的操作系统代码“请”到内存中来。