- 论坛徽章:
- 0
|
回复 1# chishanmingshen
个人理解:
ptep_get_and_clear()会获取原来的页表项值并清除,返回的应该是原始的页表项值- #ifdef CONFIG_SMP
- static inline pte_t native_ptep_get_and_clear(pte_t *xp)
- {
- return __pte(xchg(&xp->pte_low, 0)); //这里返回的也是原值,xchg的动作是设置新值并返回旧值
- }
- #else
- #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp)<---here
- #endif
复制代码 下面是xchg在x86 32下的实现:
- #define __xchg(x, ptr, size) \
- ({ \
- __typeof(*(ptr)) __x = (x); /*这里先传入新值*/ \
- switch (size) { \
- case 1: \
- asm volatile("xchgb %b0,%1" \
- : "=q" (__x), "+m" (*__xg(ptr)) \
- : "0" (__x) \
- : "memory"); /* 这里xchgb指令会把__x和*ptr里的内容交换 */ \
- break; \
- case 2: \
- asm volatile("xchgw %w0,%1" \
- : "=r" (__x), "+m" (*__xg(ptr)) \
- : "0" (__x) \
- : "memory"); /* 这里xchg2指令会把__x和*ptr里的内容交换 */ \
- break; \
- case 4: \
- asm volatile("xchgl %0,%1" \
- : "=r" (__x), "+m" (*__xg(ptr)) \
- : "0" (__x) \
- : "memory"); /* 这里xchgl指令会把__x和*ptr里的内容交换 */ \
- break; \
- default: \
- __xchg_wrong_size(); \
- } \
- __x; /*这里返回旧值*/ \
- })
复制代码 |
|