免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 通用寄存器
打印 上一主题 下一主题

vmalloc和vfree的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-21 09:33 |只看该作者
do_page_fault的代码:
……
        if (unlikely(address >= TASK_SIZE)) {
                if (!(error_code & 5))
                        goto vmalloc_fault;

……
vmalloc_fault:
        {
                /*
                 * Synchronize this task's top level page-table
                 * with the 'reference' page table.
                 *
                 * Do _not_ use "tsk" here. We might be inside
                 * an interrupt in the middle of a task switch..
                 */
                int index = pgd_index(address);
                unsigned long pgd_paddr;
                pgd_t *pgd, *pgd_k;
                pud_t *pud, *pud_k;
                pmd_t *pmd, *pmd_k;
                pte_t *pte_k;

                pgd_paddr = read_cr3();
                pgd = index + (pgd_t *)__va(pgd_paddr);
                pgd_k = init_mm.pgd + index;

                if (!pgd_present(*pgd_k))
                        goto no_context;

                /*
                 * set_pgd(pgd, *pgd_k); here would be useless on PAE
                 * and redundant with the set_pmd() on non-PAE. As would
                 * set_pud.
                 */

                pud = pud_offset(pgd, address);
                pud_k = pud_offset(pgd_k, address);
                if (!pud_present(*pud_k))
                        goto no_context;
               
                pmd = pmd_offset(pud, address);
                pmd_k = pmd_offset(pud_k, address);
                if (!pmd_present(*pmd_k))
                        goto no_context;
                set_pmd(pmd, *pmd_k);

                pte_k = pte_offset_kernel(pmd_k, address);
                if (!pte_present(*pte_k))
                        goto no_context;
                return;
        }
}

不是很看得懂(ULK3中有讲这个函数), 但页错误发生在内核态, 只可能vmalloc造成的, 到此便需要修正映射关系。 从代码上看, pgd/pmd/pte都是要修改的。

论坛徽章:
0
12 [报告]
发表于 2006-04-21 09:50 |只看该作者
原帖由 albcamus 于 2006-4-21 09:33 发表
do_page_fault的代码:
……
        if (unlikely(address >= TASK_SIZE)) {
                if (!(error_code & 5))
                        goto vmalloc_fault;

……
vmalloc_fault:
        {
         ...


貌似只改了PGD和PMD啊

论坛徽章:
0
13 [报告]
发表于 2006-04-21 10:09 |只看该作者
vmalloc()调用中立即分配了页。如果分不到就返回0。
所以正常不会有缺页。

ALB给的那个分支(fault.c )是UNLIKELY()。不会走到那里。至于什么情况下会,我还没实验出来。
vmalloc()不是给用户程序用的。分的地址是KERNEL地址,改用户的PTE做什么?KERNEL的任何地址对APP都是非法地址。

论坛徽章:
0
14 [报告]
发表于 2006-04-21 10:11 |只看该作者
回去看看书再来讨论, 关于这个的知识很模糊

论坛徽章:
0
15 [报告]
发表于 2006-04-21 10:50 |只看该作者
在模块中vmalloc返回放到一个全局KERNEL变量中。
然后修改sys_open,在某个进程中寸取这个变量,就会到那个分支

论坛徽章:
0
16 [报告]
发表于 2006-04-21 19:09 |只看该作者
原帖由 思一克 于 2006-4-21 10:09 发表
vmalloc()调用中立即分配了页。如果分不到就返回0。
所以正常不会有缺页。

ALB给的那个分支(fault.c )是UNLIKELY()。不会走到那里。至于什么情况下会,我还没实验出来。
vmalloc()不是给用户程序用的。 ...


一个进程在内核态时用vmalloc分配一块内存,vmalloc返回的时候物理页应该是分配了的,主内核页表已经修改了,但这个进程在实际访问分得的这个内存区域时是用的进程自己的页表访问,但只是进程内核页表还没有修改,就产生缺页,这是再把主内核页表的内容拷贝到进程内核页表,进程才能访问分得的这块内存,这是我的理解,我想问的是在拷贝时拷贝了哪些内容,如果把PGD,PMD和PTE都拷贝了,而在vfree释放内存时也只修改主内核页表,而进程内核页表未修改,这时进程用自己的进程内核页表访问以前分的的这块内存,是不是会非法访问已经释放了的页?在调用vfree时对主内核页表的修改如何传给进程内核页表?

论坛徽章:
0
17 [报告]
发表于 2006-04-21 20:11 |只看该作者
原帖由 通用寄存器 于 2006-4-21 19:09 发表


一个进程在内核态时用vmalloc分配一块内存,vmalloc返回的时候物理页应该是分配了的,主内核页表已经修改了,但这个进程在实际访问分得的这个内存区域时是用的进程自己的页表访问,但只是进程内核页表还没有修 ...

各个进程的页表的内核部分共享 PUD,PMD,PTE,所以修改主内核页表事实上也把各个进程的PUD,PMD,PTE改了.对否?所以下次访问会缺页,然后进入vmalloc_fault部分.
对否?
我不确定,刚刚学Linux.

论坛徽章:
0
18 [报告]
发表于 2006-04-21 20:16 |只看该作者
原帖由 mingyanguo 于 2006-4-21 20:11 发表

各个进程的页表的内核部分共享 PUD,PMD,PTE,所以修改主内核页表事实上也把各个进程的PUD,PMD,PTE改了.对否?所以下次访问会缺页,然后进入vmalloc_fault部分.
对否?
我不确定,刚刚学Linux.


主内核页表进程不会直接使用的,只是作为进程页表的参考,进程会使用自己的页表,我也不是很清楚的说

[ 本帖最后由 通用寄存器 于 2006-4-21 20:19 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-04-24 08:40 |只看该作者
原帖由 通用寄存器 于 2006-4-21 20:16 发表


主内核页表进程不会直接使用的,只是作为进程页表的参考,进程会使用自己的页表,我也不是很清楚的说

共享的不是PGD,PGD是各个进程自己的,但是内核空间部分的PUD,PMD,PTE各进程应该是共享的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP