
Linux内核
文章平均质量分 79
Linux内核
灿烂的贝壳
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux如何区分普通进程和实时进程
特点:使用 **完全公平调度器(CFS)** 分配 CPU 时间,优先级由 `nice` 值(范围 `-20` 到 `19`)动态调整。设置实时进程需 `CAP_SYS_NICE` 能力(通常需 `root` 权限),避免低权限用户创建实时进程导致系统不稳定。- 特点:优先级固定(**实时优先级**),范围 `1`(最低)到 `99`(最高),**始终优先于普通进程**。实时优先级固定为 **`0`**(通过系统调用或工具查看时显示为 `0` 或 `-`)。- `-` 或 `0` → 普通进程。原创 2025-06-02 08:45:36 · 1021 阅读 · 0 评论 -
Linux中断分类、中断描述符分类及关系
中断(异步,由硬件随机产生可屏蔽中断(I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断)N/A中断门不可屏蔽中断NMI(只有几个特定的危急事件才引起非屏蔽中断)N/A中断门异常(同步的,在特殊的或出错的指令执行时由CPU控制单元产生处理器探测异常(由CPU执行指令时探测到一个反常条件时产生,溢出、除0)故障Fault(内核栈eip=引起故障的指令的地址,可纠正,处理完可继续执行,如缺页异常)陷阱或中断门(根据是否需要屏蔽中断)原创 2025-05-18 10:31:33 · 585 阅读 · 0 评论 -
Linux内核页表的建立
但内核实际加载的物理起始地址是内存的第一个兆字节(0x00100000)。若支持PSE位,则设置该位以使用4MiB的TLB条目(而非4KiB)。因此,在启用分页单元之前,必须建立一个页表映射,将8MiB的物理内存转换为虚拟地址。寄存器的对应位启用分页单元,并立即执行跳转指令以确保指令指针(EIP寄存器)的正确性。,则会设置该位,使得被转换的页为4MiB大页(而非常规的4KiB页)。,则也会设置该标志,使页表项成为全局项并对所有进程可见。返回后,内核空间的页表已完全初始化,此时静态页全局目录(原创 2025-04-19 10:24:13 · 493 阅读 · 0 评论 -
Linux内核开发模型
Linux 内核是全球最大的开源项目之一,拥有数千名开发者,每个版本涉及数百万行代码变更。原创 2025-04-15 08:00:00 · 1139 阅读 · 0 评论 -
典型操作系统内核架构
在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。原创 2025-04-14 22:52:20 · 696 阅读 · 0 评论 -
【Linux内核】AT&T汇编编程练习
编写AT&T汇编程序,接收正整数输入n,计算1到n的和,并打印在屏幕上。LInux下,先安装GCC,编写r如下代码,命名为sum.s。原创 2025-04-12 19:47:27 · 182 阅读 · 0 评论 -
【Linux内核】页表的申请、释放与使用
页表是包含条目数组的物理页,而物理页的分配与释放是一项相对高资源消费的操作,这不仅体现在时间开销上,还因为页面分配期间需禁用中断。无论针对页表的哪一级别(PGD、PMD或PTE),分配与删除操作均极为频繁,因此确保其高效性至关重要。为此,用于页表的物理页被缓存在多个称为的链表中。各架构对此缓存的实现方式虽不同,但核心原理一致。例如,并非所有架构均缓存PGD页表,因为其分配与释放仅发生在进程创建与退出时。而由于进程创建与退出本身已是高开销操作,额外分配一个物理页的开销相对可忽略。原创 2025-04-12 10:26:28 · 1381 阅读 · 0 评论 -
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 · 838 阅读 · 0 评论 -
Linux内核——虚拟地址映射方式
固定映射线性地址是一类特殊的单页映射,用于访问常用外设(如APIC、IO APIC)的寄存器。(与低内存区域的线性映射相对)。而在64位系统中,高端内存主要用于实现内核空间的任意映射。指将连续的虚拟页(V, V+1, ..., V+n)映射到连续的物理页(P, P+1, ..., P+n)的特殊映射方式。多页映射允许将连续的物理内存范围映射到高端内存区域。永久映射允许长期持有映射(时间未定义),支持在映射后发生上下文切换再释放。临时映射用于在内核空间快速映射单个物理页,可在中断上下文中使用,但。原创 2025-04-10 08:30:00 · 880 阅读 · 0 评论 -
Linux内核——X86分页机制
专用寄存器CR3指向页目录的基地址,页目录条目则指向页表的基地址。内核与进程地址空间的创建及修改均通过通用代码实现,这些代码依赖宏和函数将通用操作适配到不同架构。使用虚拟内存时,由于页表的多级结构,地址转换可能需要额外1次(x86扩展分页)、2次(x86常规分页)或3次(x86 64位)内存访问。启用时采用单级结构,页大小为4MB。x86的分页单元支持两种分页模式:常规分页与扩展分页。页目录和页表均包含1024个条目,每个条目占4字节。所有页表均存储于物理内存中,页表地址均为物理地址。原创 2025-04-09 22:31:09 · 1143 阅读 · 0 评论 -
Linux内核——段描述符详解
在 x86 架构的保护模式下,是分段机制的核心数据结构,定义了内存段的属性(如基地址、界限、权限等)。Linux 通过全局描述符表(GDT)和局部描述符表(LDT)管理这些段描述符。原创 2025-04-05 19:58:26 · 1171 阅读 · 0 评论 -
Linux内核寻址概述——内存管理单元(MMU)
多任务系统中,每个进程都需要一套内存空间以支撑运行。显然,如果所有任务都直接使用同一套物理内存地址空间(实模式)。协调这些任务并发运行,且要隔离它们的使用内存(将内存分割给这些任务,使得它们不冲突),无论是靠程序员还是操作系统,都是不现实的,也是不安全的。一个程序可以访问其他程序的内存空间。所以,一种方法是:让所有的程序都独享一个地址的空间,这个地址是该程序私有的,其它程序既看不到,也不能访问该地址空间。另外,考虑到程序可移植性,可以再其他计算机上运行,这个地址空间还要和具体的计算机也无关,这个方案就是。原创 2025-04-04 14:33:36 · 1228 阅读 · 0 评论 -
Linux内核模块编写、加载与运行
与“基础内核”不同。基础内核位于/boot目录,系统启动时自动加载;而LKM在基础内核加载后按需加载。尽管如此,LKM仍是内核的重要组成部分,通过与基础内核通信实现功能。内核模块是按需加载到内核或从内核卸载的代码片段。它们无需重启系统即可扩展内核功能。:LKM属于内核空间,非用户程序,拥有系统完全权限,操作不当易导致系统崩溃。以下是一个简单的LKM示例,加载时打印日志,卸载时显示退出消息。由于这些代码在运行时加载且不属于官方Linux内核,它们被称为。查看打印Hello world。原创 2025-04-03 21:02:00 · 671 阅读 · 0 评论 -
X86系统寄存器介绍(续)——系统地址寄存器
GDTR提供了GDT的基址,段选择器的偏移部分(3~15位)与GDTR相加,得到段描述符在GDT中的位置。理解这些寄存器对于分析X86架构的内存管理、多任务调度和中断处理机制至关重要。但现代系统通常仅用GDT,不用LDT。基地址+限制(48位)基地址+限制(48位)任务切换和上下文保存。原创 2025-04-01 22:53:50 · 614 阅读 · 0 评论 -
AT&T汇编基础(六)——伪指令
所有汇编器伪指令的名称均以点号(.)开头。名称的其余部分由字母组成,通常为小写。本章讨论 GNU 汇编器在任意目标机器配置下均可使用的伪指令。某些机器配置提供额外的伪指令,详见《机器相关特性》章节。此伪指令立即停止汇编。它用于与其他汇编器兼容。原始设计是:汇编语言源程序通过管道输入汇编器。若源程序发送方终止,可用此伪指令告知汇编器一同终止。未来可能不再支持 .abort。.ABORT当生成 COFF 输出时,.ABORT 被视为 .abort 的同义词。当生成 b.out 输出时,汇编器接受此伪指令但原创 2025-03-31 22:31:52 · 883 阅读 · 0 评论 -
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 · 782 阅读 · 0 评论 -
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 · 272 阅读 · 0 评论 -
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 · 376 阅读 · 0 评论 -
AT&T汇编基础(二)——数据传送指令
本文介绍了AT&T数据传送指令和实例原创 2025-03-28 21:45:38 · 390 阅读 · 0 评论 -
AT&T汇编基础(一)——寄存器与内存寻址
AT&T汇编是学习Linux内核必备基础知识。Linux内核有大量AT&T汇编代码。系列介绍如何使用标准的AT&T语法编写x86汇编代码。原创 2025-03-28 21:37:35 · 1186 阅读 · 0 评论