剑魂箫心
发表于 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赋值时,没有产生缺页中断。