XEN 启动代码 x86_32.S 中 __PAGE_OFFSET 的说明

上一篇 / 下一篇  2007-12-12 00:38:18 / 个人分类:Virtualization

[http://hi.baidu.com/realvm]51Testing软件测试网(uJ1Ry)Ek#E {

SeG)@}M4?0x86_32.S 中经常出现 __PAGE_OFFSET ,反复看了相关代码和编译过程,原因应该是这样的:
O'D` N6l!S|D s!b2}051Testing软件测试网2WN3mO8bA*X
1,在 ./include/asm-x86/x86_32/page.h 有 __PAGE_OFFSET 的定义:
5I ~\A BS\x0#define __PAGE_OFFSET           (0xFF000000)
)P-p)?:m'ne051Testing软件测试网%B{ E8^5YJ+B,JaM3n
2, xen 编译时的映像布局由 arch/x86/xen.lds 控制:51Testing软件测试网/~8~%o:H#uH!\
# head xen.lds
Gkm%N.A9_S0OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")51Testing软件测试网8cI {$p8\v:~
OUTPUT_ARCH(i386)
l3lEdg \0ENTRY(start)
] z jcJV0PHDRS51Testing软件测试网c P N|+Q"p&PVZ
{
SqMW+_9t ~0text PT_LOAD ;51Testing软件测试网*E|;Z2]+BO}
}
1J^!kOF0SECTIONS
6m:o$u%JdRHa^0{51Testing软件测试网^~6@y6_b2? N
. = 0xFF000000 + 0x100000;51Testing软件测试网6a {]7F?f}$t7u
51Testing软件测试网g2t5BFZ elZ
其中 0xFF000000 即为 __PAGE_OFFSET 的值
}L5?%bx051Testing软件测试网4h3H9^I s4~'RRi"D/H
所以 xen-syms 的起始地址是: 0xFF000000 + 0x100000 = 0xFF100000
/Bz*@V.PE"W0
i4j)W5Y)Iy0CaP}02, xen 其实是由 xen-syms 通过 mkelf32 生成的:51Testing软件测试网,Umm2EU6w h8Y7n
51Testing软件测试网 X w1O @^xp:VN
./boot/mkelf32 /mnt/home/yxx/xen-3.0.4_1-src/xen/xen-syms /mnt/home/yxx/xen-3.0.4_1-src/xen/xen 0x100000 \51Testing软件测试网x)Q)Od@fJDW
`nm -nr /mnt/home/yxx/xen-3.0.4_1-src/xen/xen-syms | head -n 1 | sed -e 's/^\([^ ]*\).*/0x\1/'`
;K1|+U+J}(E7Q!| @u S051Testing软件测试网/z^$fTe"g9C?2x `-[
命令行参数中 0x100000 实际上就是程序映像被mkelf32转换后的起始地址,用 readelf 看一下:
.qp cwJ1JR0# readelf -l xen
q*h4{${+y @U051Testing软件测试网9q&]1h6r8A
Elf file type is EXEC (Executable file)
%U `7m-TZ:Be7tV-C0Entry point 0x10000051Testing软件测试网A(s$x(x-f,s/C_"j EM
There are 1 program headers, starting at offset 52
|+[g0TPr,c+i051Testing软件测试网.dxh0O7?
Program Headers:
P v w2mg0Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz Flg Align
RD C WJ.U lw]0LOAD           0x000080 0x00100000 0x00100000 0xb86e4 0x107000 RWE 0x40
@NKYb"sPd%v051Testing软件测试网Z&AeP X
Section to Segment mapping:51Testing软件测试网1c(l5};](qC eu;SmC
Segment Sections...51Testing软件测试网7Z]7y,p@
   00     .text51Testing软件测试网6|yi'N`GC W u
51Testing软件测试网-U0a"N?MP a"Rf
51Testing软件测试网 zP W5s E
上面VirtAddr 列对应的值就是0x100000, grub根据VirtAddr来装载xen的,所以当xen开始运行的时候,起始地址就是
w2b7Jv2@00x100000,但编译连接的时候,x86_32.S 的所有的符号都是从 0xFF100000 计数的,如要获得实际地址,就必须减去 0xFF000000
;yZ7Q4oR$gu8x0

1Z@2NtL"g/Zo0
相关阅读:

TAG: virtualization Xen Virtualization

 

评分:0

我来说两句

Open Toolbar