|
发表于 2005-3-23 18:04:30
|
显示全部楼层
Post by nhjidle
刚看了会grub2的源代码,感觉grub2比起grub来更象是一个os ,而且其中没有了stage1.5 stage2概念,代码显得更加简洁:)
但还是有不少问题不太明白 :%
1.boot.S是安装程序拷贝到mbr(sector 0)中的,它读入紧跟mbr的第一个sector(sector 1)到0x8000,然后跳到0x8000处开始执行。sector1中方的是什么?(startup.S?,应该不是,因为grubkernel的读入是在diskboot.s中,要是startup.S那么kernel就读不进来了。)
执行流程为:
boot.S --> bootdisk.S --> startup.S
Post by nhjidle
2.关于diskboot.s,它将grub kernel读到0x8200开始处,然后跳到0x8200开始执行,(grub kernel是从sector2开始的?)
* _start is loaded at 0x2000 and is jumped to with CS:IP 0:0x2000 in kernel.
是在哪里将它load到0x2000的,又是在哪一步开始执行的?而且它对绝对地址的计算却为
#define ABS(x) (x-_start+GRUB_BOOT_MACHINE_KERNEL_ADDR),应该是
#define ABS(x) (x-_start+0x2000)才对啊,??
这段注释是开发者的错误,应该去掉。
0x2000在GRUB Legacy(0.9x)中装载stage1.5,但GRUB2没有stage1.5,故被弃用。
Post by nhjidle
3.pxeboot.s 0x8200
* _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00 */
ljmp $0, $0x8200
. = 0x8000 - 0x7C00 -1
.byte 0
它怎么会被放到0x7c00呢?而且 . = 0x8000 - 0x7C00 -1不好理解,既然是从0x7c00开始的,那么地址怎么会下降到 0x8000-0x7c00??
pxeboot.S的作用和boot.S类似,但用于网络启动。
Post by nhjidle
4.startup.s的作用主要是转入保护模式,开启a20地址线,解压内核(从kernel的1k开始,kernel的前面1k是没压缩的),拷贝模块,清零bss段,,然后跳到main.c的grub_main开始执行,startup.s是放在哪个位置?而且里面的START_SYMBOL一直没找到它的定义 :p
startup.S被bootdisk.S加载至0x8200。
其实startup.S有两种作用,一是负责后续内核的环境初始化,也就是你所提及的流程;二是为后续内核提供设备驱动层,这些设备驱动层的底层是BIOS例程,封装INT13H以提供磁盘读取驱动,封装INT15H以提供内存信息访问,封装INT10H以及INT16H以提供键盘输出、屏幕显示驱动。后者和前者的代码是分开的。前者的体积为512B,再加上bootdisk.S的512B,就是1KB。而这1KB,正如你所言,没有被压缩。
START_SYMBOL由GRUB2的源码目录里的conf目录中的文件指定,其实就是_start。 |
|