如果你一开始就读linux 内核,那么你的思路会变得非常开阔,如果你读过unix 内核,那么你会惊叹于linux 内核的巧妙,如果你连NT 的内核也了解,那么你会发现linux 内核真是个另类,本文从内核栈的角度来简要说明linux 为何另类。
了解操作系统原理和计算机体系结构的都知道在应用程序陷入内核的时候要将用户栈切换到内核栈,而引起陷入的有三种方式:1. 系统调用;2. 硬件中断;3. 异常。但是如果执行续本来就在内核而发生了中断,那么怎么办呢?unix ,nt ,linux 的处理是不同的:
1.unix 的方式:
unix 中的进程的内核上下文有静态部分和动态部分,其中静态部分就是区表,进程表项和U 区,本文我们不考虑,动态部分最重要的就是内核栈,unix 按照 系统支持的中断级别种类将进程的内核栈分为多个层,每个中断级别对应一个层,这个中断级别的概念和nt 的irql 有些类似,其实它们的作用还真的一样,用 来屏蔽同优先级或下优先级的中断,由此来保证多层的中断栈不会使上下文乱掉,栈的层次是单向提高或者降低的。具体过程就是:用户空间的进程进行系统调用或 者被中断,那么系统切换到第0 层内核栈,开始执行处理程序代码,此时有一个更高级别的中断发生,那么系统切换到第1 层内核栈,.... 系统切换到第n 层内 核栈,如果采用硬件屏蔽中断的方式,那么第n 层以及第n 层以下对应级别的中断根本就不会发生了,如果不是硬件屏蔽,那么可能还会发生,只不过不会执行中断 处理代码,而只是将低优先级的中断pending ,等到以后中断级别降低后再延迟执行,和linux 软中断类似,只不过unix 对待中断的方式更加统一 了,每个中断级别对应一个栈;
2.NT 的方式:
在NT 内核,系统定义了irql 的概念,和unix 的类似,只是没有分层的内核栈,中断完全借用当前线程的内核栈,因此nt 的中断都是在任意上下文执行 的,unix 是同步的,意思是说虽然用了中断级别的概念,但是也就对“ 真正” 的中断有用,而nt 将很多可能的操作都往irql 框架填,以“ 假” 中断-- 软 中断的方式执行。某种意义上,nt 也是和unix 一样以一种统一的方式处理中断,不同的是unix 对待当前进程和中断的方式更加仁慈,多层内核栈保证了一 切,nt 就不那么仁慈了,直接借用了当前进程的内核栈,造成中断和当前进程鱼龙混杂的局面;
3.Linux 的方式:
Linux 的方式对于高手是轻松的,对于思维僵化的人是沉重的,它的实现相当灵活,毅然抛弃了硬件都建议的中断优先级的概念,从而也就抛弃了处理器中断级 别的概念,所有中断一视同仁,完全可嵌套;另外linux 没有那么多所谓的“ 层次” ,效率绝对有优势,对于中断上下文,和nt 一样,借用当前进程上下文, 采用硬件中断发布软中断的方式,这个也和nt 一样,但是却没有出现混乱,linux 内核尽量减少硬件中断处理时间,而且也不过分执行软中断,过多的软中断 在ksoftirqd 的进程上下文执行,它有自己的内核栈。你不能说linux 没有内核栈是它的弱点,linux 内核是高度可配置的,linux 内核也可 以配置独立的内核中断栈,反正不管你怎么说,linux 都是可以做到unix 或nt 能做到的事情,linux 内核是典型的“ 两面三刀” ,呵呵,不过我喜 欢。
谈完上面的三点,我想linux 为何另类的原因就不用多说了,linux 没有规则,没有规则就是灵活,而且总是毫不留情的抛弃硬件的建议,按照自己的方式 进行处理,其强大的内核机制保证不会发生混乱,而强大的内核机制竟然出自一个个小巧的数据结构,其一眼望去不是那么华丽,但是却是深不可测,毫无定法。
说linux 不规则,仅仅从系统结构的角度来说,它处理问题的方式却比unix 和windows 更规则,比如对于陷入内核的进程,和没有陷入的一样接受同 样的调度,linux 只是简单的区分交互进程来使得睡眠过久的进程提升优先级而不会像unix 的sysyem v 那样将唤醒优先级和睡眠原因硬性联系起来也不会像nt 那样规定不允许这也不允许那。
综上,如果你仅读过linux ,那么你会想当然认为所有内核都那样,有这种想法的原因就在于linux 内核设计原则就是按照现实世界的原则设计的,它的开 发人员极端复杂,本来就是三教九流,就难怪内核的两面三刀了。别的内核可能就不是那么“ 现实” 了,它们都是为了开发“ 内核” 而开发内核的,和现实的联系没 有linux 内核那么大,开发过程很规则,要经过总体构思和设计。这个世界,只要经过组织全盘设计过的东西,十有八九没有独侠的东西更具杀伤力,看过金庸 的小说吗?里面那个武林高手是属于军队的!?招无定法才是武林至尊,不要看外表多华丽,不要看内在多合逻辑,那还看什么,什么也不要看,只要默默品味就可 以了。
相关推荐
Apache-Plc4x-Modbus-Tcp学习记录(一)
Apache-Plc4x-Modbus-Tcp学习记录(一)
深度解析UNIX系统的发展历程、由来与核心内容
今天,当我们使用Linux命令行、macOS终端或是通过SSH管理远程服务器时,我们仍在与UNIX的传统对话。理解UNIX的发展历程和核心设计,不仅有助于我们更好地使用现代操作系统,更能从中学习到优秀的软件工程思想,这对每一位技术从业者都具有深远意义
从CAD图纸到GIS地图:手把手教你用Global Mapper处理DWG文件(含坐标配准)
本文详细介绍了如何使用Global Mapper将CAD图纸(DWG文件)转换为GIS地图,包括坐标配准、图层与属性转换等关键步骤。通过四参数变换和控制点匹配技术,确保数据精准转换,适用于测绘、城市规划等领域。文章还提供了高级处理技巧和质量控制流程,帮助用户高效完成GIS化工作。
进程上下文
进程上下文 可执行程序代码是进程的重要组成部分。这些代码从可执行文件载入到进程的地址空间执行。一般程序在用户空间执行当一个程序调用了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文。在此上下文中current宏是有效的。除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在用户空间继续执行。
Zephyr RTOS 嵌入式 C 编程 (使用嵌入式 RTOS POSIX API)8. Zephyr RTOS 与以太网、Wi-Fi 及 TCP/IP
支持的 BSD 函数包括:socket()、close()、recv()、recvfrom()、send()、sendto()、connect()、bind()、listen()、accept()、fcntl()(用于设置非阻塞模式)、getsockopt()、setsockopt()、poll()、select()、getaddrinfo()和 getnameinfo()。向开发板烧录代码也可能存在问题。可以通过调用 net_if_up() 开启网络接口 ,调用 net_if_down() 关闭接口。
【LPDDR4 - 学习二】LPDDR4 介绍 ——LPDDR4 芯片引脚说明解析
本文系统解析了LPDDR4内存芯片的引脚定义与特性,重点介绍了272球POPFBGA封装的双通道架构。内容涵盖电源管理(三级供电架构与上电时序)、控制信号(差分时钟与复用命令总线)、数据接口(16位双向数据总线与选通信号)以及校准复位等核心模块。通过表格详细列明了各引脚电压范围、功能定义及工程注意事项,并附有典型封装球位分布图。全文基于JEDEC标准,为移动设备内存设计提供全面的硬件参考,特别强调电源时序控制、信号完整性及抗干扰设计等关键点。
LINUX 系统调用
什么是系统调用 顾名思意,系统调用说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置系统时间等。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内
【Bug已解决】Claude Code Auto-update failed 自动更新失败的解决方案
方案适用场景推荐指数清理残留重新安装已经损坏,需要快速恢复可用⭐⭐⭐⭐⭐修复目录权限权限不足导致更新反复失败⭐⭐⭐⭐⭐关闭自动更新网络/安全软件环境不稳定⭐⭐⭐切换原生安装方式想从根源规避 npm 更新问题⭐⭐⭐⭐自检修复脚本团队/服务器环境需要自动化恢复⭐⭐⭐报错的本质是自动更新过程中的文件替换操作因权限不足或被中断而处于不完整状态,而不是 Claude Code 本身的功能缺陷。遇到问题先清理残留文件再重新安装,不要在损坏状态上反复尝试修复;
从著名的list_head看linux内核中OO && 从Unix分层内核栈以及中断处理看Linux内核的另类
如果有人问我最欣赏linux的什么,我会毫不犹豫地回答:list_head。这个小小的结构向世人说明了用c语言写成的linux内核也在实现着OO,下面我就具体来说一下下。 先看list_head struct list_head { struct list_head *next, *prev; }; 就 这吗?就这!你别看它小,它却可以充当任何在内核中存在的东西,几乎所...
开关电源中的高频振荡噪声及其抑制方法
在开关电源的工作过程中,随着开关管的开关动作,电流和电压波形会出现剧烈的波动,尤其是在开关管切换的瞬间,往往会导致较强的过冲现象。开关电源中的高频振荡噪声是导致电磁兼容问题的主要源头之一,尤其是MOS管的通断和整流二极管的反向恢复过程中,会产生较强的高频振荡噪声。通过合理调节R和C的值,可以大大缓解高频振荡带来的EMC问题,从而有效提升电源的电磁兼容性。整流二极管反向恢复时的振荡会导致高频噪声产生,这些高频噪声源可被传导到电源的输出端,甚至可能通过电源的共地路径扩散到其他电路,影响系统的稳定性和可靠性。
Unity 佳能SDK 及数据获取
3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。
结合中断分析TCP/IP协议栈在Linux内核中的运行时序
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次的差异。 目录 1.Linux网络子系统的分层 2.TCP/IP分层模型 3.Linux网络协议栈 4.Linux网卡收包时的中断处理问题 5.Linux网络启动的准备工作 6.Linux网络包:中断到网络层接收 7.总结 Linux网络子系统的分层 Linux网络子系统实现需...
Altium Designer 超详细入门教程
本文是一份Altium Designer新手入门教程,详细介绍了从软件基础到PCB制版的全流程。主要内容包括:软件界面介绍与工程创建方法;原理图设计中的元件放置、电气连线、标注添加等操作;PCB设计的布局布线、铺铜和DRC检查;Gerber和钻孔文件的导出方法。教程还提供了分类整理的实用快捷键表和新手避坑指南,强调原理图编译和DRC检查的重要性。通过本教程,新手可以快速掌握AD基本操作,完成简单电路板的设计与制版文件导出。
结合中断分析TCP/IP协议栈在LINUX内核中的运行时序
结合中断分析TCP/IP协议栈在Linux内核中的运行时序 - xholic - 博客园目录: 1.Linux网络子系统的分层 2.TCP/IP分层模型 3.Linux 网络协议栈 4.Linux 网卡收包时的中断处理问题 5.Linux 网络启动的准备工作 6.Linux网络包:中断到https://www.cnblogs.com/ypholic/p/14337328.html 目录: 1.Linux网络子系统的分层 2.TCP/IP分层模型 3.Linux网络协议栈 4.Linux网卡收包..
RU DOS版、EFI版32bit/64bit BIOS常用工具
DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
探究Windows内核你知多少
<br />如上所述,现代操作系统的一个明显特征就是用户空间和系统空间的划分,从UNIX时代以来,人们一直把存在于系统空间的代码和数据的集合称为“内核(Kernel)”,因此内核是有明确边界的。空间的不同,或者说CPU运行模式(系统态和用户态)的不同,是不会被混淆的本质区别。可是,在Windows的术语中却不同,微软并不把系统空间的所有代码和数据的集合称为内核,而是把这里面的一部分,即比较低层、与硬件靠得最近因而最为核心的一部分称为“内核”,即Kernel。实际上,这也反映了当初微软在决策上的举棋不定,因为
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
1.2 Linux 内核整体架构
分层架构:清晰的分层使各模块职责明确面向对象:使用 C 语言实现面向对象设计模式高度可配置:支持从嵌入式到超级计算机持续演进:不断吸收新技术保持活力理解内核架构是深入学习的第一步,接下来我们将逐个深入各个核心子系统。下一节:进程管理 - 深入理解 task_struct 与调度器。
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
用户态和内核态
一、 Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接...
Linux 内核设计中的核心思想与架构原则
用户空间 ──────────────────────────────。硬件抽象 ──────────────────────────────。I/O调度器选择:noop, deadline, cfq, bfq。2. 分层抽象:硬件->内核->系统调用->应用程序。小型专用工具:每个程序只做好一件事,通过管道组合。机制与策略分离:内核提供机制,用户空间决定策略。Linux 内核设计:核心思想与架构原则。1. 单一性原则:一个模块只做一个功能。内核空间 ├─ 进程管理 ── 调度器。
一文搞定 | Linux 网络子系统
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,...
Linux网络子系统
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,...
6988



被折叠的 条评论
为什么被折叠?



