Trace Linux Kernel With Bochs(4) trace our own boot section
上一节中我们使用AT&T汇编重写了bootsect.s,这里我们利用bochs来跟踪我们的程序,加深对一些关键操作的认识和理解。
修改Makefile
在原来Makefile的基础上,我们简单地修改一下,将我们重写的bootsect.s放在软盘的第一个扇区,然后将之前打印Hello OS World!的程序(称之为hellosect.s)放在第二个扇区,这样当我们执行完bootsect的代码,跳转到setup section时,就会跳转到hellosect,在屏幕上打印出Hello OS World!
。
代码如下:
CC = gcc
LD = ld
LDFILE = ld_script.ld
OBJCOPY = objcopy
DUMP = objdump
DUMP_FLAGS = -D -b binary -mi386 -M addr16 -M data16
ASM_SRC = $(wildcard *.s)
ASM_OBJ = $(patsubst %.s, %.o, $(ASM_SRC))
ASM_ELF = $(patsubst %.s, %.elf, $(ASM_SRC))
ASM_BIN = $(patsubst %.s, %.bin, $(ASM_SRC))
ASM_DMP = $(patsubst %.s, %.dmp, $(ASM_SRC))
.PHONY: all clean dump
all: linux.img
dump: $(ASM_DMP)
linux.img: $(ASM_BIN)
@dd if=bootsect.bin of=$@ bs=512 count=1
@dd if=hellosect.bin of=$@ seek=1 bs=512 count=1
@dd if=/dev/zero of=$@ seek=2 bs=512 count=2878
$(ASM_BIN): %.bin: %.elf
@$(OBJCOPY) -R .pdr -R .comment -R .note -S -O binary $< $@
$(ASM_ELF): %.elf: %.o
$(LD) $< -o $@ -e c -T$(LDFILE)
$(ASM_OBJ): %.o: %.s
$(CC) -c $< -o $@
$(ASM_DMP): %.dmp: %.bin
$(DUMP) $(DUMP_FLAGS) $< > $@
clean:
@rm -rf $(ASM_OBJ) $(ASM_ELF) $(ASM_BIN) $(ASM_DMP) linux.img
其他文件可以到这里下载
Just Trace It!
1.输入命令开始跟踪之旅 -- bochs -q -f bochsrc
。
2.在BIOS约定的入口处打断点 -- vb 0x0:0x7c00
3.执行到下一下断点处 -- c
4.查看当前位置后的10条指令 -- u/10
5.查看setup section(此处为hellosect)入口处的10条指令 -- u/10 0x9020:0x0
6.观察bootsect的自我复制移动
6.1.利用dump文件可知指令rep movsw %ds:(%si), %es:(%di)
的地址,在此处打断点 -- vb cs:0x7c17
6.2.运行到此断点,查看内存0x9000:0x0处的内容 -- u/10 0x9000:0x0
6.3再执行一条指令(复制一条指令),现查看内存0x9000:0x0处的内容 -- u/10 0x9000:0x0
7.利用同样的方式可以观察bootsect加载hellosect的过程
8.获取每磁道扇区数
9.打印"Loading system..."提示信息
10.检查根设备
11.执行hellosect
blog comments powered by Disqus