Linux内核(架构)

文章目录

    • Linux内核架构概述
    • 核心子系统详解
      • 1、进程管理
      • 2、内存管理
      • 3、虚拟文件系统(VFS)
      • 4、设备驱动模型
    • 掌握Linux内核核心技术
      • 阶段1:基础准备
      • 阶段2:内核基础
      • 阶段3:深入子系统
      • 阶段4:高级主题(持续学习)
      • 调试和性能分析工具
      • 学习资源推荐

Linux内核架构概述

Linux内核采用宏内核(Monolithic Kernel)设计,所有核心功能都在内核空间运行。下面是其分层架构的详细图示:

硬件层
内核空间
核心子系统
用户空间
API调用
系统调用
CPU
内存
存储设备
网络设备
系统调用接口
硬件抽象层
进程管理
内存管理
虚拟文件系统 VFS
网络栈
设备驱动
用户应用程序
标准C库 libc

核心子系统详解

1、进程管理

进程管理是Linux内核的核心,负责进程的创建、调度和终止。

关键数据结构:task_struct

// Linux内核中进程描述符(部分代码)
struct task_struct {volatile long state;    // 进程状态void *stack;            // 进程内核栈unsigned int flags;     // 进程标志// 进程标识pid_t pid;              // 进程IDpid_t tgid;             // 线程组ID// 进程关系struct task_struct __rcu *parent; // 父进程struct list_head children;        // 子进程列表struct list_head sibling;         // 兄弟进程// 内存管理struct mm_struct *mm;   // 内存描述符// 调度相关int prio;               // 动态优先级int static_prio;        // 静态优先级struct sched_entity se; // 调度实体// 文件系统struct fs_struct *fs;   // 文件系统信息struct files_struct *files; // 打开文件表
};

进程创建:fork()系统调用实现

// 简化的fork实现原理
static __latent_entropy struct task_struct *copy_process(struct pid *pid,int trace,int node,struct kernel_clone_args *args)
{int retval;struct task_struct *p;// 分配任务结构体p = dup_task_struct(current, node);if (!p)goto fork_out;// 复制进程凭证retval = copy_creds(p, args);if (retval < 0)goto bad_fork_free;// 初始化调度相关数据retval = sched_fork(clone_flags, p);if (retval)goto bad_fork_cancel_cgroup;// 复制文件系统信息retval = copy_files(clone_flags, p);if (retval)goto bad_fork_cancel_cgroup;// 复制内存空间retval = copy_mm(clone_flags, p);if (retval)goto bad_fork_cleanup_files;return p;bad_fork_cleanup_files:exit_files(p);
bad_fork_cancel_cgroup:// 清理代码...
fork_out:return ERR_PTR(retval);
}

2、内存管理

Linux内存管理采用虚拟内存系统,为每个进程提供独立的地址空间。

页表管理

// 页表操作示例
// 将虚拟地址映射到物理地址
int handle_mm_fault(struct vm_area_struct *vma, unsigned long address,unsigned int flags)
{// 获取页全局目录项pgd_t *pgd;p4d_t *p4d;pud_t *pud;pmd_t *pmd;pte_t *pte;pgd = pgd_offset(vma->vm_mm, address);if (pgd_none(*pgd) || pgd_bad(*pgd))return pgd_bad_fault(vma, address, flags);p4d = p4d_offset(pgd, address);if (p4d_none(*p4d) || p4d_bad(*p4d))return p4d_bad_fault(vma, address, flags);pud = pud_offset(p4d, address);if (pud_none(*pud) || pud_bad(*pud))return pud_bad_fault(vma, address, flags);pmd = pmd_offset(pud, address);if (pmd_none(*pmd) || pmd_bad(*pmd))return pmd_bad_fault(vma, address, flags);// 处理页错误return handle_pte_fault(vma, address, pmd, pte, flags);
}

Slab分配器示例

