Linux 内核注释-1 /boot/bootsect.s

本文详细介绍了 Linux 0.11 内核启动过程中的关键汇编代码,特别是如何通过串操作指令将启动扇区代码复制到内存中,并跳转到初始化段继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该代码来自linux0.11内核代码/boot/bootsect.s
这段代码使用asm汇编格式启动代码,之所以不使用AT&T,原因是当时的AT&T汇编不支持16位模式.
 
汇编知识:
串操作指令:
串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列
串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串
 
串寻址方式:
源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]
目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]
每执行一次串操作指令,SI和DI将自动增(减)
 
串传送指令MOVW,MOVB
把字节(B)或字(W)操作数从主存的源地址传送至目的地址
 
REP重复前缀指令

REP :每执行一次串指令,CX减1,直到CX=0,重复执行结束

 
 1 BOOTSEG = 0x07c0
 2 INITSEG = 0x9000
 3 ... ....
 4 entry start
 5    start:
 6          mov ax , #BOOTSEG
 7          mov ds , ax                 !ds = 0x07c0
 8          mov ax , #INITSEG
 9          mov es , ax                 !es = 0x9000
10          mov cx , #256            !cx = 256 用于循环计数
11          sub si , si                    !si = si - si 意味着si = 0 
12                                           !ds:si = 0x07c0:0x0000 = 0x7c00
13          sub di , di                   !di = di - di 意味着di = 0
14                                  !ds:si = 0x9000:0x0000 = 0x90000
15          rep                  !开始循环操作 直到 cx = 0
16          movw              !每次移动1个字,执行256次,实现:
17                                 !0x7c00开始的256个字(word)即512字节的数据到0x9000处
18                                !即将bootsect.s移到0x9000处
19          jmpi go , INITSEG     !跳转到0x90000处开始执行,下面的代码        

 

转载于:https://www.cnblogs.com/light-wind/archive/2012/11/05/linux_kernel_1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值