摘要: 80386除了完成并完善从80286开始的段式内存管理的同时还实现了页式内存管理。 段式存储管理机制的灵活性和效率都比较差。以方面“段”是可变长度的,这就给盘区交换操作带来了不便;另一方面,如果为了增加灵活性而将每个进程的空间划分成很多小段时,就势必要求在程序中频繁地改变段寄存器的内容。同时,如果将段分小,虽然一个段描述符表中可以容纳8192个描述项,也未必就能保证足够使用。 80386的系统结构决定了它的页式存储管理只能建立在段式的基础之上。 80386增加了一个新的寄存器CR3作为指向当前页面目录的指针。这样,从线性地址到物理地址的映射过程为:1、从CR3取得页面目录的基地址2、... 阅读全文
posted @ 2013-06-09 16:38 shuying1234 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 所谓X86系列,是指Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号兼容,主要有8086、8088、80186、80286、80386、80486以及以后各种型号的Pentium芯片。 在X86系列中,8086和8088是16位处理器,而从80386开始为32位处理器,80286则是该系列从8088到80386,也就是从16位到32位过渡的一个中间步骤。当我们说一个CPU是16位或32位时,指的是处理器中ALU算术逻辑单元的宽度。 8086中采用16位CPU和1M字节的内存地址空间即20位的地址总线宽度。Intel使用分段的方法来处理A... 阅读全文
posted @ 2013-06-09 15:59 shuying1234 阅读(964) 评论(0) 推荐(0) 编辑
摘要: i386CPU中页式存管的基本思路:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射。这种映射模式在大多数情况下可以节省页面表所占用的空间。因为大多数进程不会用到这个虚存空间,在虚存空间中通常都留有很大的空洞。采用两层的方式,只要一个目录项所对应的那部分空间时空洞,就可以把该目录项设置成空,从而省下了与之对应的页面表(1024个页面表)。 linux内核的映射机制设计成三层:PGD,PMD,PT。相应的在逻辑上把线性地址从高位到地位划分为4个位段,各占若干位,分别用作在目录PGD中的下标、PMD下标和PT下标以及物理页面PTE中的偏移。 理论上每个进程可以使用的用户空间都是... 阅读全文
posted @ 2013-06-09 14:56 shuying1234 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 1、mmap设备操作映射一个设备意味着将用户空间的一段内存与设备内存关联起来。无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备。不是所有的设备都能进行mmap抽象。比如像串口和其他面向流的设备就不能。mmap的另一个限制是:必须以PAGE_SIZE为单位进行映射。mmap方法是file_operation结构的一部分,并且执行mmap系统调用时将调用该方法。为了执行mmap,驱动程序只需要为该地址范围建立合适的页表,并将vma->vm_ops替换为一系列的新操作即可。有两种建立页表的方法:使用remap_pfn_range函数一次全部建立,或者通过nopage方法每次建立一个 阅读全文
posted @ 2013-05-20 05:42 shuying1234 阅读(1007) 评论(0) 推荐(0) 编辑
摘要: 虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持linux所支持的所有文件系统所提供的任何操作。对所调用的每个读、写或其他函数,内核都能把他们替换成支持本地linux文件系统、NTFS文件系统或者文件所在的其他任何文件系统的实际函数。12.1 虚拟文件系统的作用VFS支持的文件系统可以划分为三种主要类型:1、磁盘文件系统 这些文件系统管理在本地磁盘分区中可用的存储空间或者其他可以起到磁盘作用的设备(比如USB闪存)。2、网络文件系统 这些文件系统允许轻易的访问属于其他网络计算机的文件系统所包含的文件。3、特殊文件系统 这些文件系统不管... 阅读全文
posted @ 2013-05-08 22:36 shuying1234 阅读(488) 评论(0) 推荐(0) 编辑
摘要: 10.1 系统调用处理程序及服务例程系统调用处理程序与其他异常处理程序的结构类似,执行下列操作:1、在内核态栈保存大多数寄存器的内容。2、调用名为系统调用服务例程的相应的C函数来处理系统调用3、退出系统调用处理程序:用保存在内核栈中的值加载寄存器,CPU从内核态切换回用户态。为了把系统调用号与相应的服务例程关联起来,内核利用了一个系统调用分派表。这个表存放在sys_call_table数组中,有NR_syscalls个表项:第n个表项包含系统调用号为n的服务例程地址。10.2 进入和退出系统调用本地应用可以通过两种不同的方式调用系统调用:1、执行int $0x802、执行sysenter汇编语 阅读全文
posted @ 2013-04-28 02:09 shuying1234 阅读(543) 评论(0) 推荐(0) 编辑
摘要: 当给用户态进程分配内存是时:①、进程对动态内存的请求被认为是不紧迫的。例如,当进程的可执行文件被装入时,进程并不一定立即对所有的代码页进行访问。类似的,当进程调用malloc()以获得请求的动态内存时,并不意味着进程很快就会访问所有获得的内存。因此,一般来说,内核总是尽量推迟给用户态进程分配动态内存。②、由于用户进程是不可信的,因此,内核必须能随时准备捕获用户态进程引起的寻址错误。当用户态进程请求动态内存时,并没有获得请求的页框,而仅仅获得对一个新的线性地址区间的使用权,而这一线性地址就成为进程地址空间的一部分。这一区间叫做线性区。1、进程的地址空间进程的地址空间是由允许进程使用的全部线性地址 阅读全文
posted @ 2013-04-27 02:22 shuying1234 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 3、非连续内存区管理如果对内存区的请求不是很频繁,那么,通过连续的线性地址来访问非连续的页框这样一种分配模式就很有意义。这种模式的主要优点是避免了外碎片,而缺点是必须打乱内核页表。非连续内存区的大小必须是4096的倍数。linux在几个方面使用非连续内存区,例如,为活动的交换区分配数据结构,为模块分配空间,或给某些IO驱动程序分配缓冲区。此外,非连续内存区还提供了另一种使用高端内存页框的方法。3.1 分连续内存区的线性地址要查找一个线性地址的空闲区,从PAGE_OFFSET开始查找,即第4个GB的其实地址1、内存区的开始部分包含的是是对前896MB RAM进行映射的线性地址;直接映射的物理内存 阅读全文
posted @ 2013-04-24 00:34 shuying1234 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 2、内存管理区本节关注具有连续的物理地址和任意长度的内存单元序列。伙伴系统算法采用页框作为基本内存区,这适合于大块内存的请求。显然如果为了存放很少的字节而分配一整个页框,非常浪费。内碎片是由于请求内存的大小与分配给它的大小不匹配造成的。2.1 slab分配器slab分配算法基于下列前提:①、所存放数据的类型可以影响内存区的分配方式。slab分配器把内存区看成对象,这些对象由一组数据结构和几个叫构造和析构的函数组成,前者初始化内存区,后者回收内存区。为了避免重复初始化对象,slab分配器并不丢弃已分配的对象,而是释放但把他们保存在内存中。当以后又要请求的新的对象时,就可以从内存获取而不用重新初始 阅读全文
posted @ 2013-04-23 23:11 shuying1234 阅读(537) 评论(0) 推荐(0) 编辑
摘要: RAM的某些部分永久的分配给了内核,用来存放内核代码以及静态数据结构。RAM的其余部分被称为动态内存(dynamic memory),这不仅是进程所需,也是内核本身所需。本章主要描述内核如何给自己分配动态内存。分为页框管理、内存区管理和非连续内存区管理三部分。页框管理和内存区管理针对连续物理内存区分配内存的技术,非连续内存区管理介绍了如何处理非连续内存分配的问题。1、页框管理1.1 页描述符RAM由多个页框组成,内核必须了解这些页框的状态,比如页框是否空闲,页框属于进程还是内核等等。所以内核使用类型为page的描述符保存页框的描述信息。因为描述符本身长度为32字节,所以内核需要使用一些页框来专 阅读全文
posted @ 2013-04-22 22:12 shuying1234 阅读(433) 评论(0) 推荐(0) 编辑