XEN: get_cpu_info

上一篇 / 下一篇  2007-12-12 00:35:24 / 个人分类:Virtualization

[http://hi.baidu.com/realvm]

x3p4[N j|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 {
@6tqw tie0     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-Gf;z
     28               : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-sizeof(struct cpu_info))51Testing软件测试网 cL5boB Fq[
     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 kT e Lue`0                执行后,%eax 是栈顶(距栈底STACK_SIZE=16K)51Testing软件测试网L MM I],Xn o m

%h,@k-oW Q[hv032c:   0d b4 3f 00 00          or     $0x3fb4,%eax
;E W M!u wrc2N0                $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]AHo!]T

o0ny ^#W0               59 1:      lss     stack_start-__PAGE_OFFSET,%esp
m ^~]yb0               60         add     $(STACK_SIZE-CPUINFO_sizeof-__PAGE_OFFSET),%esp
1N4]8TvLQ0                       此处 CPUINFO_sizeof = 76 = sizeof(struct cpu_info)
D/g(|&BT2w \0                ...
-SRN;F1\H"Z0             51Testing软件测试网5o]p!w6Mo#K\(w
                196 ENTRY(stack_start)51Testing软件测试网z/@9?q&D/i
              197         .long cpu0_stack
+l)s8c a2R0              198         .long __HYPERVISOR_DS
1@pu1uV6` T0                ....51Testing软件测试网XHPSqy
                256 ENTRY(cpu0_stack)
!M:btB&fx$rX t0              257         .fill STACK_SIZE,1,051Testing软件测试网ja(fpI\m
51Testing软件测试网8Uv8t!A@C[&y&ln|

+q0A!I[9pY'bh0331:   89 45 fc                mov    %eax,0xfffffffc(%ebp)
KS |!_C\h!S{+R0                0xfffffffc(%ebp) = -4 (%ebp) , 是cpu_info地址
K)g;At&U\;n051Testing软件测试网7KM6R6w,k%~2ujM
334:   8b 45 fc                mov    0xfffffffc(%ebp),%eax
2}By0Sk D d%o/p*\0337:   c9                      leave
Q a)Ki&^$nuH;L0338:   c3                      ret
(^nHZo ]051Testing软件测试网0p @_2t/EyWt$M


TAG: virtualization Xen Virtualization

 

评分:0

我来说两句

Open Toolbar