Linux0.11 源码趣读
闪客
低并发编程公号作者
18650 人已学习
赠一得一
课程目录
已完结/共 22 讲
Linux0.11 源码趣读
15
15
1.0x
00:00/00:00
登录|注册

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:
...
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
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归属地:湖北
    1
    1
  • 李文趋
    磁头、柱面、扇区是机械硬盘的空间划分方式,如果是固态硬盘也是这样分吗?
    2023-02-16归属地:福建
    1
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部