linux 0.11 源码学习(三)
bootsect.s
bootsect完成的是整个内核的引导工作,简单的说就是将内核镜像中的bootsect、setup、system三部分从引导盘拷贝到内存的指定位置(当然对bootsect自己其实是已经被BIOS自动拷贝到内存0x7C00处,所以应该只能算是位置的搬迁)。bootsect依次做了如下工作:
- 启动后首先将bootsect自身的512字节目标程序拷贝至0x9000;
entry _start _start: mov ax,#BOOTSEG mov ds,ax mov ax,#INITSEG mov es,ax mov cx,#256 //256个字 = 512字节 sub si,si sub di,di rep movw jmpi go,INITSEG
- 将setup目标文件(4个扇区),拷贝到0x9200处;此时setup还在引导盘(软盘上),因此考虑要利用BIOS终端int 0x13
load_setup: mov dx,#0x0000 ! drive 0, head 0 mov cx,#0x0002 ! sector 2, track 0 mov bx,#0x0200 ! address = 512, in INITSEG mov ax,#0x0200+SETUPLEN ! service 2, nr of sectors int 0x13 ! read it jnc ok_load_setup ! ok - continue
- 将system目标文件拷贝到0x1000处,与setup类似,不做赘述;在linux 0.11版本中system大小由SYS_SIZE定义为0x3000。
- 检查根文件设备号,若未指定则根据BIOS获取的扇区来决定采用1.2MB A驱动器还是1.44MB A驱动器。
seg cs mov ax,root_dev cmp ax,#0 jne root_defined seg cs mov bx,sectors mov ax,#0x0208 ! /dev/ps0 - 1.2Mb //参考Linux的软盘逻辑设备号 cmp bx,#15 je root_defined mov ax,#0x021c ! /dev/PS0 - 1.44Mb cmp bx,#18 je root_defined
- 最后程序跳转到setup处执行:
jmpi 0,SETUPSEG // SETUPSEG = 0x9020
【推荐】国内首个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)