一、本文主要内容
1.制作一个可执行文件,用于测试
(1)在一个新的文件loader.S中写一段测试代码,及相应的.ld文件
(2)修改makefile,使loader.S编译成loader.bin
(3)把loader.bin拷贝到boot.img上
2.加载测试文件
对上一篇文件的代码稍做修改,使得能搜索并加载指定文件《loader.bin》到内存指定位置
3.控制权转移到内存指定位置
二、写一个测试文件
(1)loader.S
.code16 .text mov $0xb800, %ax mov %ax, %gs mov $0xf, %ah mov $‘L‘, %al mov %ax, %gs:((80*0+39)*2) jmp .
(2)solrex_x86_dos.ld
这里我不太懂,加载的时候es:bx说明加载的位置,这个ld有什么用呢?
SECTIONS { . = 0x0100; .text : { _ftext = .; } = 0 }
(3)makefile
a.增加loader.S –> loader.bin的make
b.增加make copy, 用于把loader.bin拷贝到boot.img上
CC=gcc LD=ld OBJCOPY=objcopy CFLAGS=-c TRIM_FLAGS=-R .pdr -R .comment -R.note -S -O binary LDFILE_BOOT=solrex_x86.ld LDFILE_DOS=solrex_x86_dos.ld LDFLAGS_BOOT=-T$(LDFILE_BOOT) LDFLAGS_DOS=-T$(LDFILE_DOS) all: boot.img LOADER.BIN @echo ‘#################################################################‘ @echo ‘# Compiling work finished, now you can use "sudo make copy" to‘ @echo ‘# copy LOADER.BIN into boot.img‘ @echo ‘#################################################################‘ boot.bin: boot.S $(CC) $(CFLAGS) boot.S $(LD) boot.o -o boot.elf $(LDFLAGS_BOOT) $(OBJCOPY) $(TRIM_FLAGS) boot.elf [email protected] LOADER.BIN: loader.S $(CC) $(CFLAGS) loader.S $(LD) loader.o -o loader.elf $(LDFLAGS_DOS) $(OBJCOPY) $(TRIM_FLAGS) loader.elf [email protected] boot.img: boot.bin @dd if=boot.bin of=boot.img bs=512 count=1 @dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879 # You must have the authority to do mount, or you must use "su root" or # "sudo" command to do "make copy" copy: boot.img LOADER.BIN @mkdir -p /tmp/floppy;\ mount -o loop boot.img /tmp/floppy/ -o fat=12;\ cp LOADER.BIN /tmp/floppy/;\ umount /tmp/floppy/;\ rm -rf /tmp/floppy/; clean: @rm -f *.o *.elf *.bin *.BIN distclean: clean @rm -f boot.img release: clean @mv boot.img solrex.img
三、加载测试文件
不需要特殊处理,把要加载的文件名和文件名长度设置一下就可以了
四、转移控制权
在LABEL_FILE_LOADED后面加上
jmp $BaseOfLoader, $OffsetOfLoader
四、编译
五、运行
(1)打印“Booting**”:引导程序开始执行
(2)打印“Loaded in”:找到了loader.bin
(3)打印“L”:跳转到loader.S的代码中
测试文件系统
时间: 2024-10-29 09:26:53