// 内核对象缓存分配
struct kmem_cache *task_struct_cache;// 创建task_struct缓存
void __init fork_init(void)
{task_struct_cache = kmem_cache_create("task_struct",arch_task_struct_size, arch_task_struct_align,SLAB_PANIC|SLAB_ACCOUNT, NULL);
}// 从缓存分配task_struct
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
{struct task_struct *tsk;// 从slab缓存分配内存tsk = kmem_cache_alloc_node(task_struct_cache, GFP_KERNEL, node);if (!tsk)return NULL;// 复制父进程内容memcpy(tsk, orig, arch_task_struct_size);return tsk;
}

3、虚拟文件系统(VFS)

VFS提供统一的文件系统接口,抽象不同文件系统的实现细节。

VFS核心数据结构

// 文件系统类型注册
struct file_system_type ext4_fs_type = {.owner      = THIS_MODULE,.name       = "ext4",.mount      = ext4_mount,.kill_sb    = kill_block_super,.fs_flags   = FS_REQUIRES_DEV,
};// 文件操作函数表
const struct file_operations ext4_file_operations = {.llseek     = ext4_llseek,.read_iter  = ext4_file_read_iter,.write_iter = ext4_file_write_iter,.unlocked_ioctl = ext4_ioctl,.mmap       = ext4_file_mmap,.open       = ext4_file_open,.release    = ext4_release_file,.fsync      = ext4_sync_file,.splice_read    = generic_file_splice_read,.splice_write   = iter_file_splice_write,.fallocate  = ext4_fallocate,
};

4、设备驱动模型

Linux设备驱动采用统一的设备模型,支持热插拔和电源管理。

字符设备驱动示例

// 简单的字符设备驱动
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>#define DEVICE_NAME "my_device"static int major_number;
static struct cdev my_cdev;static int device_open(struct inode *inode, struct file *file)
{printk(KERN_INFO "Device opened\n");return 0;
}static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset)
{const char *message = "Hello from kernel!\n";size_t message_len = strlen(message);if (*offset >= message_len)return 0;if (length > message_len - *offset)length = message_len - *offset;if (copy_to_user(buffer, message + *offset, length))return -EFAULT;*offset += length;return length;
}static const struct file_operations fops = {.owner = THIS_MODULE,.open = device_open,.read = device_read,
};static int __init my_init(void)
{// 分配设备号if (alloc_chrdev_region(&major_number, 0, 1, DEVICE_NAME) < 0) {printk(KERN_ALERT "Failed to allocate device number\n");return -1;}// 初始化cdev结构cdev_init(&my_cdev, &fops);my_cdev.owner = THIS_MODULE;// 添加cdev到系统if (cdev_add(&my_cdev, major_number, 1) < 0) {unregister_chrdev_region(major_number, 1);printk(KERN_ALERT "Failed to add cdev\n");return -1;}printk(KERN_INFO "Device registered with major number %d\n", major_number);return 0;
}static void __exit my_exit(void)
{cdev_del(&my_cdev);unregister_chrdev_region(major_number, 1);printk(KERN_INFO "Device unregistered\n");
}module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

掌握Linux内核核心技术

阶段1:基础准备

1、C语言精通:深入理解指针、内存管理、结构体、函数指针
2、计算机体系结构:CPU架构、内存层次、中断机制、DMA
3、操作系统原理:进程管理、虚拟内存、文件系统、设备驱动

阶段2:内核基础

1、编译和构建内核

# 下载内核源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git# 配置内核
make menuconfig# 编译内核
make -j$(nproc)# 安装模块
sudo make modules_install# 安装内核
sudo make install

2、内核模块编程

// 最简单的内核模块
#include <linux/init.h>
#include <linux/module.h>static int __init hello_init(void)
{printk(KERN_INFO "Hello, Linux Kernel!\n");return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "Goodbye, Linux Kernel!\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux driver");

阶段3:深入子系统

1、进程调度:研究CFS调度器、实时调度类
2、内存管理:理解伙伴系统、slab分配器、页缓存
3、文件系统:分析VFS架构、具体文件系统实现
4、网络栈:学习sk_buff结构、协议处理流程

阶段4:高级主题(持续学习)

1、并发和同步:自旋锁、信号量、RCU机制

// RCU使用示例
struct my_data {int value;struct rcu_head rcu;
};void my_data_update(struct my_data *new_data)
{struct my_data *old_data = rcu_dereference(global_data);rcu_assign_pointer(global_data, new_data);synchronize_rcu();  // 等待所有读者完成kfree(old_data);
}

