免费注册 查看新帖 |

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
41 [报告]
发表于 2012-03-30 16:08 |只看该作者
回复 30# jixuyang
纯粹的讨论内存管理,个人感觉不能融会贯通地掌握内存管理的精华。

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

论坛徽章:
0
42 [报告]
发表于 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
43 [报告]
发表于 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
44 [报告]
发表于 2012-03-31 11:17 |只看该作者
回复 43# 瀚海书香
这个代码是没有考虑PSE的情况。有PSE的环境,可以根据代码中的FIXME部分,进行修改。

   

论坛徽章:
0
45 [报告]
发表于 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
46 [报告]
发表于 2012-03-31 18:16 |只看该作者
大家可以看看我写的这份关于内存的文档,可以跟我 交流。 保证能让你对内核内存物理内存管理分配 ,虚拟内存管理分配恍然大悟

ARM_Linux_Course_17_Kernel_Memory_Management.PDF

496.02 KB, 下载次数: 236

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
47 [报告]
发表于 2012-03-31 21:50 |只看该作者
回复 46# moniskiller

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

论坛徽章:
0
48 [报告]
发表于 2012-03-31 21:55 |只看该作者
技术交流第一。

论坛徽章:
0
49 [报告]
发表于 2012-04-01 12:15 |只看该作者
回复 46# moniskiller

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



   

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

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP