【Linux系统】信号:再谈OS与内核区、信号捕捉、重入函数与 volatile




在这里插入图片描述



再谈操作系统与内核区


1、浅谈虚拟机和操作系统映射于地址空间的作用


我们调用任何函数(无论是库函数还是系统调用),都是在各自进程的地址空间中执行的。无论操作系统如何切换进程,它都能确保访问同一个操作系统实例。换句话说,系统调用方法的执行实际上是在进程的地址空间内完成的。

基于这种机制,如果让不同进程同时映射到不同的操作系统实例,是否就可以实现在多个“系统”环境中运行?这与虚拟机的实现密切相关。

虚拟机主要分为两种——内核级虚拟机和用户级虚拟机。

  • 内核级虚拟机提供了硬件级别的资源隔离和环境模拟,允许在同一物理机器上运行多个操作系统实例。
  • 用户级虚拟机通常指的是那些不需要操作系统层面支持的应用层隔离方案,如Java虚拟机。

Linux中的Docker就是一个例子,它利用了Linux的命名空间和资源隔离技术来实现类似虚拟机的功能。通过这种映射,我们可以创建多个相互隔离的应用环境,从而更好地理解为什么需要进行这样的映射以及它可以带来哪些有趣的可能性。



2、访问内核区需要软件和硬件层面的支持


在这里插入图片描述


此外,不论是通过哪个进程的地址空间,最终访问的都是同一个内核操作系统,并且是通过软中断进入内核区操作的。在进入内核区之前,进程会从用户态转变为内核态。这个转变不仅需要软件层面的许可,还需要硬件的支持,比如CPU的当前特权级别(CPL,Current Privilege Level)。CPL 为 0 表示内核态,为 3 表示用户态,存储在CS段寄存器中,占用 2 比特位。只有当CPL从 3 变为 0 时,进程才能访问内核 [3,4]GB 的空间位置。

CPU内部的内存管理单元(MMU)负责将虚拟地址转换为物理地址。在用户态下,只能访问[0,3]GB的空间,无法直接访问内核区的[3,4]GB地址空间。因此,用户程序不能直接访问内核数据;而是通过触发软中断(例如使用int 0x80syscall指令)间接访问。这些指令会触发CPU的固定例程,执行完后恢复用户代码的执行上下文。

如果用户自己非法访问内核区代码,会触发访问内核内存的保护

  • 内存保护:当用户程序试图访问内核空间的内存(例如 [3, 4] GB 区域)时,MMU 会检测到这是一个无效的内存访问,并触发一个页面错误。
  • 异常处理:内核会捕获这个页面错误,并根据情况进行处理,通常会终止违规的用户进程并生成一个错误报告。

假设用户程序试图直接访问内核内存:

void *kernel_ptr = (void *)0xC0000000; // 假设这是内核空间的一个地址
*(int *)kernel_ptr = 42; // 尝试写入内核内存

在这个例子中,当程序执行到 *(int *)kernel_ptr = 42; 时,MMU 会检测到这是一个无效的内存访问,并触发一个页面错误。内核会捕获这个错误,终止该进程,并生成一个段错误(Segmentation Fault)。



3、Linux 的两种权限等级


具体可以看这篇文章:【Linux系统】CPU指令集 和 Linux系统权限 ring 0 / ring 3


Linux 中只有 0 和 3 两种权限等级,没有 1 和 2,那为什么CPU设计不用 1 个比特位表示就好?

因为 Linux 系统如此,不代表其他系统,其它系统需要使用 1 和 2,就要留着,空间设计成 2 比特位大小

很多时候,这些“奇怪不统一”的设计,一般都是为了兼容不同系统等其他需求

拓展:

现代 CPU 通常有多个特权级别(也称为环或模式)。常见的特权级别有:

  • Ring 0:最高特权级别,内核模式。操作系统内核代码在这里运行,可以访问所有硬件资源和内存。
  • Ring 3:最低特权级别,用户模式。用户程序在这里运行,只能访问分配给它的内存和有限的硬件资源。


4、操作系统如何做到定期检查并刷新缓冲区?

操作系统通过创建特定的进程或线程来执行诸如定期检查和刷新缓冲区这样的固定任务。这些进程或线程专门用于处理一些系统级的维护工作,确保系统的高效运行。

  • 内核固定例程:这类例程包括了用于执行刷新缓冲区等操作的进程或线程。它们是操作系统为了完成某些周期性或持续性的任务而设置的,比如刷新文件系统的缓冲区以确保数据的一致性和最新状态。

此外,操作系统还会安排特定的进程或线程来定期检查定时器是否超时。这种机制对于实现延迟执行、轮询或其他基于时间的操作至关重要。

  • 定时器检查例程:这是另一类内核固定例程,专注于检测定时器是否已经到达预设的时间点。这有助于触发事件、执行预定的任务或者进行其他需要定时执行的操作。

在这些场景中,操作系统扮演的角色主要是调度这些固定例程的进程或线程,确保它们能够按时执行所需的任务而不干扰到其他用户进程的正常运行。通过这种方式,操作系统不仅保证了内部管理任务的有效执行,还维护了整个系统的稳定性和效率。



再谈细节:操作系统处理自定义信号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值