手搓操作系统

可能每个软件开发工程师都有深入探究操作系统的冲动。

GIT链接

在最初的设计中,我想尽量避开汇编,用最少的汇编代码写必要的部分,剩下能c尽c。

为什么这条路行不通呢

  • 处理器必须会从16位一路切换模式最终跑在64位下,这就意味着要用gcc编译c能跑在16位。这就立马衍生两个问题
    • gcc的交叉编译,我在github倒是找到一个ia16的交叉编译器,项目太过久远,特性支持有限。
    • 链接,需要跟引导扇区的boot代码联合,跨段调用和跨段跳转没有解决
  • 汇编/c联合编程互相调用的参数压栈协议在交叉编译器下只支持near call

上面的问题导致还没进行到16位实模式向32位保护模式切换就夭折了。其实这也说明大牛的工程选择一定是通过验证的,linux从boot到loader,再到kernel中一小部分都是汇编。

之前已经简单看过了linux源码linux-0x00-源码编译,这次真正照着资料和教程实现内核在屏幕上打印HELLO WORLD,体验和收获截然不同,或多或少都会对操作系统有更深的理解。

关于项目的考量规划和学习到的点有哪些

  • 项目的开发环境是docker,防止pc/编译器/版本不同带来后期成本
  • 处理器模式的切换
    • 16位实模式切32位保护模式
    • 16位实模式切32位Big-Real-Mode
    • 32位保护模式切64位IA-32e长模式
  • 逻辑地址 vs 物理地址
    • 实模式下的逻辑地址
    • 保护模式下的逻辑地址
    • 长模式下的虚拟地址
  • GDT内存布局和段描述符
  • 段选择子
  • 分页机制的工作原理
    • 页表跟页表项
    • 页表内存映射规划
    • 多级页表
      • 3级页表
      • 4级页表
  • 汇编/c联合编程实现打印

手搓操作系统
https://bannirui.github.io/2025/09/23/Linux/手搓操作系统/
作者
dingrui
发布于
2025年9月23日
许可协议