我的博客 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