用户进程共享3~4G内核地址空间---Linux内核笔记
来源:互联网 发布:数据库模型设计 编辑:程序博客网 时间:2024/05/21 07:42
首先要说明的一点是:Linux在内核态运行时(中断生生或系统调用发生后进入内核态),使用的是当前进程的页目录,这样做的好处是不用频繁的切换页目录,防止频繁刷新TLB,提高效率。
每个用户进程有自己独立的0~3G地址空间,共享3~4G地址空间,也就是说每个进程页表的前768项是独立的,后面的256项全部进程共享。中断发生或系统调用后,进程陷入内核态,这时候需要使用3G~4G的内核地址空间,那么内核是在什么时候拷贝内核页表到进程页表的呢?
拷贝的时机发生在进程试图访问内核地址(这时候当前进程3~4G这段地址未映射),会发生缺页中断。
再看看缺页中断函数是如何工作的:
asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
{
struct task_struct *tsk;
struct mm_struct *mm;
struct vm_area_struct * vma;
unsigned long address;
unsigned long page;
unsigned long fixup;
int write;
siginfo_t info;
/* get the address */
__asm__("movl %%cr2,%0":"=r" (address));
/* It's safe to allow irq's after cr2 has been saved */
if (regs->eflags & X86_EFLAGS_IF)
local_irq_enable();
tsk = current;
//如果产生缺页的地址>TASK_SIZE(3G的地方)且发生在内核态(用户态没有权限访问内>3G的地址),
//跳转到vmalloc_fault
if (address >= TASK_SIZE && !(error_code & 5))
goto vmalloc_fault;
。。。。。。。。。。。。。。。。。。。
//这里处理>3G内存的缺页中断,从init_mm(内核地址空间)拷贝一个页表到当前进程对应
//的页表项
vmalloc_fault:
{
int offset = __pgd_offset(address);
pgd_t *pgd, *pgd_k;
pmd_t *pmd, *pmd_k;
pte_t *pte_k;
asm("movl %%cr3,%0":"=r" (pgd));
pgd = offset + (pgd_t *)__va(pgd);
pgd_k = init_mm.pgd + offset;
if (!pgd_present(*pgd_k))
goto no_context;
set_pgd(pgd, *pgd_k);
pmd = pmd_offset(pgd, address);
pmd_k = pmd_offset(pgd_k, address);
if (!pmd_present(*pmd_k))
goto no_context;
set_pmd(pmd, *pmd_k);
pte_k = pte_offset(pmd_k, address);
if (!pte_present(*pte_k))
goto no_context;
return;
}
}
- 用户进程共享3~4G内核地址空间---Linux内核笔记
- 【linux】用户空间(0-3G):进程私有,内核空间(3G-4G):所有进程共享
- linux内核地址空间及用户进程的地址空间
- linux内核分析笔记----进程地址空间
- linux内核分析笔记----进程地址空间
- linux内核分析笔记----进程地址空间
- Linux内核-进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- Linux内核--内核地址空间分布和进程地址空间
- 遇到暴风影音 activeX 漏洞
- 完美者常用软件光盘2008
- Hibernate 3注释简介
- 程序员坚决不能做技术的奴隶
- 木蚂蚁软件光盘 V2.0 2008元旦贺岁版
- 用户进程共享3~4G内核地址空间---Linux内核笔记
- 我的2007
- 元旦·影像记忆
- Base64 加密 解密
- 程序员面试攻略——为2008年提前加油
- 不要急于求成,不要意气用事,注意冷静处理,注意平常心,注意相应的节奏,细工慢活也能创造出好成绩。--2008年1月1日,对过去一年的总结,也是对新的一年的期望!!!
- 李彦宏:中国大多数企业没认识到搜索的价值
- MSCD software disk for win vista龙帝国vista 软件光盘合集
- C++的一些免费库