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

链接器脚本

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
* 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段,*是通配符

1
2
3
4
5
.text :
{
*(.text)
. = ALIGN(4096);
}

上面这段代码就是把所有输入文件的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
2
3
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的内容是

1
2
3
title=Time 0.01
root (fd0)
kernel /time_kernel

menu.lst的内容是

1
2
3
4
5
6
timeout 1

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

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

本文标题:从零实现一个操作系统-day3

文章作者:

发布时间:2020年04月18日 - 22:04

最后更新:2020年04月21日 - 01:04

原始链接:http://startcraft.cn/post/99706796.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------The End-------------