-f 后跟输出文件的格式,后跟bin表示生成的文件只包含“纯二进制”内容,除了处理器能识别的机器代码外,别的任何东西都不包含。因为缺少操作系统需要的加载和重定位信息,它就很难在windows或linux上运行,不过,这正是本书所需要的。
-o 后跟输出文件的文件名。
hexview可以打开任何文件,以十六进制的形式从头到尾显示它的每一个字节。
绝大多数程序要想运行必须借助操作系统,操作系统对程序提出了种种格式上的要求,比如,
- 文件的开始部分包含编译日期
- 是针对什么操作系统编译的
-
程序的版本
第一条指令从哪里开始
- 数据段从哪里开始、有多长,等等
如果不按要求来,就不能运行。所以,在特定的操作系统下开发软件不是一件容易的事。其实,操作系统也是一个需要在处理器上运行的软件,只不过大些、功能多些。如果绕过它,让计算机一开机就运行我们的程序不是更好。
处理器的引脚中有一个RESET,用于接受复位信号,当处理器加电或RESET引脚的电平由低变高时,处理器都会执行一个硬件初始化,以及一个可选的内部自测试,然后初始化所有的寄存器。比如8086,复位使CS=0xFFFF,其他所有寄存器都是0包括IP。8086之后的处理器并未延续这种设计。
在内存中,每个比特的存储都是靠一个极其微小的晶体管外加一个极其微小的电容来完成的。这样小的电容其泄露电荷的速度也非常快。所以,内存需要定期补充电荷,这叫做刷新。在内存刷新期间处理器无法访问它,这种存储器叫动态随机访问存储器(DRAM)。内存断电后保存的内容全部消失,所以,处理器加电后无法从内存取得指令。
8086可以访问1MB内存,这1MB物理上分成几个部分,大部分用于DRAM(0x00000-9FFFF),剩余的给了只读存储器ROM(0xF0000-FFFFF)和外围板卡。加电后CS=0xFFFF,IP=0,所以第一条指令在0xFFFF0处,也就是在ROM中,该地址通常是一条跳转指令,使处理器从ROM中较低地址处执行,比如,jmp 0x0f000:0xe05b
ROM芯片中的程序包括:
- 硬件的诊断、检测、初始化
- 提供一套软件例程,用于和外设打交道(键盘,屏幕)
- 因为容量小,需要辅助存储设备(硬盘,光盘,U盘),最后会转达辅助存储执行
这就是BIOS ROM
硬盘采用铝合金作为基片,并在表面涂上磁性物质来记录二进制位,硬盘可以有多个盘片,他们都串在同一个轴上,轴高速旋转,一分钟可达7200转。
磁头:每个盘片的两面各一个,从0开始编号
磁道:把盘片看成无数个大小不同的同心圆组成,每个园就是一个磁道,从0开始编号
扇区:将磁道分成一段一段的圆弧,从1开始编号。扇区于扇区之间用空白隔开,扇区大小=扇区头+512字节,扇区头包含该扇区的磁头号、磁道号、扇区号、扇区是否健康标志、用于替换扇区的扇区地址、等。
硬盘的第一个扇区是0头0道1扇称为主引导扇区,BIOS将读取他的数据并加载到0x7c00处,然后跳到这里执行。说到这里,如果我们把自己的程序写到主引导扇区,不就能绕过操作系统执行了吗。为了安全起见,使用虚拟机。
虚拟机以自己运行的真实机为模板,虚拟出另一套硬件。本书采用virualbox虚拟机,虚拟硬盘采用VHD规范并且是固定尺寸的VHD
要访问硬盘,程序要提供4个参数,磁头、磁道、扇区、读/写。磁盘的访问是按柱面进行的。LBA模式,不考虑扇区的物理地址,而是把他们全部组织起来统一编号,从逻辑0扇区开始。VHD中扇区大小只有512数据没有扇区头。