Linux用户空间随上下文切换而发生改变
来源:互联网 发布:知行论坛pt 编辑:程序博客网 时间:2024/04/27 13:41
After each context switch, the userspace portion of the linear address space can potentially
change except when a lazy Translation Lookaside Buffer (TLB) switch is used...
Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存)。
用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数20,这取决于进程自身的逻辑。
任意一个时刻,在一个CPU上只有一个进程在运行。所以对于此CPU来讲,在这一时刻,整个系统只存在一个4GB的虚拟地址空间,这个虚拟地址空间是面向此进程的。当进程发生切换的时候,虚拟地址空间也随着切换。由此可以看出,每个进程都有自己的虚拟地址空间,只有此进程运行的时候,其虚拟地址空间才被运行它的CPU所知。在其它时刻,其虚拟地址空间对于CPU来说,是不可知的。所以尽管每个进程都可以有4 GB的虚拟地址空间,但在CPU眼中,只有一个虚拟地址空间存在。虚拟地址空间的变化,随着进程切换而变化。
从上面我们知道,一个程序编译连接后形成的地址空间是一个虚拟地址空间,但是程序最终还是要运行在物理内存中。因此,应用程序所给出的任何虚地址最终必须被转化为物理地址,所以,虚拟地址空间必须被映射到物理内存空间中,这个映射关系需要通过硬件体系结构所规定的数据结构来建立。这就是我们所说的段描述符表和页表,Linux主要通过页表来进行映射。
于是,我们得出一个结论,如果给出的页表不同,那么CPU将某一虚拟地址空间中的地址转化成的物理地址就会不同。所以我们为每一个进程都建立其页表,将每个进程的虚拟地址空间根据自己的需要映射到物理地址空间上。既然某一时刻在某一CPU上只能有一个进程在运行,那么当进程发生切换的时候,将页表也更换为相应进程的页表,这就可以实现每个进程都有自己的虚拟地址空间而互不影响。所以,在任意时刻,对于一个CPU来说,只需要有当前进程的页表,就可以实现其虚拟地址到物理地址的转化。
.内核空间到物理内存的映射
虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始的,如图4.2所示,之所以这么规定,是为了在内核空间与物理内存之间建立简单的线性映射关系。其中,3GB(0xC0000000)就是物理地址与虚拟地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。
我们来看一下在include/asm/i386/page.h头文件中对内核空间中地址映射的说明及定义:
#define __PAGE_OFFSET
……
#define PAGE_OFFSET
#define __pa(x)
#define __va(x)
对于内核空间而言,给定一个虚地址x,其物理地址为“x- PAGE_OFFSET”,给定一个物理地址x,其虚地址为“x+ PAGE_OFFSET”。
这里再次说明,宏__pa()仅仅把一个内核空间的虚地址映射到物理地址,而决不适用于用户空间,用户空间的地址映射要复杂得多,它通过分页机制完成。
- Linux用户空间随上下文切换而发生改变
- 在用户空间发生中断时,上下文切换的过程
- 在用户空间发生中断时,上下文切换的过程
- 在用户空间发生中断时,上下文切换的过程
- 在用户空间发生中断时,上下文切换的过程
- 在用户空间发生中断时,上下文切换的过程
- 在用户空间发生中断时,上下文切换的过程
- (转)在用户空间发生中断时,上下文切换的过程
- 程序名称随用户切换语言改变而改变
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
- Linux用户空间与内核空间,进程上下文与中断上下文
- maven的java版本随jenv切换改变而改变
- Linux进程上下文切换
- Linux CPU 上下文切换
- 关于Linux上下文切换
- Linux上下文切换监控
- Linux上下文切换监控
- Linux下的进程1——进程概念,进程切换,上下文切换,虚拟地址空间
- 133A - HQ9+
- BZOJ 2219 数论之神 数论
- SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)
- loop & butterfly subdivison
- 编写程序,求出并输出1000以内的所有的素数
- Linux用户空间随上下文切换而发生改变
- RL-RTX SVC 函数: unprivileged模式下运行的任务如何修改要求privileged权限的寄存器
- 第14周项目一 折腾二维数组
- ASP.NET之JSONHelper操作
- 杨辉三角形
- matlab中训练样本随机打乱的方法
- [Json.net]快速入门
- 解决Ubuntu Nvidia显卡闪烁
- Force.com微信企业号开发系列(一) - 启用二次验证