从零实现一个操作系统-day3

我的博客 startcraft.cn

链接器脚本

第一天的链接器脚本我们没有看懂,今天就来把它弄清楚吧,先把脚本代码弄过来

/*
* kernel.ld -- 针对 kernel 格式所写的链接脚本
*/

ENTRY(start)
SECTIONS
{
	/* 段起始位置 */

	. = 0x100000;
	.text :
	{
		*(.text)
		. = ALIGN(4096);
	}

	.data :
	{
		*(.data)
		*(.rodata)
		. = ALIGN(4096);
	}

	.bss :
	{
		*(.bss)
		. = ALIGN(4096);
	}

	.stab :
	{
		*(.stab)
		. = ALIGN(4096);
	}

	.stabstr :
	{
		*(.stabstr)
		. = ALIGN(4096);
	}

	/DISCARD/ : { *(.comment) *(.eh_frame) }
}

首先可执行文件分为程序段和代码段,当操作系统调用这个可执行文件时,该文件应该给操作系统提供程序段和代码段的地址
脚本中ENTRY(start)代表程序的入口点,程序执行首先会执行的指令就是入口点
.表示的是当前地址,. = 0x100000就是给当前地址赋值 .text就是代码段,*(.text)表示所有输入文件的text段,*是通配符

.text :
{
	*(.text)
	. = ALIGN(4096);
}

上面这段代码就是把所有输入文件的text段放到输出文件的text段,且输出文件的text段的地址为当前地址即0x100000, . = ALIGN(4096)表示当前地址为对齐4096字节后的地址
后面就是以此类推,.data是数据段,.bss是未初始化数据段就是未初始化的全局变量,.tstab和.stabstr是调试信息
/DISCARD/是丢弃段,被分配到这个段里的输入文件中的段不会包含在输出文件中,在这个脚本中就是所有的.comment和.eh_frame段不会包含在输出文件中

制作启动镜像

制作虚拟软盘镜像

选用软盘安方镜像是因为软盘简单,首先先制作一个空的虚拟软盘镜像

dd if=/dev/zero of=floppy.img bs=512 count=2880

然后以FAT-12格式来格式化该软盘镜像

mkdosfs -F 12 floppy.img

这样一块FAT12格式的空的虚拟软盘就做好了,顺带一提当前的目录结构是这样的

在软盘中安装grub

首先去下载grub 地址 我选了0.97版本,早期版本配置比较简单,下载编译好的软件包省去自己编译,就是文件名带i-386的版本
然后是挂载镜像,跟第一天的makefile中写的一样,把floppy.img挂载到/mnt/kernel

sudo mount floppy.img /mnt/kernel

当然makefile写了就要用,所以也可以这样挂载

make mount_image

然后在镜像文件中建立相对应的文件夹,并且将GRUB的stage1和stage2复制进去

sudo mkdir -p /mnt/kernel/boot/grub
sudo cp ./grub-0.97-i386-pc/boot/grub/stage1 /mnt/kernel/boot/grub/
sudo cp ./grub-0.97-i386-pc/boot/grub/stage2 /mnt/kernel/boot/grub/

然后在/mnt/kernel/boot/grub建立两个配置文件grub.conf和menu.lst,由它们来告诉GRUB我们的操作系统是什么名字,内核放在什么地方
grub.conf的内容是

title=Time 0.01
root (fd0)
kernel /time_kernel

menu.lst的内容是

timeout 1

    title   Time 0.01
        root (fd0)
        kernel /time_kernel
            module /initrd

然后进入grub命令行,如果当前操作系统没安装grub命令行可以先安装
在这里我失败了,整了半天也进不了grub的命令行,没找到解决办法,最后用了教程提供的镜像2333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章