自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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内核开发模型

Linux 内核是全球最大的开源项目之一,拥有数千名开发者,每个版本涉及数百万行代码变更。

2025-04-15 08:00:00 1157

原创 典型操作系统内核架构

在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。

2025-04-14 22:52:20 730

原创 【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

原创 【算法实践】算法面试常见问题——数组的波浪排序

给定一个无序整数数组,将其排列成波浪形数组。

2025-04-05 19:40:35 563

原创 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数据传送指令和实例

2025-03-28 21:45:38 405

原创 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++面试

内容概要:本文档汇总了C++面试中常见的问题及其详细解答,涵盖基础语法、面向对象编程、内存管理、STL与模板、现代C++特性、多线程与并发、设计模式以及调试与优化等多个核心领域。文档针对每个问题提供了简明的答案和深入的解析,帮助读者全面理解和掌握C++的关键知识点。例如,解释了指针与引用的区别、虚函数的实现原理、智能指针的使用场景、STL容器的特点、右值引用与移动语义的应用等。此外,还提供了部分高频代码题的实现示例,如反转链表和智能指针的实现。 适合人群:具备一定编程基础,特别是正在准备C++技术面试的研发人员。 使用场景及目标:①帮助求职者系统复习C++基础知识,增强面试信心;②为开发者提供参考,加深对C++语言特性和最佳实践的理解;③通过实际代码题的练习,提高编程能力和解决问题的技巧。 阅读建议:建议读者结合自身项目经验,逐步深入理解每个知识点,并通过实践来巩固所学内容。同时,推荐配合在线编程平台(如LeetCode)进行算法训练,以全面提升技术水平。

2025-04-06

【系统架构设计】架构师面试高频问题汇总:涵盖高并发秒杀系统设计与微服务架构等关键技术点

内容概要:本文围绕架构师面试高频问题展开,涵盖系统架构设计、数据库与存储、分布式系统、性能优化、安全与合规、运维与监控、综合场景以及开放性问题八大板块。针对高并发秒杀系统的分层削峰、微服务架构的优劣、服务间数据一致性的实现、API网关设计、Serverless架构特点、分库分表策略、数据库选型与优化、缓存策略、CAP理论取舍、分布式锁与ID生成、消息队列可靠性保障、服务发现与负载均衡、CPU飙高排查、JVM内存泄漏、GC优化、数据库连接池优化、限流策略、SQL注入防范、API鉴权、GDPR合规、DDoS防御、HTTPS优化、CI/CD流水线设计、日志收集、监控指标、灰度发布、容器化部署、物联网数据平台、实时数据分析、短链生成、跨数据中心同步、实时聊天系统设计等具体问题进行详细解答。; 适合人群:有志于成为架构师或从事相关工作的中高级开发人员,以及参与系统设计和技术决策的工程师。; 使用场景及目标:①为架构师面试做准备,掌握系统设计、数据库优化、分布式系统、性能调优、安全防护等方面的知识;②指导实际项目中的架构设计和技术选型,提高系统的稳定性和性能。; 其他说明:本文不仅提供了理论知识,还结合了大量实际案例和实践经验,帮助读者深入理解架构设计中的关键技术和应对策略。建议读者在学习过程中结合自身项目背景进行思考和实践,以更好地掌握这些知识点。

2025-04-05

Java开发Java面试最常50问:涵盖基础、集合、多线程、JVM、设计模式及框架核心知识点总结内容

内容概要:本文档汇总了Java面试中最常见的50个问题及其详细解答,涵盖了Java基础、集合框架、多线程与并发、JVM、设计模式、Java新特性、框架相关(Spring)、数据库与ORM、系统设计以及综合问题等多个方面。每个问题都提供了简洁明了的答案,帮助读者快速掌握关键知识点。例如,在Java基础部分介绍了基本数据类型、String类的特点等;在集合框架部分解析了ArrayList与LinkedList的区别;在多线程与并发部分探讨了线程创建方式和synchronized与Lock的区别;在JVM部分讲解了内存模型和垃圾回收算法;在设计模式部分阐述了单例模式、工厂模式等经典模式的应用;在框架相关部分分析了Spring的核心概念;在数据库与ORM部分讨论了事务ACID特性及MyBatis的使用;在系统设计部分探讨了分布式ID生成器的设计方案;最后在综合问题部分涉及反射、内存泄漏排查、异常体系、分布式锁实现及性能优化等内容。; 适合人群:正在准备Java面试的求职者,尤其是希望全面复习Java核心技术点和技术栈的开发人员。; 使用场景及目标:①帮助面试者快速梳理Java各个领域的核心知识点;②为实际项目开发中遇到的问题提供理论依据和技术指导;③加深对Java语言特性和框架的理解,提升解决问题的能力。; 阅读建议:此文档内容丰富,覆盖面广,建议读者根据自身情况重点复习薄弱环节,并结合实际案例进行理解和记忆。对于每个知识点,不仅要记住答案,还要深入思考其背后的原理和应用场景,以便在面试中能够灵活应对。

2025-04-05

中医医案编码工具,针对患者主诉症状和开方结果,一键生成医案编码

作为医案标注工具,涵盖望闻问切,常见经方,一键生成数字编码,也可定制输出其他格式编码。作为AI、机器学习的样本输入。 HTML+JavaScript版本,跨端支持,方便打开使用

2025-04-04

五子棋及其源代码,支持人机对战,多种难度

【特性】 1. 支持人机对弈 2.电脑支持三种难度选择 3.支持悔棋 4.自动判断胜负 【软件包所含内容】 1.Java源码 2.编译文件(class)和打包后的jar(可直接运行)

2025-03-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除