内核以物理页做为内存的基本单位,内存管理单元(MMU)正式以页做为单位进行处理,内存管理单元硬件负责将虚拟地址转为物理地址。因此从虚拟内存的角度来看,页就是最小的单位。node
多数32位体系结构的页大小为4KB,而64位体系结构则为8KB。也就是说1G大小的内存会被划分为262144个页来进行管理。linux内核使用page结构来描述物理页,位于linux/mm_types.h中。这个结构体大小为40B,对于页大小为8KB内存大小为4GB的系统来讲,要描述全部内存则须要524288个物理页,总大小为20MB。linux
内核会把页划分为不一样的区,将类似特性的页分为一组,有些页位于内存特定的物理地址上,因此不能用于特定任务。因为硬件的限制,内核须要对物理页区分对待。好比某些硬件只能经过某些特定的内存地址来执行直接内存访问。还有一些体系结构的内存物理寻址范围比虚拟寻址范围大,因而某些内存就不能永久地映射到内核空间上。算法
linux经过四种区来区份内存页,后端
32位x86系统中,小于16MB的物理内存为ZONE_DMA区,能用DMA操做。从16MB到896MB物理内存为ZONE_NORMAL区,正常可寻址页。高于896M的全部内存为ZONE_HIGHEM区,动态映射页。缓存
内核的栈不能像用户空间那样奢侈分配,内核栈大小是固定的,每一个进程都分配到一个固定大小的内核栈。每一个进程的内核栈大小与体系结构和编译选项有关,一般每一个进程有2个页大小的内核栈,因此32位和64位的内核栈大小分别为8KB和16KB。此外,中断栈不共享进程的内核栈,中断栈专门为进程提供用于中断处理程序的栈。网络
虚拟文件系统即VFS,属于内核子系统,为用户空间提供文件和文件系统相关接口。全部文件系统都依赖VFS共存且协同工做,经过VFS可使用标准UINX系统调用完成文件操做。VFS让用户可以直接使用open、read、write等系统调用来实现不一样物理介质的文件操做,它对不一样文件系统进行抽象并提供统一的操做。数据结构
系统调用经过VFS接口提供给用户空间使用,它实现了具体的文件系统细节。好比用户空间调用write()函数,会间接调用sys_wirte()函数,而后调用具体的文件系统去与物理介质交互。机器学习
unix的文件系统提供了四种抽象概念:文件、目录项、索引节点和安装点。文件和文件相关信息进行分离,文件相关的信息保存在索引节点中,即inode。分布式
VFS包括四个主要的对象类型:函数
可以随机访问固定大小数据的硬件设备称为块设备,块就是这里固定大小的数据。常见块设备有硬盘、软盘、闪存等等。相对于块设备,还有一类设备被称为字符设备。字符设备就是按照字符流的方式有序地访问,好比串口、键盘等。数据的随机访问是区分它们的主要依据。内核没有专门的子系统处理字符设备,但提供了专门的子系统来管理块设备,由于块设备的执行性能要求很高。
块设备最小可寻址单元是扇区,是块设备的基本单元,扇区大小为2的整数倍,常见的是512字节。块是最小逻辑可寻址单元,内核的全部操做都是按照块来执行的,块的大小不能超过页大小。扇区也称硬扇区或设备块,块也称文件块或I/O块。
当一个块被调入内存时会存储在一个缓冲区中,每一个缓冲区与块相对应。内核须要知道哪一个块设备和对应哪一个缓冲区,因此须要一个描述符来描述,它使用buffer_head结构体来表示,即缓冲区头。对于磁盘来讲,它的做用就是来描述磁盘块和物理内存缓冲区之间的映射关系。
块设备会将挂起的I/O请求放到请求队列中,该队列由reques_queue结构体表示,是一个双向链表。块设备驱动程序会根据请求队列的请求去操做块设备。
磁盘寻址是最慢的操做之一,每次寻址都会耗费较多时间,因此须要尽可能提高寻址性能。为了提高寻址性能,不能简单地按请求顺序去执行操做,而是会作一些合并和排序的预操做,以此来提高总体性能。内核中负责I/O请求的子系统称为I/O调度程序。
IO调度主要经过合并和排序来减小寻址时间,合并就是将两个或两个以上请求合并为一个请求,好比扇区相邻的请求就能够合并,只需一次就能拿到屡次请求的数据。而排序就是让整个请求队列按照扇区增加的方向有序地排序,这样就能保证磁盘头以直线方向移动,从而缩短寻址时间。
内核除了管理自身内存外还要管理用户空间的进程的内存,这个内存就是进程地址空间,即用户空间看到的内存。linux采用虚拟内存技术,每一个用户进程都以虚拟方式来共享内存,对某个进程它就像能访问全部物理内存。
进程地址空间由进程可寻址的虚拟内存组成,内核容许进程使用虚拟内存中的地址。一个进程的地址空间能够与另一个进程的地址空间相同,它们彼此不相干,便是线程。
进程只能访问有效内存区域的内存地址,每一个内存区域具备相关权限,若是一个进程访问不在有效范围内的内存区域,则内核会将该进程终止。
内存区域包括如下对象:
内核经过mm_struct结构体来描述进程的地址空间,它包含了全部相关信息。
当程序访问一个虚拟地址时须要将虚拟地址转为物理地址,而后CPU才能解析地址访问请求。地址的转换须要经过查页表来完成,将虚拟地址分段,使每一个虚拟地址都做为一个索引指向页表,页表则会指向下一级的页表或最终的物理页面。
linux使用三级页表来完成地址转换,利用多级页表可以节约地址转换须要占用的存放空间。顶级页表是页全局目录,二级页表是中间页目录,最后一级页表指向物理页面。每一个进程都有本身的页表,线程则会共享页表。
页高速缓存是linux内核实现的磁盘缓存,做用是减小磁盘的IO操做。主要是将磁盘数据缓存到物理内存中,从而让对磁盘的访问变为对物理内存的访问。这个主要的思想就是数据被一旦被访问,那么它极可能短时间会再次被访问。
有些设备是虚拟的,仅仅提供访问内核功能而已,称为伪设备。好比内核随机数发生器、空设备、零设备、满设备、内存设备。
专一于人工智能、读书与感想、聊聊数学、计算机科学、分布式、机器学习、深度学习、天然语言处理、算法与数据结构、Java深度、Tomcat内核等。