CPU只能访问虚拟内存,而实际的数据都存放在物理内存上面,

这就需要将虚拟内存映射到物理内存上面去,然后在物理内存上获取数
据传送到CPU中进行运算,而这个地址的映射就通过页表来完成的。
---------------------------------------------------------------------------------
一,linux内核的四级页表。
       内核为什么要设计四级页表呢?主要是为了支持多种硬件平台,
各种CPU提供的硬件支持不一样,还有要支持64位机。内核的4级页表可
以退化为3级页表,还可以退化到2级页表。四级页表也就是把一个虚拟
地址分为了5部分,分别是PGD,PUD,PMD,PTE,offset
示意图如下:

------------------------------------------------------------------------------
二,实战,将一个用vmalloc开辟的地址映射为物理地址。

  1. static unsigned long vaddr_to_paddr(unsigned long va)
  2. {
  3. pgd_t *pgd;
  4. pud_t *pud;
  5. pmd_t *pmd;
  6. pte_t *pte;
  7. unsigned long paddr;
  8. unsigned long page_addr;
  9. unsigned long page_offset;
  10. pgd = pgd_offset(current->mm,va);
  11. printk("pgd_val = 0x%lx\n",pgd_val(*pgd));
  12. printk("pgd_index = %lu\n",pgd_index(va));
  13. if (pgd_none(*pgd)) {
  14. printk("not mapped in pgd!\n");
  15. return -1;
  16. }
  17. pud = pud_offset(pgd,va);
  18. printk("pud_val = 0x%lx\n",pud_val(*pud));
  19. printk("pud_index = %lu\n",my_pud_index(va));
  20. if (pud_none(*pud)) {
  21. printk("not mapped in pud!\n");
  22. return -1;
  23. }
  24. pmd = pmd_offset(pud,va);
  25. printk("pmd_val = 0x%lx\n",pmd_val(*pmd));
  26. printk("pmd_index = %lu\n",pmd_index(va));
  27. if (pmd_none(*pmd)) {
  28. printk("not mapped in pmd!\n");
  29. return -1;
  30. }
  31. pte = pte_offset_kernel(pmd,va);
  32. printk("pte_val = 0x%lx\n",pte_val(*pte));
  33. printk("pte_index = %lu\n",pte_index(va));
  34. if (pte_none(*pte)) {
  35. printk("not mapped in pte!\n");
  36. return -1;
  37. }
  38. page_addr = pte_val(*pte) & PAGE_MASK;
  39. page_offset = va & ~PAGE_MASK;
  40. paddr = page_addr | page_offset;
  41. printk("vaddr = %lx,paddr = %lx\n",va,paddr);
  42. printk("page_addr = %lx\n",page_addr);
  43. return paddr;
  44. }

模块运行结果:(环境:linux.2.6.36,intel 32位系统)

  1. [263298.365202] pgd_val = 0x5e18067
  2. [263298.365207] pgd_index = 995
  3. [263298.365210] pud_val = 0x5e18067
  4. [263298.365213] pud_index = 0
  5. [263298.365216] pmd_val = 0x5e18067
  6. [263298.365218] pmd_index = 0
  7. [263298.365221] pte_val = 0x63c0163
  8. [263298.365223] pte_index = 127
  9. [263298.365226] vaddr = f8c7f000,paddr = 63c0000
  10. [263298.365229] page_addr = 63c0000

可以看出pud和pmd的偏移量均为0,说明在这儿就只使用了二级页表,

将pud和pmd都“折叠”起来了。代码的过程完全可以由上面的图解释。
-----------------------------------------------------------------------------------------
三,模块完整代码
 vaddr_to_paddr.rar   
------------------------------------------------------------------------------------------

内核管理实战之虚地址转换为物理地址相关推荐

  1. 页式地址变换(虚地址转换为内存地址的计算方法)

    页式地址变换 虚地址结构 虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移) 区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分. 假设页面大小为102 ...

  2. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  3. 逻辑地址、线性地址、物理地址和虚拟地址

    --引用地址:http://linux.chinaunix.net/bbs/thread-919019-1-1.html 要过年了,发个年终总结贴,只是个人理解,不包正确哈. 本贴涉及的硬件平台是X8 ...

  4. 逻辑地址、线性地址和物理地址的转换

    一.逻辑地址 逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元.存储单元.网络主机的地址. 逻辑地址往往不同于物理地址,通过地址翻译器或映射函数可以把逻辑地址转化为物理地址. 一个逻辑地址 ...

  5. 逻辑地址、线性地址和物理地址之间的转换

    首先说明一点,本篇的文章是根据自己的理解总结,但是图可能是在已有的博客中截图的,在此对那些对我理解该部分知识提供帮助的博客博主表示感谢! 在逻辑地址.线性地址和物理地址一节中,已经对逻辑地址.线性地址 ...

  6. 逻辑地址、线性地址和物理地址

    逻辑地址.线性地址和物理地址 逻辑地址(logical addresses)是由程序生成的与段相关的偏移地址的一部分. 例如,你在C语言中进行指针编程,可以读取指针变量本身的值(&操作),实际 ...

  7. (转)逻辑地址,线性地址,物理地址的差别

    段页式内存管理中,逻辑地址,线性地址,物理地址的差别 线性地址是逻辑地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址.程序代码会产生逻辑地址,或者说是段中的偏移地址 ...

  8. 逻辑地址、线性地址、物理地址和虚拟地址初步认识

    早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...

  9. linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址

    我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...

最新文章

  1. 互联网营销离不开“SEO”
  2. OpenCV | OpenCV中cvgoodFeaturesToTrack函数详细注释
  3. java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术
  4. python爬虫实例100例-Python爬虫 实例
  5. Photoshop1:入门实用技巧
  6. ibatis的result标签中用select详解
  7. python beautifulsoup库_Python BeautifulSoup库使用
  8. php递归还原,php递归算法处理
  9. 夏令营/保研/考研复试被问到优缺点怎么回答?
  10. 南阳 oj 6174问题
  11. win7 计算机定时关机脚本,电脑设置定时关机的方法 win7系统怎么设置定时关机...
  12. Qt:操作系统注册表
  13. 2018东北四省赛 Spell Boost DP
  14. psql屏幕输出全部结果_液晶电视无法开机,是电源板问题还是屏幕问题,自己动手维修...
  15. .NET WebApi 实战第三讲
  16. AUV运动控制仿真(PID控制)
  17. js百度地图获取当前定位经纬度及省市区
  18. 丰田生产方式的自働化与负反馈分析
  19. [转]用例和用户故事的区别 useCase和useStory的区别
  20. python对接各大数据库方法

热门文章

  1. eclipse中编辑properties文件无法看到中文
  2. HDU 3015 Disharmony Trees(树状数组)
  3. WindowManager.LayoutParams.type属性
  4. ADO.NET笔记——带参数的查询防止SQL注入攻击
  5. Google 翻译的妙用
  6. Ackerman 函数的解法
  7. redux和react-redux的使用详解
  8. AI设计师“鹿班”核心技术公开:如何1秒设计8000张海报?
  9. Ubuntu 安装docker CE以及harbor
  10. shell正则表达二