__pv_stub的疑问

132 views
Skip to first unread message

Tom Cubie

unread,
Mar 27, 2012, 3:01:53 AM3/27/12
to linux...@googlegroups.com
大家好,宋老师好。

小弟正在读arm内核启动部分代码(arch/arm/kernel/head.S),到了 __fixup_pv_table部分的__fixup_a_pv_table函数。
这里定义了__pv_table_begin和__pv_table_end两个符号,它们是.pv_table段的起始和结束位置(arch/arm/kernel/vmlinux.lds)。
声明在.pa_table段里的函数好像都来自于arch/arm/include/asm/memory.h里。这里面有一个宏定义

#define __pv_stub(from,to,instr,type)           \
    __asm__("@ __pv_stub\n"             \
    "1: " instr "   %0, %1, %2\n"       \
    "   .pushsection .pv_table,\"a\"\n"     \
    "   .long   1b\n"               \
    "   .popsection\n"              \
    : "=r" (to)                 \
    : "r" (from), "I" (type))

看起来貌似是一条指令,请问这个如何理解。

我单步调试过执行的时候,发现__fixup_a_pv_table好像只是把__pv_table_begin和__pv_table_end之间的每一个内存内容取出来,
然后改了最低的8位,又写回去。我觉得这样做和这个__pv_stub的宏定义有关,请问这个怎么理解。

--
Keep simple, stay foolish.
 

Reply all
Reply to author
Forward
0 new messages