目录
1.创建进程用户空间
用户空间如何被创建?
实际上是通过拷贝或者共享父进程的用户空间来实现的.
也就是说内核调用copy_mm函数来实现的.
这样就为新进程建立了所有的页表和mm_struct结构.
通常来说每个进程都有自己的用户空间,但是如果调用的clone函数
创建的内核线程它是共享父进程的用户空间.
如果是创建子进程,则会采用写时复制技术来快速创建进程.
2.写时复制技术
3.虚存映射
4.VMA的新建方法
内核通过怎样的方式新建一个一个虚存区呢?
在用户空间我们可以用mmap()的方法获取do_mmap()的功能.
在内核空间我们可以直接调用do_mmp()创建一个新的虚存区.
共享虚存区:
如果一个进程对一个共享虚存区进行写的话其他进程可以感觉到它的写,而且还会修改
磁盘上对应的文件,文件的共享就可以采用这种方式.
私有虚存区:
进程创建这种映射只是为了读文件而不是为了写文件,因此对虚存区的写操作就不会修改
磁盘上对应的文件,由此可以看出私有映射的效率是要比共享映射的效率高的.
匿名映射:
映射与文件无关.
5.进程中的虚拟映射示例
6.进程的虚拟区举例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char **argv)
{
int i;
unsigned char *buff;
buff = (char*)malloc(sizeof(char)*1024);
printf("My pid is :%d\n",getpid());
for(i = 0;i<60;i++)
{
sleep(60);
}
return 0;
}
7.与用户空间相关的主要系统调用
8.编写虚存区内核模块
9.请页机制--实现虚存管理的重要手段
当一个进程运行的时候,CPU访问的是用户空间的虚地址,linux仅仅把当前需要使用的
少量页面装入到内存中,需要的时候通过请页机制将特定的页面调入到内存,当访问的
页不在内存中的时候,就会产生也故障并且报告故障的原因.
10.缺页异常处理
linux缺页有两种情况,
首先要看这个缺页是由编程引起的还是由缺页引起的.
如果是由编程引起的异常而且发生在内核态,此时要毫不含糊地杀死该进程.
如果是发生在用户态,说明是一个无效的内存引用,程序需要停止执行.
如果是真正缺页引起的异常且是有合法的权限,此时才进入到缺页异常处理
程序.本节第二张图中只有圈出的两个分支是真正的请求分页的处理,
在看这张图的时候首先查看正常的处理分支,然后再查看异常的处理分支,
在对整体流程了解了以后想要真正理解异常处理程序还是需要看代码,
代码名do_page_fault().
11.用户进程访问内存分析引入
用户态进程独占虚拟地址空间,两个进程的虚拟地址空间可能完全是相同的,
在访问用户态虚拟地址空间的时候如果没有映射到物理地址空间,此时就要
通过请页机制发出缺页异常的请求,缺页异常陷入内核态,分配物理地址空间,
与用户态虚拟地址空间就建立起映射关系,到底如何分配物理内存,见下一讲分析.
12.参考资料与思考