如何开始制作自己的操作系统
Linus 在创作出 linux 0.01 版本的时候也参考了 unix 和 minix,花了很多时间酝酿,并且也是从玩具做起,得势而成。我们也只是为了学习和做玩具。
查看 linux 的维基,我越发觉得应该看一波 linux 0.01 和 0.11 和 2.6 版本的内核源码,but not now。可以实现到了对应模块再去看 linux 对应模块的发展过程。
dchgOS
我们参考《一个 64 位操作系统的设计与实现》(实现一个类 linux 操作系统),细读,一步步看代码、实现。2015 年的书,技术是 2012 年的技术,至少比《30 天自制操作系统》新。之前已经略看完了后者,接下来细品前者。为了实现和完善 dchgOS,必然要看很多书,很多博客。首先完成一个雏形,然后广泛交流。
《一个 64 位操作系统的设计与实现》是基于 IA-32e 体系架构的,IA-32e 这个概念可以在 Intel 手册里查到。Intel IA-32 手册
cpu 架构
复杂指令集 i386(x86)x86_64
精简指令集 risc-v、amd
从常见的 cpu 评测可以知道精简指令集的能耗是远远超越复杂指令集的,典型就是苹果芯片和红蓝两家的对比。
指令集架构就是指 cpu 架构。不同指令集的 cpu 有不同的工作模式。
我们熟悉的是 intel 的实模式到保护模式到 64 位模式(IA-32e)的转换过程,armv8 与之对应 也有 aarch32 和 aarch 64 的执行模式。在编写、编译和封装操作系统镜像时对于不同的 cpu 架构必然需要采用不同的实现。
我们手上的 intel 酷睿 cpu 写着是 64 位的指令集,具体就是 x86_64(IA-32指令集的拓展)。intel 的 IA-64 指令集是在面向服务器的安腾处理器上的。amd64、x86_64、x64、intel64 都可以使用相同的软件。但是 IA-64 由于是不同指令集,所以不能使用相同编译的软件。
archlinux 只支持 x86_64 架构/平台。因而想要在 mac 真机上安装 archlinux,除非重新编写,不然只能使用虚拟机,使用虚拟机模拟对应的硬件指令集。南大的计算机组成原理课程就是因此要介绍指令集架构,以为实现类 qemu 虚拟机做铺垫,但是他貌似没讲为什么要讲这个。
自制操作系统?
网上有很多博客,都想做一个操作系统。很多都是在用汇编写了个 bootloader 之后就没有继续写下去了。也有写出社区,写成教学辅助操作系统的。对于我自己来说,我想让我自己的操作系统变成一个我自己的永不完结的冒险。
更现实一点的话,应该去学习嵌入式操作系统和在 linux 内核基础上做修改。
阅读《一个 64 位操作系统的设计与实现》
《一个 64 位操作系统的设计与实现》的第一章和第二章主要讲理论基础。
包括汇编调用 C 语言函数、C 语言(GNU C)内嵌汇编语言、GNU C 对 C 的拓展等等,讲的不深,还是需要自己深入查资料。
第一章操作系统的基本构成讲了会实现哪些模块,一个操作系统内核的代码主要包含哪些部分,讲的比较全面。
第二章 配置开发环境。bochs支持设置断点、查看内存、查看寄存器状态、反汇编内存代码。安装 nasm 汇编器。
不同的汇编器,有不同的汇编语法和不同格式的汇编语言文件。
gcc 中集成的 as GAS汇编语言编译器可以用于编译 AT&T 格式的汇编语言,编译成目标文件。gcc -S 产生的汇编文件是 AT&T 格式的。
nasm 则用于编译 Intel 格式的汇编语言,也就是 i386 采用的汇编语言格式,能在 dos 上运行。masm 主要用于 windows pe 格式的可执行文件,而 nasm 则支持多平台,pe 和 elf 都行。
不同汇编器编译出的目标文件是可以进行连接的。
第三章开始将代码实现,目前我们就做了一个 boot 实验,dchgOS 的第一步。也是网上大多数自制操作系统博客的终点。
使用 objdump 反汇编,学习汇编。使用 bochs 简单启动一个软盘 boot 程序,配置 bochs,汇编 bios 中断 int 10h 实现清屏、设置光标、显示字符串,查看 bios int 10h 功能表,主功能号。Intel 处理器是小端模式存储数据,dw 0xaa55 是引导区汇编代码的结尾。等等等等,看书吧。
关于 bootloader 的程序,我们实现 bootloader 模块的雏形之后再来仔细讲,现在我们只能复述书上的内容。现在我们欠下两篇博客了(archlinux 安装详解和这里的一篇),写博客真是挖坑填坑的过程,创作想必就是如此这般。
碎碎念
系统调用 和 api 的区别?
所谓的 posix 标准是针对 c 库函数的吗?
系统调用 system call 的实现,之后会做实验。
系统函数库就是 api,但不是指 system call。system call 是一种中断,中断号为 int 0x80(x86 cpu)。系统调用会调用内核的代码,而系统函数调用系统调用。不同操作系统的系统函数的之间的一种统一标准是 posix 标准,保证系统函数的标准一致有益于平台之间的代码移植。
glibc 是 linux(GNU)的系统函数库,当然也可以有其它语言的系统函数库。glibc 兼容 posix 标准,是 posix 的超集。
api 通常用于描述函数接口,web 前后端接口也会用 api 这个词,容易产生混淆。应该在做项目的过程中去区分,而不是从概念上玩文字记忆区分游戏。
这个话题取自这个关于 Cygwin 的博客
我还没有看完这个系列,看完后我会简单说说想法总结下。
除了这个博客,我最近在周末还暗中观察了中国科学技术大学 Linux 用户协会的官方网站。很羡慕这样子的社团,每周有技术小聚,大家来分享自己学到的东西。不过有些板块很久没有更新了,看来写博客还是一个人的事,类论坛的形式实际上还是创作者模式,关于论坛模式的衰败之前阮一峰有讨论过,要是有什么方法能让知识分享社区以更轻松的形式存在就好了。
从该网站我也获取到了一些待办事项
- linux 内核模块编写
- 火焰图理解与使用 perf stat,评价一个程序的性能是个大话题。
- 使用 dmesg 查看系统日志
- LLVM IR 的了解
- 参考 LUG USTC 使用 Ruby jekyll 构建静态博客。
从 LUG USTC 的 linux 生存手册中观察中科大的部分课程安排,发现有些课是先进的,有些课也和我校一样要求奇怪的内容,但是大部分还是有比较大的差距的。看到了一些使用 wine 和 crossover 的使用,或许我们可以尝试运行一些游戏试试玩玩。
经常在外网课里看到 slides 这个词,演示文稿,国内就直接叫后缀 ppt。体现了国内计算机发展的滞后性和大众计算机常识的缺乏。
我的 archlinux 滚挂了
本来想更换 archlinux 的 linux 内核,按照教程走的,结果没有换成功。但是并不是因为这个滚挂了。
archlinux 提供了 linux、linux-zen、linux-lts、linux-hardened 内核版本,安装之后可以在引导启动界面更换内核。
sudo pacman -S linux-zen linux-zen-headers
zen 版本性能好,lts 版本比较稳定,hardened 版本更安全,原版更纯。
更新 grub 引导配置
sudo grub-mkconfig -o /boot/grub/grub.cfg
此方法无效……可能的原因是 btrfs 文件系统与 grub 的冲突、uefi 启动方式需要使用 efibootmgr 更新 UEFI 引导项……(教程博客使用 grub-mkconfig 生成的配置文件应该是 bios 启动方式?我们使用的是 bois 启动还是 uefi 启动?我们是 uefi 安装。)
邻人困惑的是,我把 linux 版本的内核都删了,启动项还是没有任何改变。
还是要自己重新装一遍 archlinux,仔细查阅 wiki,了解更多可选项,写自己的安装流程。
至于滚挂的原因是:
pacman -Syu
后,所有包都会更新,然后我的 KDE 就挂了,别随便用 -Syu
!
也可能是 virtualbox 的虚拟机适配程序出现了问题,导致 KDE 卡死。
查到命令时先想后果!
数据备份对于不稳定和不可信的系统来说非常必要!
备份重要文件和进行系统快照!
万幸的是 KDE 图形桌面之外的功能都是完好的,而且 fallback initramfs 的启动项的图形界面也能正常使用。
关于这次滚挂的恢复,之后有缘再写。
这个故事告诉我们,及时快照。备份一定要确认可用。
nethack
略看完 《30天自制操作系统》。这个日本人实现了一个有图形界面的小操作系统,在将近 20 年前。说可以实现一个类似 nethack 的游戏。
查了下,nethack 是 rogue 游戏的鼻祖之一,是在终端界面的 rpg rogue 游戏(玩家用一个"@"表示),还有联网服务器。可惜国内没有什么社区。
nethack 建议搭配 gpt 玩,没有新手教程流程太地狱了,操作都得一个个记,简直是上班。新手操作
论文阅读工具
感觉目前论文全文翻译的痛点就在于 pdf 转 latex,因为英文 latex 转中文 pdf 已经有很好的 openai 插件了,或者针对另一个 pdf 翻译插件,把翻译出来的内容进行排版,应该也是需要先转成 latex 排版再转成。
全文翻译之上还有注释索引的需求。目前的付费实现是 mathpix。
感觉沉浸式翻译的全文翻译功能够用了。
沉浸式翻译提供了 pdf 转 markdown 的方案,使用深度 OCR 进行转换。但是 markdown 就无法实现还原论文格式了。在沉浸式翻译的纯文本翻译的基础上保留图片、表格不翻译,对公式使用开源库 OCR,就很完美了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY