Buddy_Zhang1 发表于 2016-03-14 21:55

vmalloc() 分配内存何时发生缺页中断?

我写了一个测试代码如下:

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 分配的内存,什么时候发生缺页中断?????

Tinnal 发表于 2016-03-14 23:02

用的时候发生缺页中断,然后补页。你求物理地址的放法也有问题, 没有判断函数的返回值。 页表说不定都没有分配。

Buddy_Zhang1 发表于 2016-03-14 23:47

本帖最后由 Buddy_Zhang1 于 2016-03-14 23:47 编辑

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


Tinnal 发表于 2016-03-14 23:55

你看的是啥代码呀,贴出来。 vmalloc应该是用到的再去调页呀。

Tinnal 发表于 2016-03-15 00:25

sorry, 看了一下代码,确实已经确分配页面了

Tinnal 发表于 2016-03-15 00:32

还是回复一下你的问题吧,page_address为空,不代表不能访问。只要页表设好了,就可以访问了。 好像只有线性区page_address才有效。而vmalloc 在 alloc_page时gfp_mask设的是GFP_KERNEL | __GFP_HIGHMEM, 高端内存。高端内存page_address无效。

Buddy_Zhang1 发表于 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" 段内,在往下依我的能力无法找到对应的缺页处理函数,请问有没有看过相关的处理函数.
                  

Tinnal 发表于 2016-03-15 10:09

A1: 直接用vmalloc返回给你的地址就可以读写这个页了呀。
A2: 我看了一下我这边的代码没有看到 struct vm_start呀。vm_start只是struct vm_area_struct一个成员,而且应该也不是物理地址。 从vmalloc目前代码来看,是不会缺页的。

Tinnal 发表于 2016-03-15 10:13

回复 7# Buddy_Zhang1

__ex_table

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


   

Buddy_Zhang1 发表于 2016-03-15 10:35

回复 8# Tinnal


    应该是 struct vm_struct ,之前打错了
页: [1] 2 3
查看完整版本: vmalloc() 分配内存何时发生缺页中断?