揭开钢琴的盖子
通用计算机:可以进行编程操作
从计算机外部存储程序到计算机内部存储程序
当我们打开电源,第一条指令:
开机,PC处于实模式,将CS:IP置为0xffff:0x0000,这里对应的是bios区域,开始检测硬件,然后将0磁盘,0扇区(512字节)内容读入0x7c00位置,设置CS:IP为0x07c0:0x0000。也就是从0x07c00位置开始执行代码。
磁盘里存放的就是操作系统的引导扇区
- .s是汇编代码
- bootsect.s的作用:
- 将ds:si置为0x07c0:0000,将es:di置为0x9000:0000
- 跳到0x9000:go位置继续执行
- 这里的go是一个偏移地址,也就是相对于代码段的开始位置的偏移,所以这一句执行完后,跳到移动后的代码往下执行。
- 作用:
- 首先将ds,es,ss置为0x9000,将sp置为0xff00
- 使用13号中断,读0号驱动器,0柱面,2扇区,0磁头下的内容到es:bx=0x9000:0x0200的位置
- 也就是将磁盘上的boot扇区后面的4个扇区内容读入内存中的这一段代码后面的位置(因为第一个扇区占用了0x200(512)字节)
- 作用:
- 具体可以见10号中断,这一段代码的功能就是将msgl中的字符读入到屏幕上。
- 0x1000就是读入字节数。
- 调用read_it函数
- 作用:继续读磁盘,再将控制权交到磁盘的第2扇区的代码处
操作系统启动:
- 作用:
- 使用15号中断,获得内存大小放入ax,再放入0x9000:0002位置
- es:di=0x0000:0x0000 ds:si=0x1000:0x0000
- 将操作系统读入到低地址处
- 将0x1000:0000开始到0x8fff:0000位置的内容读到低地址处
- 作用:
- 切换到保护模式 cr0为1
- cs选择子去GDT表的下标,取出基址,和ip组成物理内存地址
- int n选择中断,其中的n需要去idt找对应的中断处理函数的入口地址
- 作用:
- 这时做完移动后的操作,设置idt和gdt表项位置
这条指令的意思是:将去gdt表的第八项寻找对于的段基址,然后将段基址取出作为基址,从基址的第0个字节开始执行
在这里插入图片描述
去执行main函数,当main函数返回,会执行的是jmp L6,发生死机