- 论坛徽章:
- 0
|
本帖最后由 chobit_s 于 2011-01-26 22:23 编辑
回复 4# zd零
决定内核镜像最终地址(0xc0400000 / 0xc1000000)不是bootloader
虽然bootloader把整个内核加载到内存中(grub不了解,lilo加载的在内核,最后还要内核启动代码调整一下内核位置),编译成的内核整体大致是:
|1|2|
1--head(负责解压|2|到0xc0400000 或 0xc1000000)
2--head + kernel (这部分被加载到内存4MB或16MB处,决定这个4MB还是16MB是内核自己,
见source/arch/x86/kernel/vmlinux.lds.S(2.6.34)中
. = LOAD_OFFSET + LOAD_PHYSICAL_ADDR; //这里0xc0000000 + 4MB / 16MB
# cat /proc/kallsyms |grep c0400000
c0400000 T startup_32 //这个函数是在|2|的开始处,内核被|1|解压后就跳到这里
c0400000 T _text
-------
我以上说的忽略了initrd 
grub真不知道, initrd最近也才开始琢磨 |
|