XEN: get_cpu_info
上一篇 / 下一篇 2007-12-12 00:35:24 / 个人分类:Virtualization
[http://hi.baidu.com/realvm]
x3p4[Nj|h0;KG0K]*HfM0./include/asm-x86/current.h 中 get_cpu_info 的代码:
A9^0N_2x%f0
a ^5Z L'F6v9d+v0 23 static inline struct cpu_info *get_cpu_info(void)
V&A2v4p6c@0 24 {
@6tqwtie0 25 struct cpu_info *cpu_info;51Testing软件测试网Vib4u|*~
26 __asm__ ( "and %%"__OP"sp,%0; or %2,%0"51Testing软件测试网;C/|#Tw:Q
db^l
27 : "=r" (cpu_info)51Testing软件测试网K6D5f x-G f;z
28 : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-sizeof(struct cpu_info))51Testing软件测试网cL5boBFq[
29 );
U t3d BuB
eR%}[0 30 return cpu_info;
tc/AU}gbr0 31 }51Testing软件测试网8C~RCu^-{f
?Y
K.r2H@,SY5z_0看起来有些糊涂,实际上 get_cpu_info 返回的就是距离栈底sizeof(struct cpu_info)的地址,看看代码编译后的情况更清楚:
"W"C)}pT0
G3EB)ELKF j&F00000031f <get_cpu_info>:
R9Zd9oqt*^%H031f: 55 push %ebp51Testing软件测试网
v.t!yro%`
320: 89 e5 mov %esp,%ebp
rw+{5P;q0322: 83 ec 10 sub $0x10,%esp51Testing软件测试网*} gs6f+{
{B,x;]
51Testing软件测试网;Xi!J#p\hf
325: b8 00 c0 ff ff mov $0xffffc000,%eax
W
J
s;LZgR-c?0 $0xffffc000 即是 (~(STACK_SIZE-1)),gcc 用了eax 作为 Output 的目标( cpu_info ), "0" (~(STACK_SIZE-1)) 指示~(STACK_SIZE-1)用和cpu_info 同样的目标,所以gcc产生这行代码51Testing软件测试网6Y3|,I9`
R!QX'P*RU
51Testing软件测试网 A`4K(b4a ?.Fp7m(d
32a: 21 e0 and %esp,%eax
tp1t0]#B0 %0 被替换成 %eax
Y kTeLue`0 执行后,%eax 是栈顶(距栈底STACK_SIZE=16K)51Testing软件测试网L MM
I],Xno
m
%h,@k-oW Q[hv032c: 0d b4 3f 00 00 or $0x3fb4,%eax
;EWM!uwrc2N0 $0x3fb4 就是 (STACK_SIZE-sizeof(struct cpu_info) 51Testing软件测试网/CPI|V
执行后,%eax - 栈底 = sizeof(struct cpu_info) ,这段空间XEN在引导的时候就保留出来了:51Testing软件测试网\&M)H!f2E#o
( /arch/x86/boot/x86_32.S )51Testing软件测试网,M2]A Ho!]T