vaddr.h

本文介绍了Pintos操作系统中关于内存管理的部分概念和技术细节,包括有效地址验证、页大小定义及页地址的计算方法。解释了如何通过位移操作获取页号,并提供了一个实用的函数示例,用于计算给定地址对应页面的起始地址。

从threads/Vaddr.h中得知,意思是Valid address.即里面的函数都是判断地址空间的有效性。pintos一页为4KB。

31 12 11 0

+--------------+----------+

| page number | offset |

+--------------+----------+

因此第一页的末尾地址为100....0后面有12个0,第二页末尾是第一页末尾左移一位。

#define PGSHIFT 0

#define PGBITS 12

#define PGMASK BITMASK(PGSHIFT, PGBITS)

已知一个32位地址,向右移12位,得到的就是page number。已知一个虚拟地址,举个例子,

static inline void *pg_round_down (const void *va)

{

return (void *) ((uintptr_t) va & ~PGMASK);

}

这个函数的目的是给定一个地址,需要返回一个页的起始地址,即把最后12位都变成0.

[root@test-node1 tools]# ./opensnoop In file included from /virtual/main.c:2: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/uapi/linux/ptrace.h:143: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/ptrace.h:5: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/segment.h:266:2: error: expected '(' after 'asm' alternative_io ("lsl %[seg],%[p]", ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:240:2: note: expanded from macro 'alternative_io' asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:39: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/thread_info.h:12: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/page.h:12: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/page_64.h:49:2: error: expected '(' after 'asm' alternative_call_2(clear_page_orig, ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:256:2: note: expanded from macro 'alternative_call_2' asm_inline volatile (ALTERNATIVE_2("call %P[old]", "call %P[new1]", feature1,\ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:39: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/thread_info.h:53: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/cpufeature.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/processor.h:24: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/special_insns.h:207:2: error: expected '(' after 'asm' alternative_io(".byte " __stringify(NOP_DS_PREFIX) "; clflush %P0", ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:240:2: note: expanded from macro 'alternative_io' asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:39: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/thread_info.h:53: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/cpufeature.h:5: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/processor.h:786:2: error: expected '(' after 'asm' alternative_input(BASE_PREFETCH, "prefetchnta %P1", ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:221:2: note: expanded from macro 'alternative_input' asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:39: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/thread_info.h:53: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/cpufeature.h:5: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/processor.h:798:2: error: expected '(' after 'asm' alternative_input(BASE_PREFETCH, "prefetchw %P1", ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:221:2: note: expanded from macro 'alternative_input' asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:147:2: error: expected '(' after 'asm' WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count); ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:124:3: note: expanded from macro 'WARN' __WARN_printf(TAINT_WARN, format); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:93:3: note: expanded from macro '__WARN_printf' __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:79:2: note: expanded from macro '__WARN_FLAGS' _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:27: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/preempt.h:78: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/preempt.h:7: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/thread_info.h:163:6: error: expected '(' after 'asm' if (WARN_ON_ONCE(bytes > INT_MAX)) ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:98:3: note: expanded from macro 'WARN_ON_ONCE' __WARN_FLAGS(BUGFLAG_ONCE | \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:79:2: note: expanded from macro '__WARN_FLAGS' _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/pid.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rculist.h:11: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rcupdate.h:895:2: error: expected '(' after 'asm' WARN_ON_ONCE(func != (rcu_callback_t)~0L); ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:98:3: note: expanded from macro 'WARN_ON_ONCE' __WARN_FLAGS(BUGFLAG_ONCE | \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:79:2: note: expanded from macro '__WARN_FLAGS' _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:15: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sem.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/uapi/linux/sem.h:5: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/ipc.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/rhashtable-types.h:15: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/workqueue.h:9: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/timer.h:6: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/ktime.h:171:2: error: expected '(' after 'asm' WARN_ON(div < 0); ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:115:3: note: expanded from macro 'WARN_ON' __WARN(); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:90:19: note: expanded from macro '__WARN' #define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN)) ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:79:2: note: expanded from macro '__WARN_FLAGS' _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:20: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/hrtimer.h:19: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/percpu.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/smp.h:68: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/smp.h:13: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/apic.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/fixmap.h:190: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/fixmap.h:19: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/mm_types.h:14: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/uprobes.h:49: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/uprobes.h:13: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/notifier.h:16: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/srcu.h:179:2: error: expected '(' after 'asm' WARN_ON_ONCE(idx & ~0x1); ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:98:3: note: expanded from macro 'WARN_ON_ONCE' __WARN_FLAGS(BUGFLAG_ONCE | \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:79:2: note: expanded from macro '__WARN_FLAGS' _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:20: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/hrtimer.h:19: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/percpu.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/smp.h:68: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/smp.h:13: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/apic.h:11: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/fixmap.h:190: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/fixmap.h:38:2: error: expected '(' after 'asm' BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/asm-generic/bug.h:62:57: note: expanded from macro 'BUG_ON' #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0) ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:73:2: note: expanded from macro 'BUG' _BUG_FLAGS(ASM_UD2, 0); \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/bug.h:35:2: note: expanded from macro '_BUG_FLAGS' asm_inline volatile("1:\t" ins "\n" \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ In file included from /virtual/main.c:4: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/sched.h:20: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/hrtimer.h:19: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/percpu.h:7: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/smp.h:68: In file included from /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/smp.h:13: /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/apic.h:107:2: error: expected '(' after 'asm' alternative_io("movl %0, %P1", "xchgl %0, %P1", X86_BUG_11AP, ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/arch/x86/include/asm/alternative.h:240:2: note: expanded from macro 'alternative_io' asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \ ^ /lib/modules/5.4.203-1.el7.elrepo.x86_64/build/include/linux/compiler_types.h:214:24: note: expanded from macro 'asm_inline' #define asm_inline asm __inline ^ 12 errors generated. Traceback (most recent call last): File "./opensnoop", line 180, in <module> b = BPF(text=bpf_text) File "/usr/lib/python2.7/site-packages/bcc/__init__.py", line 325, in __init__ raise Exception("Failed to compile BPF text") Exception: Failed to compile BPF text
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值