dd破坏asm磁盘头恢复---惜分飞

有朋友对asm disk的磁盘头dd了2048byte的数据
 

dd-2048


 

asm-candidate


 

QQ20241202-204931


通过分析,gi软件版本,确认是11.2.0.4

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Real Application Clusters and Automatic Storage Management options.

ORACLE_HOME = /u01/app/11.2.0/grid

System name:    Linux

Node name:  rac1

Release:    4.1.12-37.4.1.el6uek.x86_64

Version:    #2 SMP Tue May 17 07:23:38 PDT 2016

Machine:    x86_64

从10.2.0.5之后版本,在第二个au的倒数第二个block上面,有asm disk header备份(每个block大小为4k),分析au大小(通过分析正常的asm disk快速找到au 大小【使用dd备份的正常的磁盘头查看】)

H:\TEMP\tmp\asmbak>kfed read sdcp.dd |grep ausize

kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000

找到被破坏的asm disk的备份磁盘头信息

H:\TEMP\tmp\asmbak>kfed read sdc.dd blkn=4094 aun=1 aus=16777216|more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD

kfbh.datfmt:                          1 ; 0x003: 0x01

kfbh.block.blk:                    4094 ; 0x004: blk=4094

kfbh.block.obj:              2147483648 ;

<think>好的,我现在需要帮助用户解决如何用NASM将boot.asm编译成boot.bin文件,然后用于制作ISO镜像的问题。用户之前已经询问过使用UltraISO和boot.bin制作ISO镜像的步骤,现在他们的需求更具体到编译部分,并且引用了之前的一些资料,可能需要结合这些引用内容来完善回答。 首先,我需要确保用户正确安装了NASM。根据引用[4],用户可能需要从官网下载NASM,但用户现在可能是在Windows环境下操作,因为之前的问题提到的是Windows 11下使用UltraISO。所以需要确认NASM在Windows下的安装步骤。用户提供的引用[4]提到的是Linux下的RPM包,但用户现在可能在Windows上,所以需要指导他们如何在Windows安装NASM,比如下载Windows版本的NASM并添加到系统路径中。 接下来是编译命令。用户提供的示例中使用了nasm boot.asm -f bin -o boot.bin,但根据引用[1],代码里有一个org 07c00h的指令,所以需要确保编译时正确设置起始地址。可能需要提醒用户,在编写boot.asm时,必须包含正确的起始地址和引导扇区结束标志0xAA55,否则生成的bin文件可能无法被正确识别为引导扇区。 然后,用户提到制作ISO镜像的问题,之前回答中使用的是UltraISO加载boot.bin作为引导文件。但根据引用[1]和[2],用户可能需要创建一个虚拟软盘映像,并将boot.bin写入到该映像的第一个扇区。不过用户现在的问题可能更倾向于直接制作ISO,而不是软盘映像。需要区分这两种情况,但根据用户当前的提问,他们可能希望直接生成ISO,所以需要结合之前的UltraISO步骤,同时确保编译的boot.bin正确无误。 另外,引用[2]提到将loader.bin复制到FAT12文件系统的虚拟软盘,这可能涉及到挂载镜像文件,但用户现在可能不需要文件系统,因为只是显示字符串的极简ISO。因此,重点应放在如何正确编译boot.asm生成boot.bin,并确保其结构符合引导扇区的要求(512字节,结束标志0xAA55)。 用户可能遇到的常见问题包括编译后的文件大小不正确,或者缺少结束标志,导致ISO无法启动。需要提醒用户检查生成的boot.bin文件是否符合这些要求,比如使用Hex编辑器查看最后两个字节是否为55 AA(注意字节顺序)。此外,可能还需要指导用户如何验证编译后的文件是否正确,比如通过虚拟机测试。 最后,用户可能需要将boot.bin作为引导文件加载到ISO中,所以在回答中需要将编译步骤和之前的ISO制作步骤连接起来,确保流程连贯。可能需要强调在UltraISO中正确加载引导文件,并保存为ISO,然后测试。</think>### **使用 NASM 编译 boot.asm 生成 boot.bin 的完整步骤** #### **1. NASM 环境配置** - **Windows 系统安装 NASM**: 1. 访问 [NASM 官网](https://www.nasm.us/),下载 Windows 版本(如 `nasm-2.16.01-win64.zip`)。 2. 解压文件到任意目录(例如 `C:\nasm`)。 3. 将 NASM 可执行文件路径(如 `C:\nasm`)添加到系统环境变量 `PATH` 中[^4]。 4. 验证安装:打开命令提示符,输入 `nasm -v`,若显示版本号(如 `NASM version 2.16.01`)则成功。 --- #### **2. 编写 boot.asm 引导程序** - **示例代码**(保存为 `boot.asm`): ```nasm org 0x7C00 ; 指定加载地址为 0x7C00(BIOS 默认引导扇区加载地址) bits 16 ; 16 位实模式 start: mov ax, 0x03 ; 清屏功能(AH=0x06, AL=0x00) int 0x10 mov si, msg ; 将字符串地址存入 SI 寄存器 call print_str ; 调用打印函数 jmp $ ; 无限循环挂起 print_str: lodsb ; 从 SI 加载字符到 AL or al, al ; 判断是否到字符串结尾(0) jz done mov ah, 0x0E ; BIOS 打印字符功能(AH=0x0E) int 0x10 jmp print_str done: ret msg db 'Hello, Custom ISO!', 0 times 510-($-$$) db 0 ; 填充剩余空间至 510 字节 dw 0xAA55 ; 引导扇区结束标志(小端格式:0x55 0xAA) ``` - **关键说明**: - `org 0x7C00`:指定代码在内存中的加载地址,确保 BIOS 正确执行指令[^1]。 - `times 510-($-$$) db 0`:填充至 510 字节,保证引导扇区总长度为 512 字节。 - `dw 0xAA55`:引导扇区结束标志,必须位于第 511-512 字节[^1]。 --- #### **3. 编译 boot.asm 为 boot.bin** 1. 打开命令提示符,进入 `boot.asm` 所在目录。 2. 执行编译命令: ```bash nasm boot.asm -f bin -o boot.bin ``` - `-f bin`:指定输出为二进制格式。 - `-o boot.bin`:定义输出文件名。 3. **验证编译结果**: - 检查文件大小是否为 **512 字节**。 - 使用 **Hex 编辑器**(如 [HxD](https://mh-nexus.de/en/hxd/))打开 `boot.bin`,确认最后两个字节为 `55 AA`(小端存储)。 --- #### **4. 将 boot.bin 集成到 ISO 镜像** 1. **使用 UltraISO**(参考[用户方案](https://example.com)): - 新建空白 ISO 项目:**文件 → 新建 → 数据光盘映像**。 - 加载引导文件:**启动 → 加载引导文件**,选择 `boot.bin`。 - 保存 ISO:**文件 → 另存为**,格式选 `ISO 9660`,勾选 `Joliet` 以支持长文件名[^3]。 2. **替代方案(DD 命令,Linux/Mac)**: ```bash dd if=boot.bin of=image.iso bs=512 count=1 ``` --- #### **5. 虚拟机测试 ISO 镜像** - **VirtualBox 示例**: 1. 新建虚拟机,类型选 `Other`,版本选 `DOS`。 2. 挂载 ISO:**设置 → 存储 → 控制器 IDE → 选择虚拟光驱**,加载 `image.iso`。 3. 启动虚拟机,若成功将显示字符串: ``` Hello, Custom ISO! ``` --- ### **常见问题解决** #### **Q1: 编译时报错“invalid combination of opcode and operands”** - **原因**:汇编语法错误(如寄存器使用不当)。 - **解决**:检查代码中指令与寄存器的兼容性,例如 `bits 16` 模式下不可使用 32 位寄存器。 #### **Q2: ISO 启动后无显示或卡死** - **原因**:引导代码未正确处理 BIOS 中断或缺少挂起逻辑。 - **解决**: - 确保 `jmp $` 指令用于挂起程序。 - 验证 `int 0x10` 中断调用参数(如 AH=0x0E 为字符打印功能)[^2]。 #### **Q3: boot.bin 文件大小不足 512 字节** - **原因**:填充指令 `times 510-($-$$) db 0` 计算错误。 - **解决**:手动计算代码长度,确保填充至 510 字节,并添加结束标志。 --- ### **扩展应用** - **多扇区加载**:修改引导代码,从 ISO 中加载更多扇区数据(需扩展汇编代码)。 - **交互功能**:通过 `int 0x16` 实现键盘输入检测(如按下按键后显示文本)。 --- ### **相关问题** 1. 如何通过 BIOS 中断在引导扇区中读取磁盘内容? 2. 如何为 ISO 镜像添加 FAT12 文件系统以支持文件加载? 3. 如何在引导扇区中实现彩色文本显示? [^1]: 引导扇区必须严格遵循 512 字节长度和 `0xAA55` 结束标志,否则无法被 BIOS 识别为有效引导程序。 [^2]: BIOS 中断 `int 0x10` 的功能号需根据 AH 寄存器设置,例如 AH=0x0E 为逐字符打印。 [^3]: Joliet 文件系统扩展允许在 ISO 镜像中使用长文件名和 Unicode 字符,但需虚拟机支持。 [^4]: 若 NASM 未加入环境变量,需通过绝对路径调用(如 `C:\nasm\nasm.exe boot.asm -f bin -o boot.bin`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值