Linux原理及应用04

上传人:油条 文档编号:47637215 上传时间:2018-07-03 格式:PPT 页数:78 大小:551.50KB
返回 下载 相关 举报
Linux原理及应用04_第1页
第1页 / 共78页
Linux原理及应用04_第2页
第2页 / 共78页
Linux原理及应用04_第3页
第3页 / 共78页
Linux原理及应用04_第4页
第4页 / 共78页
Linux原理及应用04_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《Linux原理及应用04》由会员分享,可在线阅读,更多相关《Linux原理及应用04(78页珍藏版)》请在金锄头文库上搜索。

1、LINUX原理及应用武汉大学计算机学院第第4 4章章 LinuxLinux内存管理内存管理 n存储管理的任务是方便用户使用存储资源,在有限 的物理空间内使更多的用户进程高效地获得和使用 尽可能多的存储空间,从而提高系统的整体性能。nLinux操作系统采用了请求式分页虚拟存储管理方 法。系统为每个进程提供了4GB的虚拟内存空间, 各个进程的虚拟内存彼此独立。虚拟内存可以提供 以下的功能:n广阔的地址空间。n进程的保护。n内存映射。n公平的物理内存分配。n共享虚拟内存。 4.1 I3864.1 I386存储管理硬件存储管理硬件 nI386的工作模式包括实地址模式和虚地址模式(保 护模式)。Linu

2、x主要工作在保护模式下。I386存储 管理硬件辅助操作系统进行内存管理,提供虚实地 址转换等硬件支持。在I386架构中,内存被划分成3 种类型的地址:n(1)逻辑地址:是存储位置的地址,它可能直接对应于一 个物理位置,也可能不直接对应于一个物理位置。逻辑地 址通常在请求控制器中的信息时使用。n(2)线性地址:是从0开始进行寻址的内存。之后的每个字 节都可顺序使用下一数字来引用,直到内存末尾为止。n(3)物理地址:是使用物理地址总线中的位表示的地址。 物理地址可能与逻辑地址不同,内存管理单元可以将逻辑 地址转换成物理地址。nCPU使用两种单元将逻辑地址转换成物理地址。第一 种称为分段单元,另外一

3、种称为分页单元。 4.1.1 I386的分段机制 n从逻辑地址到线性地址的转换由I386分段机制管理 。段寄存器CS、DS、ES、SS、FS或GS标识一个 段。这些段寄存器作为段选择器,用来选择该段的 描述符。在保护模式下,80386虚地址空间可达 16K个段,每段大小可变,最大达4GB。n分段地址包括两个组件n段选择器(segment selector)。段选择器指定了要使用的段 (即基址和长度值)。n段内偏移量(offset into the segment)。段内偏移量则指定 了实际内存位置相对于基址的偏移量。实际内存位置的 物理地址就是这个基址值与偏移量之和。如果偏移量超 过了段的长度

4、,系统就会生成一个保护违例错误。 4.1.1 I386的分段机制n段选择器n每个段都有一个16位的字段,称为段标识符 (segment identifier)或段选择器(segment selector)。 每个段标识符都代表一个使用64位(8个字节)的 段描述符(segment descriptor)表示的段。这些段描 述符可以存储在一个GDT(全局描述符表)中, 也可以存储在一个LDT(局部描述符表)中。 n每次将段选择器加载到段寄存器中时,对应的 段描述符都会从内存加载到相匹配的CPU寄存 器中。每个段描述符表示内存中的一个段。这 些都存储到LDT或GDT中。 4.1.1 I386的分段

5、机制n段选择器包含以下内容:n(1)一个13位的索引,用来标识GDT或LDT中包含的 对应段描述符条目n(2)TI (Table Indicator),标志指定段描述符是在GDT 中还是在LDT中,如果该值是0,段描述符就在 GDT中;如果该值是1,段描述符就在LDT中。n(3)RPL (request privilege level),定义了在将对应的 段选择器加载到段寄存器中时CPU的当前特权级别 。 4.1.1 I386的分段机制4.1.1 I386的分段机制n描述符就是描述段的属性的一个8字节存储单 元。通用的段描述符的结构如下图所示。 4.1.1 I386的分段机制n第5个字节是存取

6、权限字节,其中第7位P位 是存在位,第6,5位是DPL,就是描述符特 权级,第4位是S位(System)表示这个段是 系统段还是用户段,第3,2,1位是类型位 。 n第6个字节的G位是粒度位。D/B位表示缺 省操作数的大小,如果为0,操作数为16位 ,如果为1,操作数为32位。AVL只能由系 统软件使用,为了与将来的处理器兼容设 置为0。 4.1.1 I386的分段机制nLinux以一种受限的方法来使用这种分段模型(主要 是出于兼容性方面的考虑)。n在Linux中,所有的段寄存器都指向相同的段地址范 围换言之,每个段寄存器都使用相同的线性地 址,段寄存器指向相同的地址集。这种模型有两个 优点:

