Posted on 2007-04-20 17:30
天衣有縫 閱讀(1353)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
os stuff
1.
下載grub-0.97源程序解壓縮,進(jìn)入到docs目錄。找到boot.S kernel.c
multiboot.h這三個(gè)文件,就是我們的試驗(yàn)對(duì)象。原理可以搜索多重引導(dǎo)規(guī)范multiboot,在grub的official site可以找到。有不清楚的過程可以和我聯(lián)系(msn及郵件都是這個(gè):jinglexy at yahoo dot com dot cn)作者:http://www.shnenglu.com/jinglexy上海體育館
2.
建立testos.lds鏈接腳本:
1 OUTPUT_FORMAT("elf32-i386")
2 ENTRY(start)
3 virt = 0x100000; /* 1 meg */
4 phys = 0x100000; /* 1 meg */
5 SECTIONS
6 { .text virt : AT(phys)
7 { code = .;
8 *(.text)
9 . =
ALIGN(4096);
10 }
11 .data : AT(phys + (data - code))
12 { data = .;
13 *(.data)
14 . =
ALIGN(4096);
15 }
16 .bss : AT(phys + (bss - code))
17 { bss = .;
18 *(.bss)
19 *(COMMON)
20 . = ALIGN(4096);
21 }
22 end = .;
23 }
24
|
3.
建立Makefile編譯腳本:
1 all:
2 gcc -I./ -nostdlib -fno-builtin -O2 -Wall -c kernel.c
3 gcc -I./ -nostdlib -fno-builtin -O2 -Wall -c boot.S
4 ld kernel.o
boot.o -T testos.lds -o testos.bin
5 sudo mount -o
loop ./floppy.img mnt
6 sudo rm -f
mnt/boot/testos.bin
7 sudo install
./testos.bin mnt/boot
8 ls mnt/boot
9 sudo umount mnt
10 sudo sync
11
|
4.
運(yùn)行make指令編譯,生成testos.bin文件。這樣就是我們的”kernel_demo”,放到virtual pc 2007中運(yùn)行一下(現(xiàn)在這個(gè)軟件已經(jīng)免費(fèi)了,可以到微軟官方網(wǎng)站下載),是不是程序打印的結(jié)果呢?(將內(nèi)核testos.bin拷貝到安裝了grub的軟盤過程請(qǐng)參考這個(gè)博客的前面一篇文章,有不清楚的地方可以一起討論一下哦)
5.
疑問:如果將虛擬地址改為0xc0000000,grub裝載kernel時(shí)會(huì)打印“Selected
item cannot fit into memory”,這個(gè)是什么緣故? 答案:剛剛看了mlxos內(nèi)核源程序,大致的猜想是:grub初始化cs和ds為0到4g地址空間,沒有開啟分頁,所以0xc0000000地址范圍 會(huì)出錯(cuò)。如果要在鏈接腳本里面使用0xc0000000的虛擬地址,就需要修改源程序,例如multiboot_entry第1個(gè)指令改為這樣:
movl $(stack + STACK_SIZE - 0xc0000000), %esp
其他的類似。