慢慢欣赏linux pud_offset解析

本文深入解析了Linux内核中PUD(Page Upper Directory)级别的页表操作,包括pud_offset函数的实现,涉及了从虚拟地址到物理地址的转换,以及页表索引计算等关键步骤。通过理解这些细节,可以更好地了解Linux内存管理和页表层次结构。
摘要由CSDN通过智能技术生成
typedef struct { pudval_t pud; } pud_t;
	=>typedef u64 pudval_t;
// dir表示L0页表索引的指针,指向PUD页表的基地址
#define pud_offset(dir, addr)		((pud_t *)__va(pud_offset_phys((dir), (addr)))) {
	=>#define pud_offset_phys(dir, addr)	(pgd_page_paddr(READ_ONCE(*(dir))) + pud_index(addr) * sizeof(pud_t)) { 
		=>static inline phys_addr_t pgd_page_paddr(pgd_t pgd)
		{
			return __pgd_to_phys(pgd);
			=>#define __pgd_to_phys(pgd)	__pte_to_phys(pgd_pte(pgd)) {
				=>static inline pte_t pgd_pte(pgd_t pgd)
				{
					return __pte(pgd_val(pgd));
				}
				=>#define __pte_to_phys(pte)	(pte_val(pte) & PTE_ADDR_MASK) {
					=>#define pte_val(x)	((x).pte)
					=>#define PTE_ADDR_MASK		PTE_ADDR_LOW {
						#define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (48 - PAGE_SHIFT)) - 1) << PAGE_SHIFT)
					}
				}
			}
		}
		=>#define pud_index(addr)		(((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) {
			=>#define PUD_SHIFT		ARM64_HW_PGTABLE_LEVEL_SHIFT(1) {
				=>#define ARM64_HW_PGTABLE_LEVEL_SHIFT(n)	((PAGE_SHIFT - 3) * (4 - (n)) + 3)
			}
			=>#define PTRS_PER_PUD		PTRS_PER_PTE
				=>#define PTRS_PER_PTE		(1 << (PAGE_SHIFT - 3))
		}
	}
	=>#define __va(x)			((void *)__phys_to_virt((phys_addr_t)(x))) 
		=>#define __phys_to_virt(x)	((unsigned long)((x) - PHYS_OFFSET) | PAGE_OFFSET)
			=>#define PHYS_OFFSET		({ VM_BUG_ON(memstart_addr & 1); memstart_addr; })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值