内核管理实战之虚地址转换为物理地址
CPU只能访问虚拟内存,而实际的数据都存放在物理内存上面,
---------------------------------------------------------------------------------
一,linux内核的四级页表。
内核为什么要设计四级页表呢?主要是为了支持多种硬件平台,
示意图如下:
------------------------------------------------------------------------------
二,实战,将一个用vmalloc开辟的地址映射为物理地址。
- static unsigned long vaddr_to_paddr(unsigned long va)
- {
- pgd_t *pgd;
- pud_t *pud;
- pmd_t *pmd;
- pte_t *pte;
- unsigned long paddr;
- unsigned long page_addr;
- unsigned long page_offset;
- pgd = pgd_offset(current->mm,va);
- printk("pgd_val = 0x%lx\n",pgd_val(*pgd));
- printk("pgd_index = %lu\n",pgd_index(va));
- if (pgd_none(*pgd)) {
- printk("not mapped in pgd!\n");
- return -1;
- }
- pud = pud_offset(pgd,va);
- printk("pud_val = 0x%lx\n",pud_val(*pud));
- printk("pud_index = %lu\n",my_pud_index(va));
- if (pud_none(*pud)) {
- printk("not mapped in pud!\n");
- return -1;
- }
- pmd = pmd_offset(pud,va);
- printk("pmd_val = 0x%lx\n",pmd_val(*pmd));
- printk("pmd_index = %lu\n",pmd_index(va));
- if (pmd_none(*pmd)) {
- printk("not mapped in pmd!\n");
- return -1;
- }
- pte = pte_offset_kernel(pmd,va);
- printk("pte_val = 0x%lx\n",pte_val(*pte));
- printk("pte_index = %lu\n",pte_index(va));
- if (pte_none(*pte)) {
- printk("not mapped in pte!\n");
- return -1;
- }
- page_addr = pte_val(*pte) & PAGE_MASK;
- page_offset = va & ~PAGE_MASK;
- paddr = page_addr | page_offset;
- printk("vaddr = %lx,paddr = %lx\n",va,paddr);
- printk("page_addr = %lx\n",page_addr);
- return paddr;
- }
模块运行结果:(环境:linux.2.6.36,intel 32位系统)
- [263298.365202] pgd_val = 0x5e18067
- [263298.365207] pgd_index = 995
- [263298.365210] pud_val = 0x5e18067
- [263298.365213] pud_index = 0
- [263298.365216] pmd_val = 0x5e18067
- [263298.365218] pmd_index = 0
- [263298.365221] pte_val = 0x63c0163
- [263298.365223] pte_index = 127
- [263298.365226] vaddr = f8c7f000,paddr = 63c0000
- [263298.365229] page_addr = 63c0000
可以看出pud和pmd的偏移量均为0,说明在这儿就只使用了二级页表,
-----------------------------------------------------------------------------------------
三,模块完整代码
vaddr_to_paddr.rar
------------------------------------------------------------------------------------------
内核管理实战之虚地址转换为物理地址相关推荐
- 页式地址变换(虚地址转换为内存地址的计算方法)
页式地址变换 虚地址结构 虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移) 区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分. 假设页面大小为102 ...
- linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)
分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...
- 逻辑地址、线性地址、物理地址和虚拟地址
--引用地址:http://linux.chinaunix.net/bbs/thread-919019-1-1.html 要过年了,发个年终总结贴,只是个人理解,不包正确哈. 本贴涉及的硬件平台是X8 ...
- 逻辑地址、线性地址和物理地址的转换
一.逻辑地址 逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元.存储单元.网络主机的地址. 逻辑地址往往不同于物理地址,通过地址翻译器或映射函数可以把逻辑地址转化为物理地址. 一个逻辑地址 ...
- 逻辑地址、线性地址和物理地址之间的转换
首先说明一点,本篇的文章是根据自己的理解总结,但是图可能是在已有的博客中截图的,在此对那些对我理解该部分知识提供帮助的博客博主表示感谢! 在逻辑地址.线性地址和物理地址一节中,已经对逻辑地址.线性地址 ...
- 逻辑地址、线性地址和物理地址
逻辑地址.线性地址和物理地址 逻辑地址(logical addresses)是由程序生成的与段相关的偏移地址的一部分. 例如,你在C语言中进行指针编程,可以读取指针变量本身的值(&操作),实际 ...
- (转)逻辑地址,线性地址,物理地址的差别
段页式内存管理中,逻辑地址,线性地址,物理地址的差别 线性地址是逻辑地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址.程序代码会产生逻辑地址,或者说是段中的偏移地址 ...
- 逻辑地址、线性地址、物理地址和虚拟地址初步认识
早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...
- linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址
我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...
最新文章
- 互联网营销离不开“SEO”
- OpenCV | OpenCV中cvgoodFeaturesToTrack函数详细注释
- java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术
- python爬虫实例100例-Python爬虫 实例
- Photoshop1:入门实用技巧
- ibatis的result标签中用select详解
- python beautifulsoup库_Python BeautifulSoup库使用
- php递归还原,php递归算法处理
- 夏令营/保研/考研复试被问到优缺点怎么回答?
- 南阳 oj 6174问题
- win7 计算机定时关机脚本,电脑设置定时关机的方法 win7系统怎么设置定时关机...
- Qt:操作系统注册表
- 2018东北四省赛 Spell Boost DP
- psql屏幕输出全部结果_液晶电视无法开机,是电源板问题还是屏幕问题,自己动手维修...
- .NET WebApi 实战第三讲
- AUV运动控制仿真(PID控制)
- js百度地图获取当前定位经纬度及省市区
- 丰田生产方式的自働化与负反馈分析
- [转]用例和用户故事的区别 useCase和useStory的区别
- python对接各大数据库方法