Linux系统启动
第一行代码: 加载启动区
- 操作系统的开发人员,会把操作系统最开始的那段代码,编译并存储在硬盘的 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指令+w(word)是一次移动一个字.
jmpi go,INITSEG !将BIOS移动到0x9000后,跳转(go)到INITSEG(0x9000),CS=0x90000
go: mov ax,cs
mov ds,ax
mov es,ax
视频链接
视频