2、性能优化: profiling、tracepoint、perf工具使用
3、安全机制:SELinux、AppArmor、内核加固

调试和性能分析工具

1、调试工具:GDB、KGDB、printk、ftrace
2、性能分析:perf、systemtap、eBPF
3、内存调试:KASAN、kmemleak、slub_debug

学习资源推荐

1、官方文档:kernel.org/documentation
2、经典书籍:

  • 《Linux内核设计与实现》
  • 《深入理解Linux内核》
  • 《Linux设备驱动程序》

3、在线课程:Linux基金会内核开发课程
4、社区参与:LKML、内核新手邮件列表

掌握Linux内核需要系统性的学习和大量实践。建议从简单的模块开始,逐步深入到具体的子系统,通过阅读代码、编写实验和参与社区来不断提升理解深度。记住,内核学习是一个长期的过程,需要耐心和持续的实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922225.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于数据挖掘的单纯冠心病与冠心病合并糖尿病的证治规律对比研究

标题:基于数据挖掘的单纯冠心病与冠心病合并糖尿病的证治规律对比研究内容:1.摘要 背景&#xff1a;冠心病和冠心病合并糖尿病在临床上较为常见&#xff0c;且二者在证治方面可能存在差异&#xff0c;但目前相关系统研究较少。目的&#xff1a;对比基于数据挖掘的单纯冠心病与冠…

即梦AI快速P图

原图&#xff1a; 模型选择3.0效果比较好&#xff0c;提示词“根据提供图片&#xff0c;要求把两边脸变小&#xff0c;要求把脸变尖&#xff0c;要求眼妆变淡&#xff0c;眼睛更有神&#xff0c;要求提亮面部肤色要求面部均匀&#xff0c;面部要磨皮!鼻头高光和鼻翼两边阴影变淡…

【办公类-109-04】20250913圆牌卡片(接送卡被子卡床卡入园卡_word编辑单面)

背景需求: 为了发被子,我做了全校批量的圆形挂牌,可以绑在“被子包”提手上,便于再操场上发放被子时,很多老师可以协助根据学号发放。 https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/arti…

Shoptnt 促销计算引擎详解:策略模式与责任链的完美融合

在电商系统中&#xff0c;促销计算是业务逻辑最复杂、变更最频繁的模块之一。它不仅需要处理多种促销类型&#xff08;满减、折扣、优惠券等&#xff09;&#xff0c;还要管理它们之间的优先级和互斥关系。 Shoptnt 设计了一套基于 策略模式 (Strategy Pattern) 和 责任链模式…

【HTTP 请求格式】从请求行 到 请求体

引言 在前后端开发中&#xff0c;前端和后端之间的交互主要依赖于 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;。HTTP 是互联网通信的基础&#xff0c;它定义了客户端&#xff08;通常是浏览器或App&#xff09;和服务器之间如何交换数…

【自记】SQL 中 GROUPING 和 GROUPING SETS 语句的案例说明

我们用一个生活中的例子来理解&#xff0c;比如你开了家小超市&#xff0c;想统计「销售额」&#xff0c;但需要从多个角度看&#xff08;比如按 “日期 商品”、“仅日期”、“仅商品”、“整体总销售额”&#xff09;。假设你的销售数据长这样&#xff08;简化版&#xff09…

C语言第五课:if、else 、if else if else 控制语句

C语言第五课&#xff1a;if、else 、if else if else 控制语句if else 、if else if else 联合使用编程快速学习平台if else 、if else if else 联合使用 代码示列 #include <stdio.h> int main(){//设置中文编码输出到控制台system("chcp 65001");//今天星…

七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线

“当银发潮遇见科技力&#xff0c;养老方式正在发生一场静悄悄的变革。”你有没有想过&#xff1a;当父母年迈独居时&#xff0c;如何确保他们的安全&#xff1f;当老人突然摔倒&#xff0c;如何第一时间获得救助&#xff1f;当慢性病需要长期管理&#xff0c;如何避免频繁奔波…

window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)

