Linux内核——Linux内核体系模式(二)
1 Linux系统的中断机制
Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。
- 中断int0-int31(0x00-0x1f)作为异常
- int32-int255由用户自己设定

- int32-int47对应与8259A中断控制芯片发出的硬件中断请求信号IRQ0-IRQ15,并把程序编程发出的系统调用中断设置为intl28(0x80)。系统调用中断是用户程序使用操作系统资源的唯一界面接口。


1. 系统如何进行中断初始化 - 内核在head.s程序中使用一个哑中断向量(中断描述符)对中断描述符表IDT中所有256个描述符进行了默认设置(boot/head.s,78)。哑中断向量指向一个默认的“无中断”处理过程(boot/head.s,150)。
- 当发生了一个中断而又没有重新设置过该中断向量就会显示信息“未知中断(Unknown Interrupt)”
- 可以对所有256项都进行设置可以有效防止出现一般保护性错误(异常13)。否则当设置的IDT少于256项,那么在一个要求的中断所指定的描述符项大于设置的最大描述符项时,CPU就产生一个一般保护出错(异常13)
- 如果硬件出问题没有吧设备的向量放到数据总线上,此时CPU会从数据总线上读入全1作为向量,将会造成一般保护出错。
- 异常中断处理过程(int0-int31)都在traps.c的初始化函数中进行了重新设置(kernel/traps.c,181),系统调用中断int128在调度程序初始化函数中进行了重新设置(kernel/sched.c,385)。
-
中断和陷阱门的使用:
- Linux内核使用中断门和陷阱门两种描述符来处理中断,区别在于对EFLAGS寄存器中的IF(中断允许)标志的影响。
- 中断门会复位IF标志,避免其他中断干扰;陷阱门则不影响IF标志。
-
标志寄存器的中断标志管理:
- Linux内核使用cli和sti指令来控制CPU的中断响应。
- cli指令清除中断标志,禁止中断;sti指令设置中断标志,允许中断。
- 这种方法用于保护临界代码区免受中断干扰,避免数据竞争和系统崩溃。
2 Linux的系统调用
系统调用
系统调用是用户程序与操作系统内核之间的接口,用于请求操作系统提供的服务。通常使用函数形式进行调用,可以带有参数,并通过返回值表示执行结果。
1 )系统调用号和错误处理:
每个系统调用都有一个唯一的功能号,这些功能号定义在include/unistd.h文件中。错误的系统调用会返回负值,并把错误类型码存储在全局变量errno中。
2)系统调用的实现机制:
系统调用通过中断0x80进入内核,eax寄存器存放系统调用号,ebx、ecx和edx寄存器用于传递参数。Linux内核中的系统调用处理函数以’sys_'为前缀,例如write系统调用的处理程序是sys_write。
系统调用处理过程
- 当发出中断调用int 0x80后,system_call程序开始执行,它检查系统调用号的有效性,并从sys_call_table[]数组中调用相应的处理程序。
- sys_call_table[]数组中的索引对应系统调用的功能号,每个索引处的函数指针指向相应的内核服务程序。
- 库函数与直接系统调用:
- 用户程序通常通过库函数间接调用系统调用,但也可以跳过库函数直接执行系统调用。
- 直接执行系统调用可以使用宏syscalln(),其中n代表参数个数,例如syscall3表示三个参数。
- 系统调用接口是内核与应用程序交互的唯一途径,它允许应用程序利用内核提供的服务来访问系统硬件资源。
(八股回答)
在Linux系统中,系统调用的处理过程是一个复杂的机制,涉及用户空间和内核空间之间的交互。
1. 触发系统调用 当用户程序需要操作系统提供的服务时,它会通过库函数(如C标准库中的函数)或直接通过内嵌汇编语句来触发一个系统调用。这通常涉及执行一个特殊的汇编指令(如
int$0x80),该指令会产生一个异常,使得控制权转移到内核空间。2. 传递系统调用号和参数 在执行系统调用指令之前,程序会将系统调用号存储在
eax寄存器中,将任何需要的参数存储在ebx、ecx和edx寄存器中。这些参数是系统调用可能需要的输入数据。3. 进入内核空间 当CPU执行
int $0x80指令时,它会切换到内核模式并跳转到异常处理程序的地址。在Linux中,这个处理程序是system_call函数,它位于kernel/system_calls文件中。4. 系统调用分发
system_call函数首先检查eax寄存器中的系统调用号是否有效。然后,它使用系统调用号作为索引,从sys_call_table数组中查找相应的内核函数指针,并间接调用该函数。sys_call_table是一个包含所有系统调用处理函数指针的数组。5. 执行系统调用处理程序 一旦找到并调用了相应的内核函数,它将执行所需的操作,可能会访问硬件设备、管理文件系统或执行其他内核级别的任务。
6. 返回用户空间 系统调用处理程序执行完毕后,它将返回值存储在
eax寄存器中,并执行iret指令返回到用户空间。如果在系统调用过程中发生错误,一个负值会被存储在eax中,而错误号会被存储在errno全局变量中供应用程序检查。7. 获取系统调用结果 一旦控制权返回给用户程序,它可以检查
eax寄存器中的返回值以确定系统调用的结果。如果返回值是正数,表示系统调用成功;如果是负数,则表示系统调用失败,程序可以查看errno以获取错误信息。
3 Linux进程控制
-
进程调度
Linux操作系统采用基于优先级的进程调度算法,常见的如完全公平队列(Completely Fair Scheduler, CFS)。CFS的目标是确保每个进程获得公平的CPU时间,同时考虑到进程的优先级。- 进程优先级:每个进程都有一个优先级,这个优先级决定了它在CPU上执行的时间。高优先级的进程会获得更多的CPU时间。
- 时间片:CFS为每个进程分配一个运行的时间片,这个时间片基于进程的优先级。当一个进程的时间片用完后,它会被放到运行队列的末尾。
-
分时技术
分时技术是一种操作系统管理多个进程的方法,使得每个进程都能在有限的时间内获得CPU的使用权。- 时间片轮转:操作系统为每个进程分配一个小的时间片(通常是几十毫秒),在这个时间片内,进程可以执行指令。时间片结束后,即使进程没有完成执行,也会被挂起,操作系统接着运行下一个进程的时间片。
- 抢占式多任务:如果一个更高优先级的进程需要CPU,当前运行的低优先级进程会被抢占,即被中断并移动到运行队列的末尾,而高优先级进程将获得CPU
-
多级反馈队列(MLFQ)
Linux还采用了多级反馈队列(Multi-Level Feedback Queue, MLFQ)来进一步优化进程调度。- 多级队列:进程根据其行为和优先级被分类到不同的队列中。例如,交互式进程可能被放在一个更高的优先级队列,而批处理进程则可能被放在一个较低的优先级队列。
- 反馈机制:进程的行为(如CPU使用时间、阻塞频率等)会影响其在队列中的优先级。例如,经常使用CPU的进程可能会被降低优先级,而不经常使用的进程则可能被提升优先级。
-
用户控制与系统配置
系统管理员可以调整系统的各种参数来控制进程调度的行为,以适应特定的工作负载和性能要求。- 调整优先级:可以通过nice值来调整进程的优先级,影响其在CPU上的运行时间。
- 配置调度器:Linux允许管理员选择不同的进程调度器,或者调整现有调度器的参数,以优化特定类型的应用程序或工作负载。
-
任务数据结构
进程表项是一个task_struct任务结构指针。


