最近突然对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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