linker脚本文件是用来控制link过程的文件,文件中包含内容为linker的处理命令,主要用于描述输入文件到输出文件(目标文件)时各个内容的的分布及内存映射等等。在上一节中的linker.ld已经告诉了链接器把需要初始化的部分放在_start_ctors和_end_ctors之间,关于链接脚本格式还有一些其他内容需要指定。
linker脚本最简单的格式为

SECTIONS
{
    . = 0x10000;
    .text : { *(.text) }
    . = 0x8000000;
    .data : { *(.data) }
    .bss : { *(.bss) }
}

.text是输出节。在大括号里列出输入节的名字,它们会放入输出节中。使用通配符匹配任何文件名,表达式(.text)意味着所有的输入文件中的输入节.text。表示通配符,.是位置计数器,它以输出节的大小增加其值,链接器会设置输出文件中的.text节的地址为0x10000。
剩下的行定义输出文件中的.data和.bss节。链接器会把输出节.data放置到地址0x8000000。之后,链接器把输出节.data的大小加到位置计数器的值0x8000000,并立即设置.bss输出节,效果是在内存中,.bss节会紧随.data之后(两个节之间可能产生必要的对齐)。
对于一个被抛弃的的输出段,链接器将会忽略给该段指定的地址,除非在输出段中有符号定义,那样的话,即使这个输出段被抛弃,链接器依然会遵守该段地址的指定。一个特殊的输出段名/DSICARD/可以用来给抛弃输入段使用,任何被放在名字为/DISCARD/输出段中的输入段都不会被包含到输出文件中。

1.5 操作系统的引导过程

有了linker.ld脚本文件,就可以执行链接的过程。在Makefile中加入链接过程。

%.o: %.s
    as ${ASPARAMS} -o $@ $<

mykernel.bin: linker.ld ${objects}
    ld ${LDPARAMS} -T $< -o $@ ${objects}

我们使用VMware Workstation启动操作系统,VMware Workstation的测试版本为16.0.0,它使用操作系统镜像启动一个操作系统。Linux有制作镜像的工具,在命令行中使用下面命令安装:

sudo apt install xorriso grub-efi-amd64 grub-pc

sudo apt install xorriso grub-efi-amd64 grub-pc
安装完毕以后可以使用指令grub-mkrescue创建iso镜像
//这里就是可以让iso镜像自动更新

set timeout=0
set default=0
menuentry "my os" {
    multiboot /boot/mykernel.bin
    boot
}

Multiboot规范规定GRUB根据/boot/grub/grub.conf文件查找Kernel信息并加载Kernel程序,grub.conf的信息如下:

set timeout=0
set default=0
menuentry "my os" {
    multiboot /boot/mykernel.bin
    boot
}

我们在Makefile文件中创建这个文件,添加代码如下:

mykernel.bin: linker.ld ${objects}
    ld ${LDPARAMS} -T $< -o $@ ${objects}

mykernel.iso: mykernel.bin
    mkdir iso
    mkdir iso/boot
    mkdir iso/boot/grub
    cp $< iso/boot/
    echo 'set timeout=0' > iso/boot/grub/grub.cfg
    echo 'set default=0' >> iso/boot/grub/grub.cfg
    echo 'menuentry "my os" {' >> iso/boot/grub/grub.cfg
    echo '    multiboot /boot/mykernel.bin' >> iso/boot/grub/grub.cfg
    echo '    boot' >> iso/boot/grub/grub.cfg
    echo '}' >> iso/boot/grub/grub.cfg
    grub-mkrescue --output=$@ iso
    rm -rf iso

clean:
    rm kernel.o loader.o mykernel.bin mykernel.iso
    //当.s文件由更改时,必须重新编译生成.o文件,然后重新链接,生成.iso

在命令行中执行

make mykernel.bin

可以看到在os目录下生成了mykernel.iso文件。
打开VMware Workstation并选择“文件 - 新建虚拟机 - 典型 - 安装程序光盘映像文件 - 选择镜像文件所在的路径”。操作系统类型更改为“其他”,内存分配64M,不需要创建磁盘。创建完毕后开启虚拟机可以看到屏幕上的hello world。
c48c175774bfe30d891a554bf526b43.png

标签: none

评论已关闭