linux 0.11 源码学习(二)
linux 0.11的运行
linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作:
- 制作linux镜像,按要求修改makefile后,可以直接在redhat上编译,生成image:
- 制作linux根文件镜像rootimage(即启动时存在的bin、home等目录);
- 设置bochs配置参数,将image和rootimage分别作为软盘A和软盘B;
linux 0.11的makefile
对于linux启动首先要理解的是linux内核镜像的组成,image由三部分组成:bootsect、setup和system,其中system是真正的内核代码。由makefile可知:
all: Image //最终生成的镜像文件
Image: boot/bootsect boot/setup tools/system tools/build
objcopy -O binary -R .note -R .comment tools/system tools/kernel
tools/build boot/bootsect boot/setup tools/kernel $(ROOT_DEV) > Image //由build程序组成image,ROOT_DEV是根文件参数
rm tools/kernel -f
sync
tools/system: boot/head.o init/main.o \ //systtem部分目标文件
$(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS)
$(LD) $(LDFLAGS) boot/head.o init/main.o \ //注意是GNU的编译和链接器
$(ARCHIVES) \ //内核、文件系统、内存管理的目标文件
$(DRIVERS) \ /驱动部分目标文件
$(MATH) \ /数学运算库目标文件
$(LIBS) \ /内核库函数目标文件
-o tools/system
//下面两个是X86的编译和连接器
boot/setup: boot/setup.s
$(AS86) -o boot/setup.o boot/setup.s
$(LD86) -s -o boot/setup boot/setup.o
boot/bootsect: boot/bootsect.s
$(AS86) -o boot/bootsect.o boot/bootsect.s
$(LD86) -s -o boot/bootsect boot/bootsect.o
linux 0.11的build.c
上述makefile中很重要的一个文件是build.c,它将bootsect、setup、system和根文件作为参数,最终生成image。build.c在tools文件夹中,主要就是main函数执行功能如下:
- 判断入参以及根文件,获取文件的主设备号和从设备号,写入image文件的508、509;默认写入0x021D即1.44 MB B驱动器;
- 判断bootsect文件正确性,并写入stdout;
- 判断setup正确性,(长度是否大于4个扇区(4*512),是则错误否则填0),并写入stdout;
- 判断system正确性,并写入stdout;
- 最终stdout会在makefile中重定向到image文件(> image);
由上可知在image中头512字节是bootsect代码,因此当该image文件被加载入软盘启动时正好属于BIOS默认的引导扇区,也就是启动设备的第一个扇区,这也就是linux 0.11进入引导程序前的全部工作了:)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)