Linux系统用户态根据虚拟地址获取物理地址的方式
2023-09-11 14:15:47 时间
之前做项目的时候,也会遇到过根据页表,由虚拟地址翻译物理地址的需求,一般的做法是HACK内核,在内核中加入HACK代码,思路无非就是通过页表进行转换,但是现在有了一种新的方式,这种方式下,不需要HACK内核,也不需要重新编译内核,便能够根据进程的虚拟地址,得到它的物理地址,下面展开介绍。
原理非常简单,依赖于 proc 文件系统的几个节点:
/proc/$pid/pagemap
/proc/kpagecount
/proc/kpageflags
准确的说,只依赖第一个就够了,pagemap每8个字节为一组,描述了一个struct page 对应的结构信息,这里面就包含了它的PNF物理页框号。
测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <string.h>
#define PAGEMAP_ENTRY 8
#define GET_BIT(X,Y) (X & ((uint64_t)1<<Y)) >> Y
#define GET_PFN(X) X & 0x7FFFFFFFFFFFFF
const int __endian_bit = 1;
#define is_bigendian() ( (*(char*)&__endian_bit) == 0 )
int i, c, pid, status;
unsigned long virt_addr;
uint64_t read_val, file_offs
相关文章
- linux内核算法---hex_to_bin分享
- stm32mp157教程之linux系统移植(总23讲,陆续更新)
- STM32MP157 Linux系统移植开发篇2:烧写linux镜像
- Linux集群和自动化维1.4.1 系统的基础优化
- 如何在 systemd 下管理Linux系统的时间和日期
- 在 Linux 系统里识别 USB 设备名字的 4 种方法
- Linux中,创建聊天服务器、移除冗余软件包的实用命令
- linux下设置密码复杂度限制,怎么设置?
- Linux Deploy在安卓手机安装LINUX系统
- 【Linux】Ubuntu系统下用apt命令删除/卸载软件包
- 计算机网络 - linux - 配置静态ip地址(NAT模式)
- linux系统级别的计划任务及其扩展anacrontab
- Parted:2T以上磁盘分区工具(LINUX挂载2T以上磁盘)
- 获取系统开机的时间(Windows、Linux)
- 【测试基础】之07 linux基础
- Linux—su命令和su -命令的差别(切换登录账号)
- 阿里云服务器linux系统上 安装node环境
- linux系统centOS6.5使用goaccess工具分析nginx网站日志
- linux系统编程:用truncate调整文件大小
- linux系统编程:自己动手写一个who命令
- Linux 系统的/usr目录
- 在Linux环境下使用TCP的keepalive机制
- Linux学习笔记(18)Linux sed,linux awk,linux grep,Linux三剑客
- 计算机硬盘分区知识简介、Linux企业级分区方案建议
- Linux格式化数据盘(阿里云数据盘挂载)