回复 2# jeppeter
感谢指导,在你分析的基础上我又理解后分析了一下,请指导:函数参数: x=to addr=from err=4 itype=”b”/”w”/”l” rtype=”b”/”w”/”” ltype=”=q”/”=r”/”=r” errret=4 函数源码: #define __get_user_asm(x, addr, err,itype, rtype, ltype, errret) \ __asm____volatile__( \ /*movb/movw/movl addr, %b/w/“”1*/ "1: mov"itype"%2,%"rtype"1\n" \ /**/ "2:\n" \ /*把下面的代码放入.fixup 节中*/ ".section.fixup,\"ax\"\n" \ /*err= errret */ "3: movl %3,%0\n" \ /*把reg1即x置0*/ " xor"itype"%"rtype"1,%"rtype"1\n" \ /**/ " jmp 2b\n" \ /*恢复编译到前面保存的节中*/ ".previous\n" \ /*这里指定异常表项,参见“参考文章3”*/ ".section__ex_table,\"a\"\n" \ /**/ " .align 4\n" \ /*1b地址的指令引起异常,就跳转到3b*/ " .long 1b,3b\n" \ /**/ ".previous" \ :"=r"(err), ltype (x) \ :"m"(__m(addr)), "i"(errret), "0"(err)) 函数处理流程: 输出部: 代码:: "=r"(err), ltype (x) 解释: %0: err=r0 %1: x=寄存器 (ltype(=q/=r/=r)) 输入部: 代码::"m"(__m(addr)), "i"(errret), "0"(err)) 解释: %2: addr内存单元 %3: errret直接操作数 %4: r0=err 损坏部:: 无 指令部: 1、具体指令含义参见代码注释 2、处理流程:执行1处的指令,成功则结束;失败,根据异常表项《.section __ex_table,\"a\"\n"》,跳转到3b处执行,设置寄存器值后跳转到2b处结束
|