抄写Linux源码(Day5:能够打印字符串的 MBR)

文章介绍了如何基于Linux0.11版本的启发,编写一个简单的MBR程序,该程序在启动时利用BIOSAPI打印出Hello。通过汇编语言编写代码,使用gcc、ld和objcopy进行编译和定位,最终生成磁盘镜像mbr.img。通过QEMU模拟器,可以观察到程序成功执行并打印出预期的字符串。
摘要由CSDN通过智能技术生成

根据闪客 Linux0.11 解读:https://github.com/dibingfa/flash-linux0.11-talk
在这里插入图片描述
MBR第一个扇区的东西,会在上电后被 BIOS 加载到内存的 0x7c00 位置

根据JYY的课程,编写一个能够打印字符串的 MBR (调用 BIOS 的 API 实现字符打印),如下:

#define SECT_SIZE 512

.code16 // 16-bit assembly

# Entry of the code
.global _start
_start:
        lea (msg), %si   // R[si] = &msg

again:
        movb (%si), %al
        incw %si
        orb %al, %al
        jz done
        movb $0x0e, %ah
        movb $0x00, %bh
        int $0x10
        jmp again

done:
        jmp .

msg:
        .asciz "Hello\r\n"

.org SECT_SIZE - 2
.byte 0x55, 0xAA

接着用如下命令编译并处理它:

gcc -ggdb -c mbr.S
ld mbr.o -Ttext 0x7c00   (把代码段放置在内存位置 0x7c00,实际上是处理代码中使用的地址,让它放在 0x7c00 可以 work,我们这里的代码都不是位置无关代码)
objcopy -S -O binary -j .text a.out mbr.img

我们就制作了磁盘镜像 mbr.img

现在我们可以使用 xxd mbr.img 来观察镜像,如下图

在这里插入图片描述
使用 qemu-system-x86_64 mbr.img 启动这个磁盘,可以看到 QEMU 终端打印了 Hello
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值