-
进程运行状态

-
进程初始化与创建进程
【Linux】Linux进程的创建与管理
Linux系统初始化进程及文件(带命令)
相关文章:
Linux内核——Linux内核体系模式(二)
1 Linux系统的中断机制 Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31(0x00-0x1f)作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…...
Spring MVC的高级功能——异常处理(一)简单异常处理器
一、HandlerExceptionResolver接口 如果希望对Spring MVC中所有异常进行统一处理,可以使用Spring MVC提供的异常处理器HandlerExceptionResolver接口。Spring MVC内部提供了HandlerExceptionResolver的实现类SimpleMappingExceptionResolver。它实现了简单的异常处理…...
【面试干货】Static关键字的用法详解
【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…...
软件工程实验
实验环境和需求 用户可以对相片进行按类别管理,用户可以设定不同的类别,然后上传照片到相应的类别中,并能进行照片的删除,注释 运行 运行并访问 localhost 8090,图片在数据库中的信息是D:/upgrade 后面的内容 se…...
对于复杂的网页布局,如多列布局和网格布局,CSS 有哪些最佳实践和技巧?
对于复杂的网页布局,如多列布局和网格布局,以下是一些CSS的最佳实践和技巧: 使用Flexbox或CSS Grid布局:Flexbox和CSS Grid是两个强大的CSS布局模型,可用于实现复杂的网页布局。Flexbox适用于单行或单列布局࿰…...
Spring Boot中集成Redis实现缓存功能
Spring Boot中集成Redis实现缓存功能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何在Spring Boot应用程序中集成Redis,实现…...
arco disign vue 日期组件的样式穿透
问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…...
【深度学习】pytorch训练中的一个大坑
使用的命令:iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上,训练结果特别慢。 所以我把它移动到了ssd上,然后训练参数用的 resume, 但是!!!!它把历史记住…...
python全局解释器锁(GIL)
文章目录 1.cpu工作方式2.python全局解释器锁与多线程3.其他语言的多线程4.如何解决假的多线程 1.cpu工作方式 先来先服务(First Come, First Served,FCFS): 最简单的调度算法,按照作业或进程到达的顺序依次执行。没有…...
无人机的起源
无人机起源于20世纪初的早期实验阶段,并随着技术进步逐步发展。无人机,作为现代科技领域中的一项重要创新,已经在全球范围内展现出其巨大的潜力和应用价值。 无人机的历史可以追溯到1917年,美国人艾德温.奥斯特林发明了“飞行训练…...
专题六:Spring源码之初始化容器BeanFactory
上一篇咱们通过一个例子介绍初始化容器上下文相关内容,并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点,和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…...
缓存双写一致性(笔记)
缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式:缓存有就返回,没有数据库查询,放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似,程序不需要关注从哪里读取数据,它只需要从缓存查询数据。…...
运动馆预约管理系统设计
设计一个运动馆预约管理系统,需要考虑到用户需求、系统功能、技术实现和用户体验等多个方面。以下是一个基本的设计框架: 1. 系统目标 提供便捷的运动场地预约服务。 实现运动馆资源的有效管理和利用。 支持在线支付,提高交易效率。 提供数…...
第五届计算机、大数据与人工智能国际会议(ICCBD+AI 2024)
随着科技的飞速发展,计算机、大数据和人工智能等前沿技术已成为推动社会进步的重要力量。为了加强这一领域的学术交流与合作,促进技术创新与发展,第五届计算机、大数据与人工智能国际会议(ICCBDAI 2024)将于2024年11月…...
高效的向量搜索算法——分层可导航小世界图(HNSW)
最近在接触大模型相关内容,发现一种高效的向量搜索算法HNSW,这里做一下记录。 在之前自己也接触过一段时间的复杂网络(网络科学),没想到,将网络科学的思想引入到向量搜索算法中,可以产生令人眼前…...
【MySQL备份】Percona XtraBackup全量备份实战篇
目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练:利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…...
港口危险货物安全管理人员考试题库(含答案)
一、单选题 1.化学品安全标签内容中警示词有( )种分别进行危害程度的警示。 A、3 B、4 C、5 参考答案:A 2.运输放射性物品,应当使用( )的放射性物品运输包装容器(以下简称运输容器)。 A、专业 B、专用 C、统一 D、定制 参考答案:B 3.库区仪表及计算机监控管理系…...
什么是 JVM( Java 虚拟机),它在 Java 程序执行中扮演什么角色?
JVM,全称Java Virtual Machine,中文译作“Java虚拟机”,它是运行Java程序的软件环境,也是Java语言的核心部分之一。 想象一下,如果你是一位环球旅行家,每到一个新的国家,都需要学习当地的语言才…...
Python容器 之 列表--下标和切片
列表的切片 得到是 新的列表字符串的切片 得到是 新的字符串 如果下标 不存在会报错 list1 [1, 3.14, "hello", False] print(list1)# 获取 列表中 第一个数据 print(list1[0]) # 1# 获取列表中的最后一个数据 print(list1[-1]) # [False]# 获取中间两个数 即 3.1…...
Docker 运行Nacos无法访问地址解决方法
参考我的上一篇文章去配置好镜像加速器,镜像加速器不是配置越多越好,重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆,发现下不下来。 镜像源地址:https:…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
