03|做好访问内存的最基础准备工作
闪客
你好,我是闪客。
这一讲我们要探索的问题是,操作系统是怎么为程序访问内存的方式做初步规划的?
上一讲咱们说到,操作系统的代码最开头的 512 字节的数据,先从硬盘的启动区移动到了内存 0x7c00 处,然后又立刻被移动到 0x90000 处,并且跳转到 0x90000 加上 go 这个标签所代表的偏移量。
那我们接下来,就继续把目光放在 go 这个标签的位置,跟着 CPU 执行的步伐往后看。
一眼望去,全都是 mov 操作,那就很好办了。这段代码的直接意思很容易理解,就是把 cs 寄存器的值分别复制给 ds、es 和 ss 寄存器,然后又把 0xFF00 给了 sp 寄存器。
回顾下 CPU 寄存器的图解:
由此也可以看出,其实操作系统最开始这几行代码的难点并不在翻译,而是在于它要完成什么事情,而要理解它们要完成的事情,就需要计算机体系结构的知识,说白了就是指 Intel CPU 的使用说明。
如果你能把 Intel CPU 手册阅读一遍并且有个大体的认识,那这几行代码就不在话下了。
但对于大部分软件工程师来说,Intel CPU 手册还是过于底层了,所以建议你课后真正花时间去系统了解一下。这里你先听我往下讲就好了,研读 Linux0.11 源码需要用到的核心知识点我都会告诉你。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
操作系统在为程序访问内存做基础准备工作时,首先将代码从硬盘加载到内存中,并设置了代码段寄存器cs的值为0x9000,数据段寄存器ds的值也为0x9000,以便程序访问内存数据。同时,栈段寄存器ss被设置为0x9000,栈指针寄存器sp被设置为0xFF00,确定了栈顶地址为0x9FF00。这些操作为程序访问内存提供了基址和栈顶地址,为后续操作奠定了基础。通过设置这些寄存器的值,操作系统制定了程序访问代码、数据和栈的规则。总的来说,操作系统的基础准备工作就是为程序访问内存制定规则,包括设置基址和栈顶地址。这些工作是操作系统中最基础的准备工作,为程序的后续执行奠定了基础。文章通过讲解CPU访问内存的方式和寄存器的作用,帮助读者理解了操作系统为程序访问内存做的基础准备工作。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- 志豪原文:(ss 和 sp 作为栈段寄存器和栈指针寄存器,分别被赋值为了 0x9000 和 0xFF00,由此计算出栈顶地址 ss:sp 为 0x9FF00) 疑问:0x9000是作为段基址左偏移四位加上偏移地址0xff00才得出的0x9ff00吗?
作者回复: 是的呀,实模式下的物理地址计算方式
2022-11-03归属地:北京27 - 小侠讲解很清晰,和当年DOS下学的MASM汇编很相似
编辑回复: 谢谢,期待你学完第一部分这10讲~
2022-11-07归属地:北京1 - Geek_e5fdb7讲的好,期待后续更新。
作者回复: 会的,五季
2022-11-04归属地:北京 - 永弓虽非常好!清晰明了简洁!
作者回复: 感谢感谢
2022-11-02归属地:北京 - Geek_73c4320x9ff00 应该是说可以是栈顶也可以是栈底,因为这个栈目前没有内容。栈顶地址就是 sp 栈指针寄存器里的值,从高位到低位增长2022-11-10归属地:广东6
- 陈婉仪2024年了,继续催更🙏2024-01-07归属地:广东
- ileruza赶紧更新,我肯定买2022-12-10归属地:广东
- NiceBlueChai为啥不直接从硬盘复制到0x90000,2022-11-14归属地:山东3
- 初心看着真爽2022-11-11归属地:北京
- 二十二桥枫别雨非常好,想催更了2022-11-09归属地:安徽
收起评论