天衣有缝

冠盖满京华,斯人独憔悴~
posts - 35, comments - 115, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用grub中的内核demo(原创)

Posted on 2007-04-20 17:30 天衣有缝 阅读(1338) 评论(0)  编辑 收藏 引用 所属分类: os stuff

1.       下载grub-0.97源程序解压缩,进入到docs目录。找到boot.S  kernel.c  multiboot.h这三个文件,就是我们的试验对象。原理可以搜索多重引导规范multiboot,在grubofficial site可以找到。有不清楚的过程可以和我联系(msn及邮件都是这个:jinglexy at yahoo dot com dot cn)作者:http://www.cppblog.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.       运行make指令编译,生成testos.bin文件。这样就是我们的”kernel_demo”,放到virtual pc 2007中运行一下(现在这个软件已经免费了,可以到微软官方网站下载),是不是程序打印的结果呢?(将内核testos.bin拷贝到安装了grub的软盘过程请参考这个博客的前面一篇文章,有不清楚的地方可以一起讨论一下哦)

5.       疑问:如果将虚拟地址改为0xc0000000grub装载kernel时会打印“Selected item cannot fit into memory”,这个是什么缘故? 答案:刚刚看了mlxos内核源程序,大致的猜想是:grub初始化csds04g地址空间,没有开启分页,所以0xc0000000地址范围 会出错。如果要在链接脚本里面使用0xc0000000的虚拟地址,就需要修改源程序,例如multiboot_entry1个指令改为这样:
movl    $(stack + STACK_SIZE - 0xc0000000), %esp
其他的类似。

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理