linux内核地址有效性判断方法

本文探讨了如何在Linux内核中判断一个地址的有效性。简单的方法是参照文档中的内存段分配描述,而精确验证则涉及逐级遍历页表以确认对应的物理地址。这种方法适用于X86-64架构,并且不涉及SWAP空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果只是需要大致地判断范围,可以参考内核\linux-3.4.104\Documentation\x86\x86_64\mm.txt中的对各个段的分配的描述。

但是如果需要更加精确地判断,就需要根据内核页表,一级一级地查找,查看是否存在对应的物理地址(内核态的地址不存在SWAP的问题),下面是内核代码段(针对X86-64,有修改)

int kern_addr_valid(unsigned long address)
{
 pgd_t *pgd;
 pud_t *pud;
 pmd_t *pmd;
 pte_t *pte;
 unsigned long high_bits = ((long)address) >> 47;

 if (high_bits != 0 && high_bits != -1UL)
  return 0;/*原因见INTEL相关文档*/
 /*swapper_pg_dir对应的符号init_level4_pgt在有的版本没有导出
 需要用kallsyms_lookup_name获取到该符号的地址*/
 pgd = swapper_pg_dir + pgd_index(address);
 if (pgd_present(*pgd))
  return 0;
 pud = pud_offset(pgd, address);
 if (pud_present(*pud))
  return 0;
 if (pud_large(*pud))
  return pfn_valid(pud_pfn(*pud));
 pmd = pmd_offset(pud, address);
 if (pmd_present(*pmd))
  return 0;
 if (pmd_large(*pmd))
  return pfn_valid(pmd_pfn(*pmd));
 pte = pte_offset_kernel(pmd, address);
 if (pte_present(*pte))
  return 0;
 return pfn_valid
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值