- 博客(32)
- 收藏
- 关注
原创 系统调用也是由中断实现,为什么处于进程上下文中,而不是中断上下文
中断机制在这里仅仅充当了一个安全切换到内核态并跳转到指定入口点的桥梁,而不是定义其执行上下文的本质。硬件中断上下文则因其异步性、无关联性和快速响应要求而截然不同,严禁睡眠。系统调用(Syscall)在x86架构上传统上是通过软件中断(例如。中,而非中断上下文。这种区别源于系统调用的。)或更现代的专用指令(如。然而,系统调用处理程序。因此,系统调用之所以处于。,根本原因在于它是由。
2025-06-15 20:45:44
847
原创 进程上下文与中断上下文详解
它没有进程的“身份”和“状态”供调度器管理,因此绝对不能睡眠或进行进程切换。简言之,中断处理程序和被中断进程之间,没有什么瓜葛,不具有绑定关系或代表关系,决不能通过进程调度恢复中断的执行。如果,非要在两者之间找一点关系的话,那就是中断处理程序借用被中断进程的内核栈(这一点也是可选地,linux允许设置独立内核栈)。在Linux内核中,“进程上下文”和“中断上下文”是两种截然不同的执行环境,理解它们的区别对于编写内核代码(尤其是驱动程序)至关重要。是 (可被更高优先级进程/中断抢占)(可被调度器切换出去)
2025-06-15 20:42:17
720
原创 Linux如何区分普通进程和实时进程
特点:使用 **完全公平调度器(CFS)** 分配 CPU 时间,优先级由 `nice` 值(范围 `-20` 到 `19`)动态调整。设置实时进程需 `CAP_SYS_NICE` 能力(通常需 `root` 权限),避免低权限用户创建实时进程导致系统不稳定。- 特点:优先级固定(**实时优先级**),范围 `1`(最低)到 `99`(最高),**始终优先于普通进程**。实时优先级固定为 **`0`**(通过系统调用或工具查看时显示为 `0` 或 `-`)。- `-` 或 `0` → 普通进程。
2025-06-02 08:45:36
1067
原创 Linux中断分类、中断描述符分类及关系
中断(异步,由硬件随机产生可屏蔽中断(I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断)N/A中断门不可屏蔽中断NMI(只有几个特定的危急事件才引起非屏蔽中断)N/A中断门异常(同步的,在特殊的或出错的指令执行时由CPU控制单元产生处理器探测异常(由CPU执行指令时探测到一个反常条件时产生,溢出、除0)故障Fault(内核栈eip=引起故障的指令的地址,可纠正,处理完可继续执行,如缺页异常)陷阱或中断门(根据是否需要屏蔽中断)
2025-05-18 10:31:33
607
原创 Linux内核页表的建立
但内核实际加载的物理起始地址是内存的第一个兆字节(0x00100000)。若支持PSE位,则设置该位以使用4MiB的TLB条目(而非4KiB)。因此,在启用分页单元之前,必须建立一个页表映射,将8MiB的物理内存转换为虚拟地址。寄存器的对应位启用分页单元,并立即执行跳转指令以确保指令指针(EIP寄存器)的正确性。,则会设置该位,使得被转换的页为4MiB大页(而非常规的4KiB页)。,则也会设置该标志,使页表项成为全局项并对所有进程可见。返回后,内核空间的页表已完全初始化,此时静态页全局目录(
2025-04-19 10:24:13
520
原创 【Linux内核】AT&T汇编编程练习
编写AT&T汇编程序,接收正整数输入n,计算1到n的和,并打印在屏幕上。LInux下,先安装GCC,编写r如下代码,命名为sum.s。
2025-04-12 19:47:27
189
原创 【Linux内核】页表的申请、释放与使用
页表是包含条目数组的物理页,而物理页的分配与释放是一项相对高资源消费的操作,这不仅体现在时间开销上,还因为页面分配期间需禁用中断。无论针对页表的哪一级别(PGD、PMD或PTE),分配与删除操作均极为频繁,因此确保其高效性至关重要。为此,用于页表的物理页被缓存在多个称为的链表中。各架构对此缓存的实现方式虽不同,但核心原理一致。例如,并非所有架构均缓存PGD页表,因为其分配与释放仅发生在进程创建与退出时。而由于进程创建与退出本身已是高开销操作,额外分配一个物理页的开销相对可忽略。
2025-04-12 10:26:28
2425
原创 Linux内核分页——线性地址结构
每个进程通过一个指针(即进程的mm_struct→pgd)指向其专属的页全局目录(PGD),该目录本身存储在一个物理页框中。页表的加载方式因架构而异:在x86架构中,进程页表通过将mm_struct→pgd复制到cr3寄存器来加载,这一操作会附带刷新TLB(事实上,这正是架构相关代码中flush_tlb()函数的实现原理)。每个PMD条目进一步指向另一个页框,其中包含类型为pte_t的页表项(PTE),而这些PTE最终指向存储实际用户数据的物理页框。其中,SHIFT宏定义了该层级页表映射的地址位长度。
2025-04-11 22:01:10
848
原创 Linux内核——虚拟地址映射方式
固定映射线性地址是一类特殊的单页映射,用于访问常用外设(如APIC、IO APIC)的寄存器。(与低内存区域的线性映射相对)。而在64位系统中,高端内存主要用于实现内核空间的任意映射。指将连续的虚拟页(V, V+1, ..., V+n)映射到连续的物理页(P, P+1, ..., P+n)的特殊映射方式。多页映射允许将连续的物理内存范围映射到高端内存区域。永久映射允许长期持有映射(时间未定义),支持在映射后发生上下文切换再释放。临时映射用于在内核空间快速映射单个物理页,可在中断上下文中使用,但。
2025-04-10 08:30:00
949
原创 Linux内核——X86分页机制
专用寄存器CR3指向页目录的基地址,页目录条目则指向页表的基地址。内核与进程地址空间的创建及修改均通过通用代码实现,这些代码依赖宏和函数将通用操作适配到不同架构。使用虚拟内存时,由于页表的多级结构,地址转换可能需要额外1次(x86扩展分页)、2次(x86常规分页)或3次(x86 64位)内存访问。启用时采用单级结构,页大小为4MB。x86的分页单元支持两种分页模式:常规分页与扩展分页。页目录和页表均包含1024个条目,每个条目占4字节。所有页表均存储于物理内存中,页表地址均为物理地址。
2025-04-09 22:31:09
1184
原创 【算法实践】跳跃游戏——计算到达终点的最小跳数
给定一个非负数数组,每个元素表示从该位置最多可向前跳跃的步数。:找到从数组第一个位置移动到最后一个位置所需的最小跳跃次数。:若无法到达终点,返回。第一次从第 1 个元素(值 1)跳到第 2 个元素(值 3)。第二次从第 2 个元素跳到第 5 个元素(值 9)。第三次从第 5 个元素跳到终点。第一次从第 1 个元素跳到第 2 个元素,第二次跳到终点。: 无法从第一个位置跳跃。
2025-04-06 18:42:57
888
原创 Linux内核——段描述符详解
在 x86 架构的保护模式下,是分段机制的核心数据结构,定义了内存段的属性(如基地址、界限、权限等)。Linux 通过全局描述符表(GDT)和局部描述符表(LDT)管理这些段描述符。
2025-04-05 19:58:26
1256
原创 Linux内核寻址概述——内存管理单元(MMU)
多任务系统中,每个进程都需要一套内存空间以支撑运行。显然,如果所有任务都直接使用同一套物理内存地址空间(实模式)。协调这些任务并发运行,且要隔离它们的使用内存(将内存分割给这些任务,使得它们不冲突),无论是靠程序员还是操作系统,都是不现实的,也是不安全的。一个程序可以访问其他程序的内存空间。所以,一种方法是:让所有的程序都独享一个地址的空间,这个地址是该程序私有的,其它程序既看不到,也不能访问该地址空间。另外,考虑到程序可移植性,可以再其他计算机上运行,这个地址空间还要和具体的计算机也无关,这个方案就是。
2025-04-04 14:33:36
2015
原创 Linux文件权限:SetUID、SetGID与粘滞位
通常情况下,删除一个目录或者文件的权限是取决于你是否拥有上一级目录的写权限。而不是看要删除文件的写权限。但是,现实中经常有多人共享一个目录的场景,这样,所有人对该目录的权限都是rwx。虽然该目录下的文件,可以控制自有文件宿主可写,别人没有写的权限,但是别人却可以删除我们在该共享目录下新建的文件。因为删除共享目录里的文件,取决于你在目录上是不是有写权限。SetUID、SetGID和粘滞位是Linux权限管理的重要扩展机制,合理使用可提升系统功能与协作效率,但需严格遵循最小权限原则以保障安全。
2025-04-03 21:54:31
631
原创 Linux内核模块编写、加载与运行
与“基础内核”不同。基础内核位于/boot目录,系统启动时自动加载;而LKM在基础内核加载后按需加载。尽管如此,LKM仍是内核的重要组成部分,通过与基础内核通信实现功能。内核模块是按需加载到内核或从内核卸载的代码片段。它们无需重启系统即可扩展内核功能。:LKM属于内核空间,非用户程序,拥有系统完全权限,操作不当易导致系统崩溃。以下是一个简单的LKM示例,加载时打印日志,卸载时显示退出消息。由于这些代码在运行时加载且不属于官方Linux内核,它们被称为。查看打印Hello world。
2025-04-03 21:02:00
717
原创 X86系统寄存器介绍(续)——系统地址寄存器
GDTR提供了GDT的基址,段选择器的偏移部分(3~15位)与GDTR相加,得到段描述符在GDT中的位置。理解这些寄存器对于分析X86架构的内存管理、多任务调度和中断处理机制至关重要。但现代系统通常仅用GDT,不用LDT。基地址+限制(48位)基地址+限制(48位)任务切换和上下文保存。
2025-04-01 22:53:50
670
原创 AT&T汇编基础(六)——伪指令
所有汇编器伪指令的名称均以点号(.)开头。名称的其余部分由字母组成,通常为小写。本章讨论 GNU 汇编器在任意目标机器配置下均可使用的伪指令。某些机器配置提供额外的伪指令,详见《机器相关特性》章节。此伪指令立即停止汇编。它用于与其他汇编器兼容。原始设计是:汇编语言源程序通过管道输入汇编器。若源程序发送方终止,可用此伪指令告知汇编器一同终止。未来可能不再支持 .abort。.ABORT当生成 COFF 输出时,.ABORT 被视为 .abort 的同义词。当生成 b.out 输出时,汇编器接受此伪指令但
2025-03-31 22:31:52
946
原创 【算法实践】搜索算法——寻找缺失的数组元素
最简单的解法是:因为是等差数列,所以可以计算出原来(未缺失)的和是多少,记为sum,然后,用sum减去数组元素之和,即可得出缺失的那一个数大小。但是,要排除未缺失的场景。给定正整数数组,除了缺失的那个数之外(不考虑在首项或末项缺失情况),数组中元素满足等差规律,找出缺失的那个数。如果不存在缺失的数,输出0;:数组元素的公差是5,但是,在21和31之间缺失26.:公差是2,但是在8和10之间缺了一个数6.:无缺失元素,公差为0.
2025-03-30 19:02:25
162
原创 【算法实践】搜索算法——寻找中间数
在给定的数组中找到一个元素,使得它前面的所有元素都小于或等于它,而它后面的所有元素都大于或等于它。如果没有这样的元素,就返回-1。例如: 6: 第四个元素6. 第四个位置之前的元素(arr[0]、arr[1]、arr[2]、arr[3]),都不大于arr[4] ,而第四个位置之后的元素(arr[5]、arr[6]、arr[7]、arr[8])都不小于arr[4]。: -1: 不存在所求元素。
2025-03-30 14:18:06
560
原创 【算法实践】字符串匹配算法(KMP)详解
KMP(Knuth-Morris-Pratt)算法是高效的字符串匹配算法,核心思想是通过预处理模式串避免无效回溯。本文将从原理到实现进行全面解析,并提供Java、C++、Python三种语言代码
2025-03-30 12:33:10
431
原创 【算法实践】回溯算法——老鼠走迷宫问题
老鼠从N×N矩阵的(0,0)出发,到达(N-1,N-1),找到所有可能的路径,本文给出C++、Java、Python解法。
2025-03-30 10:10:31
534
原创 【算法实践】回溯算法——子集求和问题
给定一个非负整数集合S,找出所有元素和等于给定值SUM的子集。文中给出详细分析和三种语言的解法:C++、Java、Python
2025-03-30 08:09:22
651
原创 AT&T汇编基础(五)——调用约定
理解调用约定最直观的方式是绘制子程序执行期间栈的布局。遵循C调用约定,可确保汇编代码与C/C++环境无缝交互,同时为调试与协作开发提供坚实基础。调用者代码(假设调用函数 int add(int a, int b))为促进代码共享与库开发,并简化子程序调用流程,程序员通常遵循统一的。- 保存非易失寄存器(EBX, ESI, EDI)- 保存易失寄存器(EAX, ECX, EDX)- 创建栈帧(保存%ebp)第一个参数(调用者最后压入)第三个参数(调用者最先压入)被调用者代码(函数add)
2025-03-29 21:35:31
860
原创 AT&T汇编基础(四)——程序流转控制
在汇编代码中,可通过标签名:的形式定义标签(如begin:)。1. 压入返回地址(下条指令地址) → 2. 跳转到func。有符号数小于等于时跳转(ZF=1或SF≠OF)jg <标签>;有符号数大于时跳转(ZF=0且SF=OF)jge <标签>;有符号数大于等于时跳转(SF=OF)jl <标签>;jz <标签>;call <标签>;cmp <内存地址>, <寄存器>cmp <寄存器>, <内存地址>cmp <寄存器>, <寄存器>cmp <立即数>, <寄存器>
2025-03-29 21:08:43
290
原创 AT&T汇编基础(三)——算术逻辑运算
idiv指令将64位整数EDX:EAX(高32位在EDX,低32位在EAX)除以操作数,商存入EAX,余数存入EDX。imul <立即数>, <源寄存器>, <目标寄存器>imul <立即数>, <内存地址>, <目标寄存器>and/or/xor <目标寄存器>, <源寄存器>and/or/xor <目标寄存器>, <内存地址>and/or/xor <内存地址>, <源寄存器>and/or/xor <立即数>, <目标寄存器>imul <源寄存器>, <目标寄存器>add <目标寄存器>, <源寄存器>
2025-03-29 20:51:46
390
原创 AT&T汇编基础(一)——寄存器与内存寻址
AT&T汇编是学习Linux内核必备基础知识。Linux内核有大量AT&T汇编代码。系列介绍如何使用标准的AT&T语法编写x86汇编代码。
2025-03-28 21:37:35
1211
原创 X86架构寄存器介绍
x86 寄存器系统通过分工协作实现高效计算与控制:通用寄存器处理数据操作,段寄存器管理内存分区,EFLAGS 跟踪状态,控制寄存器管理 CPU 模式。理解其设计对操作系统开发、逆向工程和性能优化至关重要。在 64 位模式下,寄存器扩展和新增的 R8-R15 进一步提升了复杂应用的效率。
2025-03-26 22:24:37
2016
原创 Linux内核高端内存(High Memory)简介
由于 32 位系统的虚拟地址空间最大为 4GB(默认内核空间占用 1GB,用户空间 3GB),当物理内存超过内核可直接映射的范围(通常是 896MB)时,剩余的内存需要通过特殊机制进行管理,这就是高端内存的由来。在 64 位架构(如 x86_64)中,内核虚拟地址空间极大(如 128TB),可直接线性映射所有物理内存(`phys_base` 偏移),因此不再需要高端内存机制。- 内核默认将虚拟地址空间的 `0xC0000000`(3GB)到 `0xFFFFFFFF`(4GB)划分为内核空间(共 1GB)。
2025-03-23 16:00:26
1109
1
【C++技术面试】C++常见面试问题及解答:涵盖语法、面向对象、内存管理等核心领域知识点汇总了C++面试
2025-04-06
【系统架构设计】架构师面试高频问题汇总:涵盖高并发秒杀系统设计与微服务架构等关键技术点
2025-04-05
Java开发Java面试最常50问:涵盖基础、集合、多线程、JVM、设计模式及框架核心知识点总结内容
2025-04-05
中医医案编码工具,针对患者主诉症状和开方结果,一键生成医案编码
2025-04-04
五子棋及其源代码,支持人机对战,多种难度
2025-03-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人