操作系统实战45讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
新⼈⾸单¥59.9
2816 人已学习
课程目录
已更新 3 讲 / 共 45 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学写一个操作系统?
免费
尝尝鲜:从一个Hello到另一个Hello (2讲)
01 | 程序的运行过程:从代码到机器运行
02 | 几行汇编几行C:实现一个最简单的内核
操作系统实战45讲
15
15
1.0x
00:00/00:00
登录|注册

02 | 几行汇编几行C:实现一个最简单的内核

LMOS 2021-05-12
你好,我是 LMOS。
我们知道,在学习许多编程语言一开始的时候,都有一段用其语言编写的经典程序——Hello World。这不过是某一操作系统平台之上的应用程序,却心高气傲地问候世界。
而我们学习操作系统的时候,那么也不妨撇开其它现有的操作系统,基于硬件,写一个最小的操作系统——Hello OS,先练练手、热热身,直观感受一下。

PC 机的引导流程

看标题就知道,写操作系统要用汇编和 C 语言,尽管这个 Hello OS 很小,但也要用到两种编程语言。其实,现有的商业操作系统都是用这两种语言开发出来的。
先不用害怕,Hello OS 的代码量很少。
其实,我们也不打算从 PC 的引导程序开始写起,原因是目前我们的知识储备还不够,所以先借用一下 GRUB 引导程序,只要我们的 PC 机上安装了 Ubuntu Linux 操作系统,GRUB 就已经存在了。这会大大降低我们开始的难度,也不至于打消你的热情。
那在写 Hello OS 之前,我们先要搞清楚 Hello OS 的引导流程,如下图所示:
Hello OS引导流程图
简单解释一下,PC 机 BIOS 固件是固化在 PC 机主板上的 ROM 芯片中的,掉电也能保存,PC 机上电后的第一条指令就是 BIOS 固件中的,它负责检测和初始化 CPU、内存及主板平台,然后加载引导设备(大概率是硬盘)中的第一个扇区数据,到 0x7c00 地址开始的内存空间,再接着跳转到 0x7c00 处执行指令,在我们这里的情况下就是 GRUB 引导程序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《操作系统实战45讲》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥59.9
立即订阅
登录 后留言

精选留言(12)

  • 云师兄
    置顶
    终于看到操作系统从无到有的过程了!简直是完美啊!
    2021-05-12
  • 杨军
    老师讲的详细,醍醐灌顶,后面会将如何用QEMU BOSCH之类的模拟器运行OS内容吗 ?
    2021-05-12
    2
  • 尼欧
    打卡
    2021-05-12
    1
  • 平凡
    介绍得好清楚详细
    2021-05-12
    1
  • 3.141516
    … 在很多语言中是可变参数。在函数调用使用堆栈的前提下,参数的提取是从后往前。所以可以通过第一个参数的地址,拿到后续参数。

    不过这里 main 函数中 printf 只有一个传参,printf 实现中也没用到。感觉可能是后续扩充代码使用的。
    2021-05-12
    1
  • 锟斤拷
    HelloOS中,文件系统模块是哪来的?
    2021-05-12
    1
  • Fan

    2021-05-12
    1
    1
  • Mr.GGLS
    老师,请问这对操作系统的版本高低有要求吗(Ubuntu我安装了10.0.4版),或者不同版本呢(我用的CentOS和Manjaro) : )
    2021-05-12
  • blentle
    老师,这里的0x7c00是不是实际物理内存地址,这个时候虚拟内存和物理内存是不是还没有做map
    2021-05-12
    1
  • 不记年
    老师你好,是因为c需要编译出来的汇编做不了硬件的一些配置所以才需要在一开始的时候用汇编吗
    2021-05-12
    2
  • 小叶
    printf后面的形参,可用于扩展,比如格式化操作。例如 printf("error msg: %s","Out Of Memorry")
    2021-05-12
  • pedro
    先回答一下问题,...是GCC支持的变长参数,但目前printf这个函数并未使用变长参数,后面应该是结合format字符串来实现自己的printf函数达到与标准库中的一致。
    2021-05-12
收起评论
12
返回
顶部