测试文件系统

一、本文主要内容

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 $@

LOADER.BIN: loader.S
    $(CC) $(CFLAGS) loader.S
    $(LD) loader.o -o loader.elf $(LDFLAGS_DOS)
    $(OBJCOPY) $(TRIM_FLAGS) loader.elf $@

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

四、编译

DARN)E$8UN`7TR`V80YV[S9

五、运行

(1)打印“Booting**”:引导程序开始执行

(2)打印“Loaded in”:找到了loader.bin

(3)打印“L”:跳转到loader.S的代码中

JRYYNZHC])2LI@ZPH3@8J$B

原文地址:https://www.cnblogs.com/windmissing/p/3817233.html