linux0.11系列之(二): 启动引导 bootsect.s

本文详细介绍了Linux 0.11的启动引导过程,特别是bootsect.s的作用。bootsect.s主要负责读入setup和system,并在完成后显示logo。通过代码分析和实验,展示了如何让bootsect.s仅输出特定内容,进一步理解引导程序的工作原理。
摘要由CSDN通过智能技术生成

linux按照学习思路,可以姑且分为五大部分:
启动引导,系统调用,进程调度,内存管理,文件系统

那我们从 linux0.11 的启动开始探索。

我们可以在boot/目录下看到有三个汇编文件,构成我们linux启动的过程。分别为setup.s, bootsect.s, head.s
其中setup.s也给编译器指明了整个linux启动的入口:

entry start
start:

故事就从这里开始吧。

引导程序由BIOS加载并运行。它活动时,操作系统还不存在,整台计算机的所有资源都由它掌控,而能利用的功能只有BIOS中断调用。

首先,bootsect.s工作内容

bootsect.s完成两个工作:
1. 读入setup
2. 读入system
结束后,打印logo,以下为代码分析:

#define BOOTSEG     0x07c0
#define INITSEG     0x9000
#define SETUPSEG    0x9020

//程序在 BOOTSEG 开始
entry start
start:
    //ds(data segment), es(extra segment) 皆为段寄存器
    mov ax, #BOOTSEG
    mov ds, ax

    mov ax, #INITSEG
    mov es, ax

    //后面rep repeat的次数
    mov cx, #256

    //si,di 位偏移,处理方式 ds<<4+si, es<<4+di
    sub si, si
    sub di, di

    //移动256个字,即512字节(一个扇区) BOOTSEG=>INITSEG
    rep movw

    //间接跳转(段间跳转 jump inter-segment) 由此处跳转到 INITSEG<<4+go
    //cs = INITSEG, ip/pc = go
    jmpi go, INITSEG

    //后面程序运行在 INITSEG
go:
    mov ax, cs

    mov ds, ax
    mov es, ax
    //stack segment
    mov ss, ax
    //stack pointer 栈顶指针
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值