磁头数: 硬盘总共有几个磁头,也就是几面盘片,硬盘式由多个盘片组成的,
而每个盘片上都有一个读写磁头复制该盘片的读写操作,磁头数最大为255
柱面数: 表示硬盘每一面盘片上有几条磁道,最大为1023 10个二进制位。
扇区: 表示每一条 磁道/柱面 上有几个扇区,最大为63 6个二进制位。每个扇区一般为 512 字节
CHS寻址方式 中, 磁头 柱面 扇区 的取值范围 为 0~255 , 0~1023 , 1~63
BIOS int 13H 是BIOS 提供的磁盘基本输入输出中断调用,它可以完成磁盘的复位,读写,校验,定位,诊断,格式化等功能。
使用CHS寻址方式, 因此最大识别访问 8GB左右的硬盘。
现代大容量硬盘一般采用 LBA 线性地址方式寻址,替代CHS寻址。
MBR
处理器加电/复位后,如果硬盘式首选的启动设备,
那么ROM-BIOS 将试图读取硬盘的0面0道1扇区。这就是主引导扇区
读取的主引导扇区数据有512字节,ROM-BIOS将它加载到逻辑地址0x0000:0x7c00处
也就是物理地址 0x07c00 处,然后判断它是否有效
有效的主引导扇区,最后两字节为 0x55 + 0xAA ROM-BIOS程序先检测这两个标志,
如果主引导扇区有效,则以一个段间转移指令 jmp 0x0000:0x07c00 调到哪里继续执行
学习:
主要分为5部分: 1引导程序 446字节 (包含WINDOWS磁盘签名 保留位) 2分区表 3结束标志
512字节
1引导程序 占 440字节 0x1b8
WINDOWS磁盘签名 后面4字节为WINDOWS磁盘签名 它是WINDOWS系统在初始化时写入的,WINDOWS依靠 磁盘签名来识别磁盘 如果丢失则WINDOWS认为该磁盘没有被初始化
保留位紧接着是两个字节保留字节 暂时没有被MBR使用的位置
2分区表
在保留的两个字节后64字节 0x40 则保存分区表(DPT disk partition table) 用来管理磁盘分区的 如果丢失 磁盘分区就会丢失 每16字节描述一个分区项的数据
由于字节数的限制,一个磁盘最多可以4个主硬盘分区, 硬盘中的磁盘可以分为主磁盘分区+扩展分区
3 结束标志 55AA表示
以此类推 可以判断有几个硬盘································
调试之前先要了解windows系统启动过程
1、开机
2、BIOS加点自检(Power On Self Test,即POST),此时电源稳定后,CPU从内存地址0fff:0000处开始执行
3、将硬盘第一个扇区(0磁头0柱面1扇区)读取内存地址0000:7c00处
4、检测(WORD)0000:7dfe是否等于0xaa55,若不等于则转去尝试其他启动介质,如果没有其他启动介质则显示"No ROM BASIC"
5、跳转到0000:7c00处执行MBR中的程序
6、MBR首先将自己复制到0000:0600处,然后继续执行
7、在主分区表中搜索标志为活动的<span style="white-space:pre"> </span>分区。如果发现没有活动分区或有不止一个活动分区,则显示“Invalid partiton table”
8、将活动分区的第一个扇区读入内存地址0000:7c00处
9、检测(WORD)000:7dfe是否等于0xaa55,若不等于则显示"Miss Operating System",然后停止,或尝试软盘启动
10、跳转到0000:7c00处继续执行DBR
11、启动系统
以上步骤中2,3,4,5步由BIOS的引导程序完成,6、7、8、9、10步由MBR中的引导程序完成。
知道了过程,调试就简单多了,所以过程是分析一个很关键的步骤。
·
关于MBR的调试看willJ大大的文章吧~
调试MBR
这里用IDA 分析:
IDA调试MBR比较简单,先配置下虚拟机的VMX文件,添加一下代码:
debugStub.listen.guest32 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
bios.bootDelay = "3000"
打开
IDA--Debugger--Attach--Remote GDB debugger
在MBR载入内存的地方下断,也就是断在0x7c00
这个时候最好Alt+s下,选择16位的模式,因为这个时候还未进入32位模式!!!!要不然分析有错误
学习转载于 http://www.52pojie.cn/thread-173889-1-1.html
下面为几个MBR钟的代码片段:
学习转载于 http://www.52pojie.cn/thread-215498-1-1.html
访问显存,也需要使用逻辑地址 : 段地址:偏移地址
访问内U承诺使用DS,也可以使用ES
不能直接写 mov es,0xb800
要写成 mov es,ax
ASCII码: 0 - 9 A - Z a - z
0x30 - 0x39 0x41 0x5A 0x61 - 0x7A
字符显示属性:
0x7c 表示 无高亮 背景色 黑 前景色白
CLD REP MOVSB 解释:
;example:把当前数据段中偏移1000H开始
;的100个字节数据传送到偏移2000H开始的
;单元中
cld ;指针增值
push DS ;当前数据段,因此压入栈中保存
pop ES ;使ES=DS
mov SI,1000H ;源串指针初值
mov DI,2000H ;目的串指针初值
mov CX,100 ;循环次数
Next:
lodsb ;取一个字节 把SI指向的存储单元读入累加器
stosb ;存一个字节 可以将累加器AL中的值传递到当前DI地址处
loop Next ;循环CX次
;以下程序片段与上面的等价:
cld ;地址指针增值
……
mov CX,100 ;循环CX次
Next:
movsb ;每次传送一字节数据
loop Next
;或者用更简单的写法:
cld
……
mov CX,100
rep movsb
中断学习:
所有的严重事件都必须无条件地加以处理,这种类型的中断是不会被阻断和屏蔽的,称为非屏蔽中断(Non Maskable Interrupt,NMI)。
Intel处理器允许256个中断,中断号的范围是0~255,8259负责提供其中的15个,但中断号并不固定。之所以不固定,是因为当初设计的时候,允许软件根据自己的需要灵活设置中断号,以防止发生冲突。该中断控制器芯片有自己的端口号,可以像访问其他外部设备一样用in和out指令来改变它的状态,包括各引脚的中断号。正是因为这样,它又叫可编程中断控制器(Programmable Interrupt Controller,PIC)。
图`
内部中断
div / idiv 除数为0 或者除法溢出 产生中断0
当处理器遇到非法指令时,将产生 中断6
软中断
int 3 //断点中断指令 机器指令为CC 当处理器执行到int 3 即发生3号中断,专区执行相应的中断处理程序
int imm8
into
中断处理程序执行也要用到各个寄存器,会破坏它们的内容,但PUSH 指令不会,我们可以在该程序内先压栈 所有相关寄存器+内存单元
然后分别取出予以显示,它们就是中断前的现场内同,最后再恢复那条指令的第1 字节
int3 和 int 3 不一样的,前者为CC 后者为CD 03 这就是通常所说的 int n 操作吗为 0cCD
int 0x00 //引发0号中断
int 0x15 //引发0x15号中断
int 0x16 //引发0x16号中断 键盘服务
into 是溢出中断指令,机器码wie 0xCE 也是单字节指令。
最有名的的软中断 为 BIOS 中断。 在计算机加电后,BIOS程序 执行期间建立起来的,这些中断功能在加载+执行主引导扇区之前就已经可以使用了mo
mov ah,0x00 //从键盘读字符
int 0x16 //键盘服务,返回时,字符代码在寄存器AL中
执行后,中断服务例程会监视键盘动作,当它返回时,会在寄存器AL中存放按键的ASCII码
AH
|
功能
|
调用参数
|
返回参数
|
00
|
程序终止(同INT 20H)
|
CS=程序段前缀
|
|
01
|
键盘输入并回显
|
|
AL=输入字符
|
02
|
显示输出
|
DL=输出字符
|
|
03
|
异步通迅输入
|
|
AL=输入数据
|
04
|
异步通迅输出
|
DL=输出数据
|
|
05
|
打印机输出
|
DL=输出字符
|
|
06
|
直接控制台I/O
|
DL=FF(输入)
DL=字符(输出) |
AL=输入字符
|
07
|
键盘输入(无回显)
|