04|操作系统怎么把自己从硬盘搬运到内存?
闪客
你好,我是闪客。
上一讲,咱们说过了为访问内存,操作系统做的最最基础的准备工作。这一讲,我们要讨论的问题是,操作系统是怎么把在硬盘中的自己搬运到内存中来的。
如上图所示,此时操作系统用短短几行代码,将数据段寄存器 ds 和代码段寄存器 cs 设置为了 0x9000,方便之后程序访问代码和数据。并且,将栈顶地址 ss:sp 设置在了离代码的位置 0x9000 足够遥远的 0x9FF00,保证栈向下发展不会轻易覆盖掉已有的代码。
简单说,就是设置了如何访问数据的数据段,如何访问代码的代码段,以及如何访问栈的栈顶指针,也即初步做了一次内存规划。从 CPU 的角度看,访问内存就这么三块地方而已。
做好这些基础工作后,接下来又到了新一翻的“折腾”。上一讲结尾说过,我们目前仅仅把硬盘中最开始的 512 字节加载到内存中了,但操作系统还有很多代码仍然在硬盘的其他扇区里,不能抛下他们不管呀。
把剩下的操作系统代码从硬盘请到内存
所以下一步,自然是把仍然在硬盘里的操作系统代码请到内存中来。
我们接着往下看代码:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了操作系统如何将自身从硬盘加载到内存的过程,以及Linux 0.11的编译和加载简要过程。通过设置数据段寄存器、代码段寄存器和栈顶指针进行内存规划,并通过中断程序将硬盘中的操作系统代码加载到内存中。整个操作系统的编译过程通过Makefile和build.c完成,最终将bootsect.s编译成bootsect放在硬盘的1扇区,将setup.s编译成setup放在硬盘的2~5扇区,将剩下的代码编译并链接成system,放在硬盘的随后240个扇区。这一过程需要小心翼翼地规划每一步的跳转和数据访问,但也让人完全了解每一步的设计和规划。整个过程揭示了操作系统工作内幕,让人珍惜这个阶段。文章内容生动有趣,深入浅出地介绍了操作系统加载到内存的过程,适合读者快速了解操作系统的概览。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(18)
- 最新
- 精选
- Tokamak老师,请问一下,我应该去哪儿找 int 0x13, int 0x10 这些中断命令的参数解释呢?
作者回复: bios 中断看 bios 手册,Intel 中断看 Intel 手册
2022-11-21归属地:北京5 - xueerfei007精彩,请问下240个扇区怎么装的下那么大的操作系统代码呢?装不下了怎么办呢。
作者回复: Linux 0.11 足够了,这个数字不重要,你看后面的版本演进,syssize 这个变量在不断变大,因为操作系统不断变大。
2022-11-03归属地:北京4 - Maverick操作系统启动区加载到内存后,为什么要先加载4个扇区,如果成功后再加载剩余的240个扇区?为什么不能直接将这总计4+240=244个扇区一次性加载到内存中呢?
作者回复: 也可以,不是必须的
2022-11-09归属地:北京2 - wong ka seng你好,请问是不是整个操作系统不能大于栈顶所指的位置?
作者回复: 既是也不是,后面栈的位置还会变的,预留出一块空间给栈就行
2022-11-11归属地:北京 - Linuxer写得很棒!期待后面的内容
编辑回复: 感谢支持哦
2022-11-05归属地:北京 - miraclezhb在 ok_load_setup 标签中调用了 read_it 。请问这个 read_it 是在哪里定义的?
作者回复: 看源码,就在后面
2022-11-04归属地:北京 - 罗辑思维非常好的文章,非科班出身的人更懂初学者。2023-01-24归属地:福建7
- 灯盖操作系统代码启动了,就可以自己搬运代码,然后跳转,执行自己搬运的代码-(搬运-执行-搬运-执行)2023-02-20归属地:北京2
- Camio1945我用 bochs 调试代码,在以下这两个地方打了断点: 0x90119 处,对应 bootsect.asm 的 read_track 的 int 0x13 ,既调用 bios 从硬盘加载数据到内存之前,在这里记录下了每一个 al 寄存器的值; 0x90091 处,对应 bootsect.asm 的 jmp SETUPSEG:0,既跳转到 setup 代码之前. 0x90119 断点一共执行了 24 次,全部 al 的值转换成十进制如下:13+18+18+18+18+18+18+7+11+18+18+18+18+18+18+9+9+18+18+18+18+18+18+11=384 也就是说,实际加载了 384 个扇区的数据,而不是 240 个。 我想知道是哪里出问题了。请问文中的 240 是怎么来的?2023-06-27归属地:湖北11
- 李文趋磁头、柱面、扇区是机械硬盘的空间划分方式,如果是固态硬盘也是这样分吗?2023-02-16归属地:福建1
收起评论