显示相关的 API 的比较 API用途和目标受众DisplayInformation用于检索 CoreWindow 的呈现和布局属性。HdmiDisplayInformation用于枚举和设置受限模式集的仅限 Xbox 的 API。 高度专用于 Xbox 媒体应用方案。DisplayMonitor用于查询物理监视器设备的属性。 不公开有关操作系统…

Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`

epoll 是 Linux 上处理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 则是你用来指挥 epoll 实例&#xff08;epoll instance&#xff09;的“遥控器”&#xff0c;负责向它添加、修改或删除需要监视的文件描述符&#xff08;FD&#xff09;及其感兴趣的事件。1.…

mysql 必须在逗号分隔字符串和JSON字段之间二选一,怎么选

如果必须在逗号分隔字符串和JSON字段之间二选一&#xff0c;那么 JSON字段是明显更好的选择。以下是详细的对比分析&#xff1a;对比结论&#xff08;直接看这里&#xff09;方面JSON字段逗号分隔字符串胜出方查询能力✅ 丰富的JSON函数支持❌ 只能使用LIKE模糊查询JSON数据验证…

DPI和DIP的区别

DPI 和 DIP 是两个在计算机图形和移动开发领域常见的术语&#xff0c;它们都与屏幕显示和尺寸有关&#xff0c;但含义和用途不同。 DPI (Dots Per Inch) 定义&#xff1a;DPI 的全称是 Dots Per Inch&#xff0c;即每英寸点数。它是一个衡量物理密度的单位&#xff0c;表示在…

数据帮助我们理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方财富基金首席执行官尼古拉安根。今天非常荣幸能与大卫斯皮格尔哈尔特爵士对话。坦率地说&#xff0c;他不仅是世界上最优秀的统计学家之一&#xff0c;也是我见过的最佳风险沟通者。他撰写了大量优秀著作&#xf…

在使用git的很多操作是保持工作区干净

这是一条铁律下面是错误操作&#xff1a;自己明明写完了代码&#xff0c;想要提交。此时你的工作区长这样你的提交顺序是&#xff1a;git pull -> git commit -> git push但是现实往往不这样&#xff0c;万一拉下来的代码和你当前工作区的代码有冲突&#xff0c;你必须要…

通过语法推导树快速求短语,简单短语和句柄

第一步&#xff1a;写出规范推导&#xff08;最右&#xff09;序列 规范推导就是最右推导。我们的目标是从起始符号 E 出发&#xff0c;通过每步替换最右边的非终结符&#xff0c;最终得到句型 R(Pi)。 文法 G[E]: E :: RP | PP :: (E) | iR :: RP | RP* | P | P* 推导过程&…

智能学习辅助系统-部门管理开发

文章目录准备工作工程搭建增删改查查询部门删除部门新增部门修改部门查询回显修改数据日志技术准备工作 需求&#xff1a;部门管理的查询、新增、修改、删除 使用REST风格的URL&#xff1a; GET &#xff1a; 查询POST &#xff1a;新增PUT &#xff1a; 修改DELETE &#x…

【图解】idea中快速查找maven冲突

现象 今天启动项目时&#xff0c;总是以下报错&#xff0c;并退出SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar!/org/slf4j/im…

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标函数&#xff08;缩放误差&#xff09;数学原理损失函数定义梯度计算评估指标LightGBM实现自定义损失函数自定义评估指标使用方式XGBoost实现自定义损失函数自定义评估指标使用方式CatBoost实现自定义损失函数自定义评估指…

2025-09-08升级问题记录: 升级SDK从Android11到Android12

将 Android 工程的 targetSdkVersion 从 30 &#xff08;Android 11&#xff09;升级到 31&#xff08;Android 12&#xff09;需要关注一些重要的行为变更和适配点。 主要适配要点&#xff1a; 适配类别关键变更点适配紧迫性简要说明组件导出属性声明了 Intent Filter 的组件…

利用OpenCV实现模板与多个对象匹配

代码实现&#xff1a;import cv2 import numpy as npimg_rgb cv2.imread(mobanpipei.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(jianto.jpg, flags0) h, w template.shape[:2]# 读取图像# # 顺时针旋转 90 度&#xff08;k1&#xff0…