第一行代码: 加载启动区

  • 操作系统的开发人员,会把操作系统最开始的那段代码,编译并存储在硬盘的 0 盘 0 道 1 扇区.按下开机键的那一刻,CPU会自动把代码段寄存器 CS 设置为 0xF000, 其段基地址则被设置为 0xFFFF0000, 段长度设置为 64KB。而 IP 被设置为0xFFF0,因此此时CPU代码指针指向 0xFFFFFFF0 处,即4G空间最后一个64K的最后16字节处,即系统 ROM BIOS 存放的位置.在主板上提前写死的固件程序 BIOS 会将硬盘中启动区2的 512 字节的数据,原封不动复制到内存中的 0x7c00 这个位置,并跳转到那个位置进行执行.
mov ax,0x07c0         !将值 0x07c0 复制到 ax 寄存器里
mov ds,ax             ! ax 寄存器里的值复制到 ds 寄存器
mov ax,0x9000
mov es,ax
mov cx,#256           !计数器,提供需要复制的字的数量 256=512字节
sub si,si             !sub指令作用:减法操作, si 寄存器清零.
sub di,di
rep                   !rep指令作用:重复执行后面一句操作,并递减cx的值,直到cx=0停止.
movw                  !movw指令作用:这里从内存 [si] 处移动 cx 个字到 [di];注意一次的移动单位是“字”,mov指令+wword)是一次移动一个字.
jmpi    go,INITSEG    !BIOS移动到0x9000后,跳转(go)到INITSEG0x9000),CS=0x90000
go:	mov	ax,cs
	mov	ds,ax
	mov	es,ax

视频链接

参考链接

  1. Linux内核源码学习——bootsect.s
  2. Linux 源码趣读
  3. linux在线源码