Linux内核基础
楔子
这部分的内容首先要回忆一下计算机的基础知识,基本的计算机结构包括CPU(算数逻辑单元ALU、控制单元CU)、存储器、输入和输出。CPU和其它设备是通过总线连接的。CPU执行的基础被称为指令集,CPU执行存储器存取指令时:CPU发出存取信号,然后就从存储器存取数据。存取器通过中断机制通知CPU存取完毕。引入中断机制的意义是,让CPU不必等IO的完毕,而转去执行其它指令。
计算机系统内核
内核的作用:
- 资源管理
- 提供基础库
传统意义上的内核实现有两种方式:
- 微内核结构:只有最基础的功能由中央内核实现,其它的功能都由一些其它进程实现。
- 宏内核结构;宏内核还包括有文件系统、内存管理、设备驱动程序功能。Linux内核属于宏内核。
虚拟地址空间
内存区域是通过指针寻址的,CPU字长决定了能够管理的地址空间的最大长度。现代计算机支持64位的字长,所以其管理的最大虚拟内存空间大小为 264B,实际可寻址的区域小于这个值。Linux将虚拟地址空间划分为两个部分:
- 内核空间,TASK_SIZE~264保留给内核专用,用户进程无法访问。
- 用户空间,从0~TASK_SIZE是用户空间范围
用户进程执行系统调用时,会发生用户状态到内核状态的切换,切换到内核空间后,由内核进程去执行相应的任务。每个进程都认为它占有全部的用户空间。
页表
虚拟地址空间和物理地址空间之间映射的问题是通过页表来实现的。物理地址和虚拟地址都被划分为页。进程A和进程B都拥有同样大小的虚拟地址空间,但是他们需要访问的资源不同,也就是需要访问的物理地址不同,所有只需要将其需要的访问的虚拟页映射到真实物理页即可。物理页经常被称为页帧,页一般指虚拟地址空间的页。
页表的设计
每个页表项数据结构中包含虚拟地址页以及与其相对应的页帧。如果只有一层,假如每页都是1KB,那么1GB就需要保存100个页表项,那么此时会很耗内存,所以实际设计方式中采用层次设计原理。Linux采用了四层页表:
- 全局页目录(Page Global Directory, PGD)
- 中间页目录(Page Middle Directory, PMD)
- 页表数组(Page Table Entry, PTE)
然后进行层级查询即可,此时不需要使用的虚拟地址空间,就不会有中间页目录、页表数组等。避免只用一个数组项保存数据而占用大量的内存。
层级设计存在的另一个问题是必须通过多层转换才能够访问到物理地址。所以内核有两种加速的方式:
- MMU(内存管理单元)优化内存访问操作
- 保存到TLB(Translation Lookaside Buffer)(CPU缓冲区)转移后备缓冲区将频繁使用的地址存储在其中,避免直接查询页表,节约时间。
物理内存的分配
- 伙伴系统:内存分配中经常需要分配连续的页
- slab缓冲:本质上用于更小的分配内存单元(从页中分配)
页面交换和页面回收
页面交换是通过缺页异常实现的。页面回收其实就是页面回写,将数据写入到硬盘中。
外设
- 块设备:可以随机访问数据,典型的就是硬盘,数据的读写只能以块(一般为512B)的倍数读写,按块读写。
- 字符设备:顺序读取,通常不支持随机存取。按字符/字节读写数据。
缓存
从低速块设备读取数据暂存在内存中,一般缓存也是按页组织的,称为页缓存。
标签:内核,简介,虚拟地址,页表,空间,CPU,内存 From: https://www.cnblogs.com/solicit/p/18342021