深入Linux内核架构

1. 简介与概述

1.1 内核的任务

内核是硬件与软件之间的一个中间层, 其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址

  • 从应用程序的视角看,内核可以被认作是一台增强的计算机。
  • 内核也可以是一个资源管理程序,负责将可用的共享资源(CPU时间, 磁盘空间, 网络连接等)分配到系统的各个进程。
  • 库也可以被视作一个, 提供了一组用于面向系统的命令。
1.2 实现策略
  1. 微内核 只用最基本的功能由中央内核(微内核)实现。其他的功能都委托给其他的进程,这些进程通过明确定义的通信接口与中心内核通信。好处:动态扩展性,在运行时切换重要的组件。 但是在各个组件之间支持复杂通信需要额外的通信时间。
  2. 宏内核 内核中的每个函数都可以访问内核中的其他所有部分。
1.3 内核的组成部分

linux 内核的高层次概述
在这里插入图片描述

1.3.1 进程、进程切换、调度
  1. 进程切换
  2. 调度 内核必须确认如何在现存的进程上共享cpu时间
1.3.2 UNIX进程

LINUX 对进程采用了一种层次系统, 每一个进程都会依赖于一个父进程。 内核启动init程序作为第一个进程,该进程负责进一步的系统初始化工作。

  1. fork 可以创建当前进程的一个副本,父子进程只有pid不同。Linux 使用写时复制使fork的操作更加的高效。主要原理: 将内存复制的操作延迟到父进程或者子进程向某个页面写入数据前,在只读访问的情况下,父子进程将共用同一个内存页。
  2. exec 将一个新程序加载到当前的进程的内存中执行,旧程序的内存也将被刷出。
  3. 线程,也被称为轻量级进程
  4. 命名空间
1.3.3 地址空间和特权级别

CPU的字长决定了所能管理的地址空间的最大长度;地址空间的最大长度与实际可用的物理内存数量无关,因此被称为虚拟地址空间,从系统的每个进程来看,地址空间中只有自身一个进程,而无法感知到其他的进程存在。
linux 将虚拟地址空间分为:内核空间 (高位TASK_SIZE~ 232)和用户空间(低位)
在这里插入图片描述

这种划分与实际可用的物理内存数量无关,每个用户进程都认为自身有3GiB(32位)的空间可用。,对于64位计算机,由于虚拟地址空间巨大,一般倾向于使用小于64的位数。

  1. 特权级别
    现代的CPU都提供了几种特权级别,进程可以驻留在某一个特权级别,每个特权级别都有各种限制,IA-32体系结构使用4种特权级别构成的系统
    在这里插入图片描述

虽然intel的cpu区分四种特权级别,但是linux只使用两种不同的状态 : 核心态用户态,这两种状态的关键差别是对高于TSAK_SIZE的内存空间的访问。在用户状态禁止访问内核空间, 用户进程不能操作和读取内核空间中的数据,也无法执行内核空间中的代码
从用户状态切换到核心态是通过系统调用的特定转换手段完成的,如果普通进程想要执行影响整个系统的操作,1. 只能借用系统调用向内核发出请求。内核首先检查进程是否允许执行想要的操作,然后代表进程执行所需的操作,接下来返回到用户状态。2. 内核还可以由异步硬件中断激活,然后在中断上下文中运行,在中断上下文中运行不能访问虚拟地址空间中的用户空间部分。
系统中还有内核线程在运行,内核线程不与任何特定的用户空间进程相关联,因此也无权处理用户空间

  1. 虚拟和物理地址空间
    使用页表 来为物理地址分配虚拟地址、
    虚拟地址都被内核划分位许多等长的部分,称为,物理地址也被划分为相同大小的页
    在这里插入图片描述

进程A的虚拟内存页1映射到了物理页4,而进程B的虚拟内存页映射到了物理内存页5.

物理内存中的内存页称为页帧

两个虚拟地址空间的页可以映射到同一个物理内存页,并非虚拟地址空间的所有页都映射到某一个页帧,

1.3.4 页表

用来将虚拟地址空间映射到物理地址空间的数据结构称为页表,由于地址虚拟地址空间中大部分区域都没有使用,可以使用多级分页 来减少页表的内存占用。
在这里插入图片描述

  1. 虚拟地址的第一个部分称为全局页目录(PGD), 用于索引进程中的一个数组(每个进程中有且仅用一个),给数组是全局页目录或PGD ,PGD的数组项指向另一些数组的起始地址,这些数组称为中间页目录(PMD)
  2. 在PGD中找到对应的PMD后,则使用PMD来所用PMD,PMD数组项也是指针,指向下一级数组,称为页表和页目录
  3. 虚拟地址的第三部分是PTE(页表数组),用作页表的所用,虚拟内存页和页帧的映射就此完成,,页表的数组项指向页帧
  4. 虚拟地址的最后一部分称为偏移量,它制定了页内部的一个字节位置。

缺点: 每次访问内存的时候,必须逐级访问多个数组才能将虚拟地址转化位物理地址
加速:

  1. cpu中有个部分称为MMU(内存管理单元),可优化内存访问操作。
  2. 地址转化中出现最频繁的那些地址,都保存到称为地址转换后备缓冲器(TLB)的cpu高速缓存中
1.3.5 物理内存的分配

内核可以只分配完整的页帧,将内存划分为更小部分的工作委托给用户空间的标准库。

  1. 伙伴系统
  2. slab缓存
  3. 页面交换与页面回收
    页面交换通过利用磁盘空间来作用扩展内存。 如果再需要当问相关的数据,内核会将相应的页切换回内存,通过缺页异常机制,这种切换操作对于应用程序来说是透明的
    页面回收用于将内存映射被修改的内容与底层的块设备同步,也成为数据回写
1.3.6 计时

jiffies jiffies_64 的全局变量

1.3.7 系统调用

系统调用是用户进程与内核交互的经典方法

  • 进程管理 创建新进程、查询信息、调试
  • 信号 发送信号,定时器以及相关处理机制
  • 文件
  • 目录和文件系统
  • 保护机制:读取和变更UID/GID,命名空间的处理
  • 定时器函数
1.3.8 设备驱动程序、块设备、字符设备
  1. 字符设备: 通过连续的数据流,应用程序可以顺序读取,通常不支持随机读取
  2. 块设备:应用程序可以随机访问设备数据
1.3.8 网络

Linux 使用源于BSD的套接字抽象,套接字可以看作是应用程序、文件接口、内核的网络实现之间的代理

1.3.9 文件系统

内核必须提供一个额外的软件层,将各种底层文件系统的具体特性与应用层(和内核自身)隔离开来。该软件层称为VFS,虚拟文件系统或虚拟文件系统交换器)。VFS既是向下的接口(所有文件系统都必须实现该接口),同时也是向上的接口(用户进程通过系统调用最终能够访问文件系统功能)。

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值