您的位置:首页 > 运维架构 > Linux

Linux设备驱动程序——Linux设备驱动程序——内存和I/O基础知识学习:(2)内核中相关基础知识学习

2013-08-13 15:32 281 查看
接上篇内存和I/O基础知识学习:(1)内核中相关基础知识学习

    Linux主要由5个模块组成、分别是进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

    进程调度模块用来负责控制进程对CPU资源的使用,通过调度使得各个进程能偶公平的访问CPU。内存管理模块用于确保各进程能够安全的共享内存。虚拟文件系统通过向所有的外部设备提供一个通用的文件接口,隐藏了各个硬件设备的不同细节。进程间的通信模块子系统用来支持多种进程间的信息交换。网络接口模式提供对多种网络通信标准的访问,并且支持多种网络硬件。

各个模块之间的相互关系如下:

所有的模块都和进程调度存在依赖关系,需要进程调度来挂起或者重新运行进程。连线表示相互之间的依赖关系,而虚线和虚框表示还没有实现的部分



若从内核的模式结构模型出发来看,我们还可以根据内核源代码的结构将内核的主要模块绘制如下:



Linux内核对内存的管理和使用

物理内存

为了有效的使用物理内存,在系统的初始化阶段内存被h划分成几个功能的区域,如下图所示:



这其中LInux内核程序占据着物理内存的开始部分吗,接下来的就是硬盘和软盘的高速缓存。这其中包含着显卡内存和ROM BIOS所占用的内存部分。内存的最后部分是给所有程序可以使用的主内存区。内核程序在使用的时候同样向内核管理模块需要申请。

对于LInux0.11系统,内核设置的额全局描述符GDT中的段描述符的最大数目是256,其中两项空闲,2项系统使用,每个进程使用两项。因此系统最多可以容纳126个任务,126*64M大概是8G,0.11内核中定义的最大的任务数是64个,所使用的线性空间的范围是64MB*64=4G。下面的图显示了当系统具有4个任务的时候的情况

CPU多任务和保护方式
在前面提过CPU是分级的,在intel80x86中有4个保护级,0级最高,3级别最低。内核代码由所有的任务共享,每个任务有着自己的代码区和数据区,这些内容保存在局部地址空间中。
         
 当一个任务执行系统调用而陷内核代码的执行的时候,我们就说进程处于内核态,此时处理器处于特权级别最高的(0级)内核代码中执行。当进程处于内核态时,执行的代码会使用当前的内核栈。当进程执行自己的代码的时候,就称其处于用户态,此时的处理器在特权级别最低的3级用户代码中执行。当正字啊实行的用户程序突然被中断程序终端的时候,也可以暂时认为当前的进程处于内核态,因为这个时候中断会使用当前的内核栈。

虚拟地址、线性地址和物理地址之间的关系
对于Linux0.11内核代码和数据来说,在head.s程序的初始化操作中已经把内核代码段 和数据单独设置成为长度为16Mb的段,在线性地址空间中这两个端点额范围相互重叠。都是从线性地址的0开始到地址0xFFFFFF共16Mb.这个范围内有着内核中所有的代码、内核段表(GDT、IDT、TSS),页目录表和内核的耳机页表、内核局部数据和内核临时堆栈,其中页目录表和二级页表已经设置成把0-16Mb的线性地址空间对应到物理地址上面,占用四个目录数,即四个二级页表,因此对于内核中数据来说可以把他看做是物理内存中的地址,此时三个地址加纳的相互关系如下所示:

因此默认情况下内核可以管理16MB的物理内存,有4096(4k)个物理页面,通过上面的分析可以得出:内核的代码段和数据段在线性地址空间中和物理地址空间中是一样的。
用户申请内存的动态分配
当用户应用程序使用C中的内存分配函数malloc()申请内存的时,这些动态申请的内存容量大小有malloc(0函数来进行管理,内核不会插手管理,因为内核已经为每个进程在CPU的线性空间中分配了64MB的空间,所以只要进程执行时的寻址范围在它的64MB的范围之内,内核会通过内存缺页机制,自动为寻址对应的页面分配物理内存并且进行映射操作,但是在这个过程中内核会为进程使用的代码和数据空间维护一个当前位置的brk,这个值保存在每个进程中的的数据结构中,指出了当前进程中的代码和数据(包括动态分配的数据空间)在进程地址空间中的末端位置,当malloc()函数为程序分配内存的时候,它会通过系统调用brk()把程序要求新增的空间内长度通知内核,内核通过提供的信息来更新brk的值,但是此时并不为新申请的空间映射物理内存页面。只有当程序寻址到某个不存在对应物理页面的地址的时候,内核才会进行相关的物理内存页面的映射操作。(这里红色的部分有矛盾呀,这里被弄糊涂了,究竟是映射还是不映射物理内存,希望知道的大神给予解释一下)
申请的内存释放用free()函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 驱动 内存 内核