IsanaYashiro 2019-12-10
Linux采用请求分页存储管理方法。
系统为每个进程提供4GB的虚拟内存空间。各虚拟内存空间各自独立。

还是逻辑地址,线性地址,物理地址,分段机制和分页机制依次转换。
其中涉及到GDT,LDT,段寄存器,段描述符,

Linux使用如下段描述符
内核代码段,内核数据段,用户代码段,用户数据段,TSS段,默认LDT段
段基地址为0,段界限4GB,偏移量=线性地址
Linux必须分别为内核和用户程序创建代码段和数据段
虚拟地址等同于线性地址

linux中,每个用户都可以访问4GB的线性虚拟地址空间。
分为用户空间和内核空间。
用户空间:0到3GB-1,可以直接访问
内核空间:3GB到4GB-1,存放供操作系统和内核访问的代码和数据,用户进程不能访问
注意!!!!!
所有的进程的3GB到4GB-1的虚拟空间都是一样的,
linux以此方式让内核态进程共享代码段和数据段。
注意!!!!!
一个进程通过系统调用之后,就进入内核态了。,,一开始还想task_struct中有没有什么标志位神马的。
附上神图

好图+1

前面也已经提到过了这个,task_struct的mm项指向这个,描述进程的虚拟空间。
现在给出具体代码
struct mm_struct
{ struct vm_area_struct * mmap;
/*指向VMA链表表头的指针*/
rb_root_t mm_rb; /*指向进程红黑树的根*/
struct vm_area_struct * mmap_cache;
/*指向最后使用的VMA*/
pgd_t * pgd; /*指向进程页目录表的指针*/
atomic_t mm_users; /*用户空间数*/
atomic_t mm_count;
/* 访问mm_struct结构的计数*/
int map_count; /* VMA的数量 */
struct rw_semaphore mmap_sem; /*读写信号量*/
spinlock_t page_table_lock;
/*保护任务页表和mm->rss*/
struct list_head mmlist; /*所有活动mm的列表*/
unsigned long start_code, end_code, start_data, end_data;
/*分别为代码段、数据段的 首地址和终止地址*/
unsigned long start_brk, brk, start_stack;
/*堆位置及栈顶地址*/
unsigned long arg_start, arg_end, env_start, env_end;
/*分别为参数区、环境变量区的首地址和终止地址*/
unsigned long rss, total_vm, locked_vm;
/*驻留内存页框总数,VMA总数及被锁 VMA总数*/
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_address;
unsigned dumpable:1;
mm_context_t context;
/*和具体硬件结构有关的MM上下文*/
};虚拟内存区域名为vma,是进程一段连续的区域
用vm_area_struct描述
进程的mm_struct的mmap指向这个链表的首地址

注意vma和其代表vm_area_struct按地址排序

vma数量大的时候启用AVL树排序
代码
struct vm_area_struct
{ struct mm_struct * vm_mm;
/*指向进程的mm_struct结构体*/
unsigned long vm_start; /*虚拟区域的开始地址*/
unsigned long vm_end; /*虚拟区域的终止地址*/
/*每个进程的虚存区域链表,按地址排序*/
struct vm_area_struct vm_next;
/*指向下一个vm_area_struct结构体,链表的首地址由*/ /*mm_struct中成员项mmap指出*/
pgprot_t vm_page_prot; /*该VMA的访问权限*/
unsigned short vm_flags; /*指出虚存区域的操作特性*/
struct rb_node vm_rb; /*红黑树*/
struct list_head shared;
struct vm_operations_struct * vm_ops;
/*该结构体中包含着指向各种操作的函数的指针*/
/* 后援存储器的信息*/
unsigned long vm_pgoff; /*PAGE_SIZE单元中的偏移量*/
unsigned long vm_offset; /*该区域的内容相对于文件起始位置的偏移量,或相对于共享内存首址的偏移量*/
struct file * vm_file;/* 若虚存区域映射的是磁盘文件或设备文件的内容,则vm_file指向这个文件,否则为NULL*/
void * vm_private_data; /*共享内存页表vm_pte */
};
高位128MB内存建立临时映射,重复使用
可实现所有物理内存访问。
有代码段,数据段,BSS段,堆,栈