链接器脚本
第一天的链接器脚本我们没有看懂,今天就来把它弄清楚吧,先把脚本代码弄过来
1 | /* |
首先可执行文件分为程序段和代码段,当操作系统调用这个可执行文件时,该文件应该给操作系统提供程序段和代码段的地址
脚本中ENTRY(start)代表程序的入口点,程序执行首先会执行的指令就是入口点
.表示的是当前地址,. = 0x100000就是给当前地址赋值 .text就是代码段,*(.text)表示所有输入文件的text段,*是通配符
1 | .text : |
上面这段代码就是把所有输入文件的text段放到输出文件的text段,且输出文件的text段的地址为当前地址即0x100000, . = ALIGN(4096)表示当前地址为对齐4096字节后的地址
后面就是以此类推,.data是数据段,.bss是未初始化数据段就是未初始化的全局变量,.tstab和.stabstr是调试信息
/DISCARD/是丢弃段,被分配到这个段里的输入文件中的段不会包含在输出文件中,在这个脚本中就是所有的.comment和.eh_frame段不会包含在输出文件中
制作启动镜像
制作虚拟软盘镜像
选用软盘安方镜像是因为软盘简单,首先先制作一个空的虚拟软盘镜像
1 | dd if=/dev/zero of=floppy.img bs=512 count=2880 |
然后以FAT-12格式来格式化该软盘镜像
1 | mkdosfs -F 12 floppy.img |
这样一块FAT12格式的空的虚拟软盘就做好了,顺带一提当前的目录结构是这样的
在软盘中安装grub
首先去下载grub 地址 我选了0.97版本,早期版本配置比较简单,下载编译好的软件包省去自己编译,就是文件名带i-386的版本
然后是挂载镜像,跟第一天的makefile中写的一样,把floppy.img挂载到/mnt/kernel
1 | sudo mount floppy.img /mnt/kernel |
当然makefile写了就要用,所以也可以这样挂载
1 | make mount_image |
然后在镜像文件中建立相对应的文件夹,并且将GRUB的stage1和stage2复制进去
1 | sudo mkdir -p /mnt/kernel/boot/grub |
然后在/mnt/kernel/boot/grub建立两个配置文件grub.conf和menu.lst,由它们来告诉GRUB我们的操作系统是什么名字,内核放在什么地方
grub.conf的内容是
1 | title=Time 0.01 |
menu.lst的内容是
1 | timeout 1 |
然后进入grub命令行,如果当前操作系统没安装grub命令行可以先安装
在这里我失败了,整了半天也进不了grub的命令行,没找到解决办法,最后用了教程提供的镜像2333