7、n当所有的进程都使用相同的段寄存器值时(当它们共享相 同的线性地址空间时),内存管理更为简单。n在大部分架构上都可以实现可移植性。某些RISC处理器也 可通过这种受限的方式支持分段。nLinux使用以下段描述符:内核代码段,内核数据段 ,用户代码段,用户数据段,TSS段,默认LDT段。 4.1.1 I386的分段机制nI386规定段机制是不可禁止的,因此不可能绕过它直接给出 线性地址空间的地址。为此,Linux的设计人员干脆让段的基 地址为0,而段的界限为4GB,这时任意给出一个偏移量,则 等式为“0+偏移量=线性地址”,也就是说“偏移量线性地址” 。另外由于段机制规定“偏移量rss*/str

8、uct 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总数及被

9、锁 *VMA总数*/unsigned long def_flags; unsigned long cpu_vm_mask;unsigned long swap_address;unsigned dumpable:1;mm_context_t context; /*和具体硬件结构有关的MM上下文*/ ;4.2 虚拟内存的管理nLinux在管理进程虚存空间时定义了虚存段(vma)。 虚存段是进程一段连续的虚存空间,在这段虚存里, 所有单元拥有相同特征。Linux用数据结构 vm_area_struct描述了虚存段的属性,它主要包括:n(1)vma在虚存中的起始地址和终止地址;n(2)vma段内容来

10、源,例如磁盘文件由其inode指示。n(3)一系列对vma操作例程。n(4)同一进程的vma段的vm_area_struct结构通过vm_next指针 连接组成链表。系统以虚拟内存地址的降序排列 vm_area_struct结构。这样建立了文件的逻辑地址到虚拟线 性地址的映射。 4.2 虚拟内存的管理nvm_area_struct是描述进程的虚拟地址区域,一 个虚存区域是虚存空间中一个连续的区域,在这 个区域中的信息具有相同的操作和访问特性。它 形成一个单向链表,这样当内核需要在一个给定 进程页上执行给定操作时。可从双向列表中找到 该项。每个虚拟区域用一个vm_area_struct结构 体进

11、行描述。 4.2 虚拟内存的管理struct vm_area_struct struct mm_struct * vm_mm; /* 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; /*该V

12、MA的访问权限*/ unsigned short vm_flags; /*指出虚存区域的操作特性*/struct rb_node vm_rb; struct list_head shared; struct vm_operations_struct * vm_ops; /*指向vm_operations_struct结构体的指针, *该结构体中包含着指向各种操作的函数的指针*/* 后援存储器的信息*/ unsigned long vm_pgoff; /*PAGE_SIZE单元中的偏移量,不是PAGE_CACHE_SIZE*/ unsigned long vm_offset; /*该区域的内容相

13、对于文件起始位置的偏移量,或相对于共*享内存首址的偏移量*/ struct file * vm_file;/* 若虚存区域映射的是磁盘文件或设备文件的内容,则vm_file *指向这个文件,否则为NULL*/ void * vm_private_data; /*共享内存页表vm_pte */ ;4.2 虚拟内存的管理nvm_flags指出了虚存区域的操作特性,所有 vm_area_struct结构体链接成一个单向链表 ,vm_next指向下一个vm_area_struct结构体 。链表的首地址由mm_struct中成员项 mmap指出。vm_ops是指向 vm_operations_struc

14、t结构体的指针。该结构 体中包含着指向各种操作的函数的指针。 4.2 虚拟内存的管理nmm中的vma按地 址排序由线性链 表连接起来,当 vma的数量相当大 的时候启用AVL树 ,与线性链表同 时管理vma以提高 访问效率。随着 vma的动态改变, vma之间存在归并 和拆分等操作。 分配vma并不立即 分配页帧。 4.3 Linux分页机制及地址映射 nLinux系统本身支持三级分页结构,在I386体 系结构中实现的是两级分页机构。对I386, 提供了把三级分页管理转换成两级分页机制 的方法。其中一个重要的方面就是把PGD与 PMD合二为一,使所有关于PMD的操作变为 对PGD的操作。n在/

15、include/asm-i386/pgtable.h中有如下定义 :n#define PTRS_PER_PTE 1024n#define PTRS_PER_PMD 1n#define PTRS_PER_PGD 1024 4.3 Linux分页机制及地址映射nLinux使用do_mmap()函数完成可执行映像向虚存区域 的映射,由它建立有关的虚存区域。do_mmap()函数 定义在/mm/mmap.c文件中:unsigned long do_mmap(struct file * file, unsigned long addr,unsigned long len,unsigned long pr

16、ot,unsigned long flags, unsigned long off)nfile是指向该文件结构体的指针,若file为NULL,称为匿名 映射naddr表示在虚拟内存空间的开始地址nlen是这个虚存区域的长度nprot指定了虚存区域的访问特性 nflags指定了虚存区域的属性 noff是相对于文件起始位置的偏移量 4.3 Linux分页机制及地址映射 prot指定了虚存区域的访问特性:PROT_READ 0x1 对虚存区域允许读取PROT_WRITE 0x2 对虚存区域允许写入PROT_EXEC 0x4 虚存区域(代码)允许执行PROT_NONE 0x0 不允许访问该虚存区域 flags指定了虚存区域的属性:MAP_FIXED 指定虚存区域固定在addr的位置上。MAP_SHARED 指定对虚存区域的操作是作用在共 享页面上MAP_PRIVATE指定了对虚存区域的写入操作将引 起页面拷贝。 4.4 物理内存的管理 n在32位架构上的Linux内核按

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号