分类:
2007-04-05 09:40:46
使用grub中的内核demo(原创)
1. 下载grub-0.97源程序解压缩,进入到docs目录。找到boot.S kernel.c multiboot.h这三个文件,就是我们的试验对象。原理可以搜索多重引导规范multiboot,在grub的official site可以找到。有不清楚的过程可以和我联系(msn及邮件都是这个:jinglexy at yahoo dot com dot cn)2007.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 -
3 gcc - 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. 疑问:如果将虚拟地址改为0xc0000000,grub装载kernel时会打印“Selected item cannot fit into memory”,这个是什么缘故?哪个大虾愿意解释一下,谢了哦,邮件和msn都是jinglexy at yaoo dot com dot cn,有了答案我就在这里贴出来。