免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香

linux内存管理讨论——欢迎大家围观! [复制链接]

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-30 16:08 |显示全部楼层
回复 30# jixuyang
纯粹的讨论内存管理,个人感觉不能融会贯通地掌握内存管理的精华。

的确是这样的,我们需要从一个点来了解内存管理;但是在这之前需要对内存管理有个整体的把握。
   

论坛徽章:
0
发表于 2012-03-30 17:27 |显示全部楼层
来看看,最近上班事情很少,业余时间都是在研究代码...

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-31 11:14 |显示全部楼层
通过虚拟地址获取物理地址的代码

  1. #include <linux/module.h>
  2. #include <asm/pgtable.h>
  3. #include <linux/version.h>
  4. #include <asm/page.h>
  5. #include <linux/gfp.h>
  6. #include <linux/page-flags.h>
  7. #include <linux/sched.h>//find_task_by_vpid
  8. #include <linux/mm.h>//find_vma
  9. MODULE_LICENSE("GPL");
  10. MODULE_DESCRIPTION("CONVERT USER VIRTUAL ADDRESS TO PHYADDRESS");
  11. static int pid;
  12. static unsigned long va;
  13. module_param(pid,int,0644);
  14. module_param(va,ulong,0644);

  15. static int find_pgd_init(void)
  16. {
  17.         unsigned long pa=0;
  18.         struct task_struct *pcb_tmp=NULL;
  19.         pgd_t *pgd_tmp=NULL;
  20.         pud_t *pud_tmp=NULL;
  21.         pmd_t *pmd_tmp=NULL;
  22.         pte_t *pte_tmp=NULL;
  23.         if(!(pcb_tmp=find_task_by_pid(pid)))
  24.         {
  25.                 printk(KERN_ALERT "Can't find the task %d.\n",pid);
  26.                 return 0;
  27.         }
  28.         printk(KERN_ALERT "pgd=0x%p\n",pcb_tmp->mm->pgd);
  29.         if(!find_vma(pcb_tmp->mm,va))
  30.         {
  31.                 printk(KERN_ALERT "virt_addr 0x%lx not available.\n",va);
  32.                 return 0;
  33.         }
  34.         pgd_tmp=pgd_offset(pcb_tmp->mm,va);
  35.         printk(KERN_ALERT "pgd_tmp=0x%p\n",pgd_tmp);
  36.         printk(KERN_ALERT "pgd_val(*pgd_tmp)=0x%lx\n",pgd_val(*pgd_tmp));
  37.         if(pgd_none(*pgd_tmp))
  38.         {
  39.                 printk(KERN_ALERT "Not mapped in pgd.\n");
  40.                 return 0;
  41.         }
  42.         pud_tmp=pud_offset(pgd_tmp,va);
  43.         pmd_tmp=pmd_offset(pud_tmp,va);
  44.         /*FIXME:
  45.           Do I need to check Large Page ? PSE bit.
  46.                 if(pmd_large(*pmd_tmp) == 1){
  47.                         pa = (pmd_val(*pmd_tmp) & PMD_MASK) | (va & ~PMD_MASK);
  48.                 }
  49.           */
  50.         pte_tmp=pte_offset_kernel(pmd_tmp,va);
  51.         if(pte_none(*pte_tmp))
  52.         {
  53.                 printk(KERN_ALERT "Not mapped in pte.\n");
  54.                 return 0;
  55.         }
  56.         if(!pte_present(*pte_tmp))
  57.         {
  58.                 printk(KERN_ALERT "pte not in RAM,maybe swaped.\n");
  59.                 return 0;
  60.         }
  61.         pa=(pte_val(*pte_tmp)&PAGE_MASK)|(va&~PAGE_MASK);
  62.         printk(KERN_ALERT "virt_addr 0x%lx in RAM is 0x%lx.\n",va,pa);
  63.         printk(KERN_ALERT "content in 0x%lx is 0x%lx.\n",pa,*(unsigned long*)((char *)pa+PAGE_OFFSET));
  64.         return 0;
  65. }
  66. static void find_pgd_exit(void)
  67. {
  68.         printk(KERN_ALERT "Goodbey.\n");
  69. }
  70. module_init(find_pgd_init);
  71. module_exit(find_pgd_exit);
复制代码

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-31 11:17 |显示全部楼层
回复 43# 瀚海书香
这个代码是没有考虑PSE的情况。有PSE的环境,可以根据代码中的FIXME部分,进行修改。

   

论坛徽章:
0
发表于 2012-03-31 15:28 |显示全部楼层
本帖最后由 ww2000e 于 2012-03-31 15:39 编辑
瀚海书香 发表于 2012-03-31 11:14
通过虚拟地址获取物理地址的代码



我在3.2.11内核上编译  给find_task_by_pid改成find_task_by_vpid对不对?  

不过  提示这个阿

WARNING: "find_task_by_vpid" [/vm_to_pm/main.ko] undefined!


找到方法了 ,那函数没导出 ,改成这个貌似行了
pcb_tmp = pid_task(find_vpid(pid), PIDTYPE_PID)

论坛徽章:
0
发表于 2012-03-31 18:16 |显示全部楼层
大家可以看看我写的这份关于内存的文档,可以跟我 交流。 保证能让你对内核内存物理内存管理分配 ,虚拟内存管理分配恍然大悟

ARM_Linux_Course_17_Kernel_Memory_Management.PDF

496.02 KB, 下载次数: 233

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
发表于 2012-03-31 21:50 |显示全部楼层
回复 46# moniskiller

好东西多谢! 当然会有一些问题要问。 但你不会动员我去你们的培训班把?
   

论坛徽章:
0
发表于 2012-03-31 21:55 |显示全部楼层
技术交流第一。

论坛徽章:
0
发表于 2012-04-01 12:15 |显示全部楼层
回复 46# moniskiller

虽然有一点点广告嫌疑,但是东西确实不错,必须支持!



   

论坛徽章:
0
发表于 2012-04-01 15:06 |显示全部楼层
想知道这么个事情:
虚拟地址转到物理地址,是通过mmu. mmu是一块芯片, 在这个地址转换的过程中,软件和硬件协调着工作,
想知道软件在什么时候就全部交给了硬件,他们之间有明显的分解线吗?

+++
个人理解,软件把一些值付给mmu的寄存器后,mmu就会自动把相应的物理地址转化出来。不知道对不对。 望高人给指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP