從零實現一個操作系統-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

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