博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

os fans

MSN & Mail:jinglexy at yahoo dot com dot cn
操作系统开发博客圈:http://blog.chinaunix.net/group/group_507.html
qq group(os fans): 3*2*2*6*2*9*2
  jinglexy.cublog.cn

关于作者
马甲:天衣有缝
职业:linux driver
位置:徐家汇上海交大
|| << >> ||
我的分类


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

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

 

1.       下载grub-0.97源程序解压缩,进入到docs目录。找到boot.S  kernel.c  multiboot.h这三个文件,就是我们的试验对象。原理可以搜索多重引导规范multiboot,在grubofficial site可以找到。有不清楚的过程可以和我联系(msn及邮件都是这个:jinglexy at yahoo dot com dot cn2007.04.05

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”,这个是什么缘故?哪个大虾愿意解释一下,谢了哦,邮件和msn都是jinglexy at yaoo dot com dot cn,有了答案我就在这里贴出来。

发表于: 2007-04-05,修改于: 2008-05-25 13:11,已浏览499次,有评论2条 推荐 投诉


网友评论
网友: jinglexy 时间:2007-04-06 16:46:49 IP地址:211.103.76.★
grub的初始化我也了解的不是很清楚。刚刚看了mlxos源程序,大致的猜想是:grub初始化cs和ds为0到4g地址空间,没有开启分页,所以0xc0000000地址范围会出错。如果要在链接脚本里面使用0xc0000000的虚拟地址,就需要修改源程序,例如multiboot_entry第1个指令改为这样:
movl    $(stack + STACK_SIZE - 0xc0000000), %esp
其他的类似。

网友: 本站网友 时间:2007-05-30 20:48:05 IP地址:61.14.130.★
mlxos最初就是从multiboot spec的示例代码开始的。

 发表评论