cpu启动时为实模式,此时硬烧录的将cs=0xFFFF,ip=0x0,并自动开始执行0xFFFF0(ROM-BIOS的地址)的代码,BIOS会自检,并在0x0地址处设置中断向量表,此后实模式的int中断全部依赖此表,并将0磁道0扇区的512字节(引导扇区,放bootsect.s)读入内存0x7c000处,并跳转到此地址.
bootsect.s只能占512字节,功能有限,所以需要setup.s, 首先bootsect.s将自身从0x7c000移动到0x90000(为setup.s将system移动到0x00000时腾地方),并将setup.s读入到内存0x90200处,将system模块读入内存0x10000处.转入0x90200(setup.s)执行.
setup.s通过int中断获取硬件参数并放置在内存合适位置,为system模块运行做准备,并将system从内存0x10000移动到0x00000处(此时system中的模块中的逻辑内存地址就是真实的物理地址,而且BIOS中设置的int中断向量表就被覆盖了,int中断用不了了),设置GDT表,将cr0寄存器PE设为1,开启保护模式(指令集改变为32or64位的cpu指令集,寻址方式也改变),PG设为1,启动分页,并跳转(jmpi 0,8)到0x00000,操作系统正式启动!
tip1:自80386开始,除了bootsect.s和setup.s执行在实模式(实模式不区分特权级和用户级,能运行就是最大权限),操作系统和用户程序全部在保护模式下.
tip2:实模式是十六位机,保护模式根据cpu不同有32和64位,所以保护模式最多寻址1MB(16位有20根地址总线),而32位(32根地址总线)可寻址4GB,64(64根地址总线)更是256TB
tip3:实模式和保护模式的区别一个是寻址能力,一个是寻址方式,以及是否区分特权级和用户级.
tip4:之所以现代cpu中仍旧保存实模式的一大原因是与老的cpu或软件保持兼容,实模式本身是一种落后的淘汰设计.