剑魂箫心 发表于 2016-11-11 11:55

本帖最后由 剑魂箫心 于 2016-11-11 11:57 编辑

回复 10# mordorwww

每个进程都有自己独立的页目录,虽然前768项各自独立,但是页目录后256项的值都是相同的,内核空间用这部分映射自己的1G线性地址。我记得有个函数就是在创建进程时负责填充新进程页目录的后256项,所有进程这256项都填入相同的值。所以这些页目录项映射的页表应该是同一组页表吧。

sditmaner 发表于 2016-11-11 12:47

回复 2# mordorwww

mordorwww 发表于 2016-11-11 13:17

剑魂箫心 发表于 2016-11-11 11:55
回复 10# mordorwww

每个进程都有自己独立的页目录,虽然前768项各自独立,但是页目录后256项的值都是 ...

问题 是 这256项会变
如果每个进程一份,那么一个进程改了,一旦切换到其它进程的话,其它的进程也要改

剑魂箫心 发表于 2016-11-11 13:41

回复 13# mordorwww

假设32位系统,我猜想是不是这256个内核页目录项(除掉高端内存那几项)内容是不变的,也就是说256个页表永远在指向固定的页表,以后如果映射有变化的话,只需要改动页表即可,而所有进程这256项的目录项值是不变的。

mordorwww 发表于 2016-11-11 15:00

剑魂箫心 发表于 2016-11-11 13:41
回复 13# mordorwww

假设32位系统,我猜想是不是这256个内核页目录项(除掉高端内存那几项)内容是不变 ...

kmalloc和其它静态映射不变
vmalloc映射表是动态映射的,会变的

剑魂箫心 发表于 2016-11-11 15:16

本帖最后由 剑魂箫心 于 2016-11-11 15:17 编辑

回复 15# mordorwww

有点意思,就拿这个两个函数当做学习最新内核的起点好了。我现在被4.4.30内核搞蒙了,和2.4差异太大,完全不认识了,正在寻找一个合适的切入点去学习最新代码。

blake326 发表于 2016-11-14 16:43

回复 2# mordorwww

vmalloc 也表直接更新到 主内核页表的 (就是c0007000的那个)

如果某个进程访问vmalloc地址,会产生异常,然后在异常里面吧主内核页表项拷贝过来的。

具体代码在哪不清楚了,要看。

剑魂箫心 发表于 2016-11-14 17:16

回复 17# amarant

我有FQ用的VPS:em02:,我主要就就是嫌内核代码的文件小而多,解压之后用source insight搜索起来也很慢,所以就想去掉暂时不用的代码,于是采用shallow clone将代码放到VPS上再选择需要的源码进行打包下载。而且把历史commit下载下来暂时也没什么用处~

amarant 发表于 2016-11-15 10:28

回复 19# 剑魂箫心

那直接去 kernel.org 下载就可以了。一个压缩包大概70MB的样子

mrpre 发表于 2016-11-29 11:02

回复 15# mordorwww

哥们你找到在哪里更新进程页目录了吗,我也有这个疑问。
我一个进程在系统调用中调用了vmalloc, vmalloc只更新了init_mm的页目录、页表;并没有更新进程的页目录和页表。

    g_v_pk = 1;
    ptr = vmalloc(PAGE_SIZE);
    if(ptr)
    {
      *((u32*)ptr) = 1;
      vfree(ptr);
    }
    g_v_pk = 0;


我在 do_page_fault 时加入
    if(g_v_pk)
    {
      printk("do_page_fault address:%lx\n",address);
    }


神奇的是,我在给ptr赋值时,没有产生缺页中断。
页: 1 [2] 3
查看完整版本: 开始研究4.4.30内核了