大家好,宋老师好。
小弟正在读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.