磁盘学习+MBR学习

本文介绍了硬盘的MBR(主引导记录)结构,包括引导程序、分区表和结束标志,并讨论了CHS和LBA寻址方式。同时,探讨了BIOS的中断调用,如INT 13H和中断处理程序的工作原理,以及软中断如INT 3和INT n的使用。
摘要由CSDN通过智能技术生成

磁头数: 硬盘总共有几个磁头,也就是几面盘片,硬盘式由多个盘片组成的,

                  而每个盘片上都有一个读写磁头复制该盘片的读写操作,磁头数最大为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

Hostname localhost port 8832
启动虚拟机后点击上面窗口 OK 按钮,弹出选择附加进程,选择第一个,点 OK

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码



表:DOS系统功能调INT 21H
AH
功能
调用参数
返回参数
00
程序终止(同INT 20H)
CS=程序段前缀
 
01
键盘输入并回显
 
AL=输入字符
02
显示输出
DL=输出字符
 
03
异步通迅输入
 
AL=输入数据
04
异步通迅输出
DL=输出数据
 
05
打印机输出
DL=输出字符
 
06
直接控制台I/O
DL=FF(输入)
DL=字符(输出)
AL=输入字符
07
键盘输入(无回显)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值