操作系统会对它所管理的程序提出种种格式上的要求
比如,要求编译好的程序必须在文件的开始部分包含编译日期、针对的操作系统、程序的版本,第一条指令从哪里开始,数据段从哪里开始,有多长,代码段从哪里开始有多长等等,windows甚至建议你在程序中包含一个用于显示的图标
如果你不按它的要求来,他就会弹出文件无法执行
当计算机启动时,8086处理器的状态
开机按钮就是和处理其的RESET引脚相连,当我们按下开机按钮的时候,会向RESET引脚发送一个信号,会使其执行硬件初始化和内部子测试,并将所有寄存器的内容初始到一个预置的操作
注意这只是8086的设置,其他的处理器不一定这样
当处理器加电后,寄存器内容初始到预置操作,只有CS是FFFF,其他都是0000
所以当处理器加电后,发出的第一个指令是FFFF0,它距离内存的最顶端FFFFF只有16个字节,8086就是从这个位置来开始取指令执行的
(8086只可以访问1M字节的内存,地址范围是00000-FFFFF
而我们现在的处理器都能访问16G了)
在计算机中,8086处理器可以发出的地址范围是连续的,从00000一直到FFFFF
但这并不意味着被访问的内存在物理上是一个整体,事实上,这个连续的范围会被地址分配电路分成3个独立的部分
- 00000-9FFFF 8086访问的就是我们正常内存条上的内存
- A0000-EFFFF 8086访问的是外部设备的接口电路和接口卡(声卡、网卡、显卡等等)
- F0000-FFFFF BIOS
所以处理器初始加电时发出的第一个地址是FFFF0,是位于BIOS中
FFFF0距离内存顶端FFFFF只有16个字节,存不下几句指令,所以BIOS中FFFF0处的指令是一个跳转指令
跳转到FE05B,再开始取指执行,来进行其他的开机初始化操作
(FE05B还在BIOS中)
硬盘
最外面是0道
硬盘扇区的结构
数据512个字节!
读取BIOS指令完成之前,最后一道指令是从外部存储设备读取更多的指令交给处理器执行
黄色部分是BIOS读取结束时的最后一条指令
如果计算机是从硬盘启动,那么BIOS将读取硬盘主引导扇区的内容,将其加载到07C00处,然后用一条跳转指令跳到07C00处继续执行
0面0道1扇区是主引导扇区
通常主引导扇区的功能是继续从硬盘的其他部分读取更多的内容加以执行,即在主引导扇区里有一些代码从硬盘的其他部分读取内容(操作系统就是在硬盘其他部分,不在主引导扇区)
主引导扇区是512个字节
而如果我们把自己编写的程序放到主引导扇区,不也能让处理器执行吗?
这是可以的,并且几乎是在不依赖操作系统的情况下,让我们的程序可以执行的唯一方法
不过如果改写了硬盘的主引导扇区,那么你所安装的操作系统就会崩溃的