最近突然对Unix内核有了兴趣, 在网上 google 了一下,遇到的是 OSD, 一个
关于操作系统开发的网站 OSD, 学习了基本原理之后, 决定实践一下。MinGW32,
NASM, OSD, GRUB 都下载,安装,开了个虚拟机,可是启动之后发现GRUB成功装载
内核, 但是数据段始终无法成功加载,内核初始化失败,郁闷啊!...
郁闷中想起久违的FreeBSD, 开始吧!安装 FreeBSD 5.4 + NASM, make,
make install 投Unix, 情况依旧,郁闷!换内核,改用bkerndev的 Bran内核, 运
行正常了,高兴!可是c语言代码陆续加入内核后,GRUB 终于不高兴了,提示:
Error 13 : Invalid or unsupported executable format
改为 elf 后却提示:
Error 28: Selected item cannot fit into memory.
书到用时方恨少,只知道FreeBSD缺省的执行文件类型是 elf, 可从来没有见过
真面目. 看书去, elf, ld, objdump, section, 终于找到原因了: 如果内核是 elf
格式,只能有三个 SECTION: .text .data .bss , 否则 GRUB 0.9x 会提示:
Error 28: Selected item cannot fit into memory.
用 objdump -h main.o 的结果:
----------------------------------------------------
main.o: file format elf32-i386-freebsd
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000010c 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000140 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000140 2**2
ALLOC
3 .rodata.str1.1 00000015 00000000 00000000 00000140 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 00000025 00000000 00000000 00000155 2**0
CONTENTS, READONLY
----------------------------------------------------
下载的Bran内核的链接脚本 link.ld
----------------------------------------------------
001 OUTPUT_FORMAT("binary")
002 ENTRY(start)
003 phys = 0x00100000;
004 SECTIONS
005 {
006 .text phys : AT(phys) {
007 code = .;
008 *(.text)
009 . = ALIGN(4096);
010 }
011 .data : AT(phys + (data - code))
012 {
013 data = .;
014 *(.data)
015 . = ALIGN(4096);
016 }
017 .bss : AT(phys + (bss - code))
018 {
019 bss = .;
020 *(.bss)
021 . = ALIGN(4096);
022 }
023 end = .;
024 }
----------------------------------------------------
第1行改为OUTPUT_FORMAT("elf-i386")(删除亦可, FreeBSD的用缺省elf)
第8行后加两行
*(.rodata*)
*(.comment*)
这样,ld 就会把 .rodata 和 .comment 合并到 .text 这一节中去了,输出的文件
就只有.text .data .bss三个 SECTION, GRUB 就能能成功装载!
相关文档
Bran的内核开发指南
http://rammaker.cosoft.org.cn/store/bkerndev_zh_CN/
OSD
http://my.execpc.com/~geezer/osd/index.htm
开源Unix的交叉参考
http://fxr.watson.org/
NASM (Netwide Assembler)
http://nasm.sourceforge.net/
GRUB
官方文档 :http://www.gnu.org/software/grub
http://linux.chinaunix.net/bbs/viewthread.php?tid=890961&extra=page%3D1