免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3969 | 回复: 24
打印 上一主题 下一主题

[内存管理] vmalloc() 分配内存何时发生缺页中断? [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-14 21:55 |只看该作者 |倒序浏览
我写了一个测试代码如下:

void TestCase_vmalloc(void)
{
        unsigned long addr;
        unsigned long find_addr;
        pgd_t    *pgd;
        pmd_t  *pmd;
        pte_t    *pte;
        struct page *page;

      addr = vmalloc(PAGE_SIZE);
      pgd = pgd_offset(current->mm,addr);
      pmd = pmd_offset(pgd,addr);
      pte   = pte_offset_kernel(pmd,addr);
      page = pte_page(pte);
      find_addr = page_address(page);
      /* 此时 find_addr 为空???,如果此时我对 addr 进行写操作,会不会引发缺页中断 ???????????*/
}

通过上面的测试用例,我是想确认使用 vmalloc 分配的内存,什么时候发生缺页中断?????

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2016-03-14 23:02 |只看该作者
用的时候发生缺页中断,然后补页。你求物理地址的放法也有问题, 没有判断函数的返回值。 页表说不定都没有分配。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
3 [报告]
发表于 2016-03-14 23:47 来自手机 |只看该作者
本帖最后由 Buddy_Zhang1 于 2016-03-14 23:47 编辑

我看了 vmalloc 的源码,页表和物理页都分配,而且pte页表里也写了page 的对应值。


论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2016-03-14 23:55 |只看该作者
你看的是啥代码呀,贴出来。 vmalloc应该是用到的再去调页呀。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
5 [报告]
发表于 2016-03-15 00:25 |只看该作者
sorry, 看了一下代码,确实已经确分配页面了

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2016-03-15 00:32 |只看该作者
还是回复一下你的问题吧,page_address为空,不代表不能访问。只要页表设好了,就可以访问了。 好像只有线性区page_address才有效。而vmalloc 在 alloc_page时gfp_mask设的是GFP_KERNEL | __GFP_HIGHMEM, 高端内存。高端内存page_address无效。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
7 [报告]
发表于 2016-03-15 09:00 |只看该作者
回复 6# Tinnal


    HI:
          我说明一下我的疑惑点,既然 vmalloc 分配的内存已经存在页表了,也有对应的物理页,我要明确下面几个问题.
          1. 通过虚拟地址获得 PTE 页表之后,使用 pte_page 可以获得对应的物理页,此时物理页是 ZONE_HIGHMEM 的,
              我要需要什么方法可以直接对 page 对应的内存进行读写操作呢?之前在 ZONE_NORMAL 的物理页我直接使用 page_address()
              就可以获得 page 对应的内存.但对应 ZONE_HIGHMEM 的物理页,page_address 有转换 PKMAP 映射的物理页.

           2. 每个通过 vmalloc 分配的内存区使用虚拟地址部分使用 struct vmap_area 进行管理,里面包含了虚拟区的起始和结束位置,以及红黑树与rcu 链表信息.
               物理地址部分则通过 struct vm_start 进行管理,其中包含了物理地址的相关信息,我跟随代码并未发现对该结构体的 phys_addr 进行赋值.
               所以不确定该地址是否通过缺页写上去还是 TLB 方式.

         3. 我找了缺页中断处理函数,发现缺页中断函数都在  "__ex_table" 段内,在往下依我的能力无法找到对应的缺页处理函数,请问有没有看过相关的处理函数.
                  

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
8 [报告]
发表于 2016-03-15 10:09 |只看该作者
A1: 直接用vmalloc返回给你的地址就可以读写这个页了呀。
A2: 我看了一下我这边的代码没有看到 struct vm_start呀。vm_start只是struct vm_area_struct一个成员,而且应该也不是物理地址。 从vmalloc目前代码来看,是不会缺页的。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
9 [报告]
发表于 2016-03-15 10:13 |只看该作者
回复 7# Buddy_Zhang1

__ex_table

与正常的内存补页没关,他是一种异常处理机制,用来捕捉不正常但又能修复的缺页错误。


   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
10 [报告]
发表于 2016-03-15 10:35 |只看该作者
回复 8# Tinnal


    应该是 struct vm_struct ,之前打错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP