news 2026/3/3 21:43:18

内核子系统、SoC控制器驱动、驱动与内核的关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内核子系统、SoC控制器驱动、驱动与内核的关系

这是一个关于Linux内核架构的核心问题,涉及内核子系统、SoC控制器驱动、驱动与内核的关系。让我用清晰的层次结构为您解释:


一、整体架构关系图

┌─────────────────────────────────────────────────────────┐ │ 用户空间 (User Space) │ │ 应用程序、库函数、Shell │ └──────────────────────┬──────────────────────────────────┘ │ 系统调用 (System Call) ┌──────────────────────▼──────────────────────────────────┐ │ 内核空间 (Kernel Space) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Linux内核子系统 (核心层) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 进程调度 │ │ 内存管理 │ │ 虚拟文件 │ │ 网络协议 │ │ │ │ │ │ (Scheduler)│ (MM) │ │ 系统(VFS)│ │ 栈(Net) │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 设备模型 │ │ 电源管理 │ │ 中断管理 │ │ 时钟管理 │ │ │ │ │ │(Device) │ │ (PM) │ │ (IRQ) │ │ (Clock) │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ DMA引擎 │ │ 调试系统 │ │ 安全模块 │ │ 其他... │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ └────────────────────────┬────────────────────────────┘ │ │ │ 提供API接口 │ │ ┌────────────────────────▼────────────────────────────┐ │ │ │ 内核驱动层 (Driver Layer) │ │ │ │ ┌───────────────────────────────────────────────┐ │ │ │ │ │ SoC控制器驱动 (Controller Driver) │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ │ │GPIO控制器│ │I2C控制器│ │SPI控制器│ │DMA控制器│ │ │ │ │ │ │ │ (pinctrl)│ │ (i2c) │ │ (spi) │ │ (dma) │ │ │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ │ │时钟控制器│ │中断控制器│ │PWM控制器│ │USB控制器│ │ │ │ │ │ │ │ (CCU) │ │ (GIC) │ │ (pwm) │ │ (usb) │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ │ └───────────────────┬─────────────────────────────┘ │ │ │ │ │ 注册到内核子系统 │ │ │ ┌───────────────────▼─────────────────────────────┐ │ │ │ │ │ 设备驱动 (Device Driver) │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ │ │LCD驱动 │ │触摸驱动 │ │网卡驱动 │ │eMMC驱动│ │ │ │ │ │ │ │(drm) │ │(input) │ │(netdev) │ │(mmc) │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────┘ │ └──────────────────────────┬────────────────────────────────┘ │ 硬件抽象层 (寄存器操作) ┌──────────────────────────▼────────────────────────────────┐ │ 硬件层 (Hardware) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ GPIO引脚 │ │ I2C总线 │ │ SPI总线 │ │ 物理内存 │ │ │ │ 寄存器 │ │ 控制器 │ │ 控制器 │ │ 控制器 │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └───────────────────────────────────────────────────────────┘

二、核心问题解答

2.1 内核子系统在内核中吗?

是的,内核子系统是内核的核心组成部分

子系统源码位置作用
进程调度kernel/sched/管理CPU时间片分配
内存管理mm/虚拟内存、页表、SLAB分配器
VFSfs/文件系统抽象层
网络协议栈net/TCP/IP协议实现
设备模型drivers/base/总线、设备、驱动的统一管理
中断管理kernel/irq/中断注册、分发、处理
时钟管理kernel/time/tick、定时器、时间戳
电源管理kernel/power/休眠、唤醒、DVFS

关键理解:这些子系统编译后就是vmlinuz内核镜像的一部分,随系统启动加载到内存运行。

2.2 SoC控制器驱动在内核中吗?

是的,但属于"驱动层"而非"核心子系统"

层次区分

内核源码树 ├── kernel/ ← 核心子系统(进程、内存、中断等) ├── mm/ ← 内存管理子系统 ├── fs/ ← 文件系统子系统 ├── net/ ← 网络子系统 ├── drivers/ ← 【驱动层】 │ ├── clk/ ← SoC时钟控制器驱动 (CCU) │ ├── gpio/ ← GPIO控制器驱动 │ ├── i2c/busses/ ← I2C控制器驱动 │ ├── spi/ ← SPI控制器驱动 │ ├── irqchip/ ← 中断控制器驱动 (GIC) │ ├── dma/ ← DMA引擎驱动 │ └── ... ← 其他SoC IP驱动 └── arch/arm/mach-sunxi/ ← SoC架构相关代码 (T113-I)

关键区别

  • 核心子系统:管理全局资源,提供通用API,与硬件无关
  • SoC控制器驱动:操作具体硬件寄存器,但通过标准接口注册到子系统

2.3 驱动是调用内核子系统的API控制硬件吗?

关系正好相反,是双向的

方向调用关系示例
驱动 → 子系统驱动注册到子系统,使用子系统提供的工具APIregister_chrdev()向VFS注册字符设备
子系统 → 驱动子系统通过统一接口回调驱动实现的硬件操作VFS调用file_operations中的my_read()
驱动 ↔ 硬件驱动直接读写寄存器控制硬件writel(val, reg_base + OFFSET)

完整调用链示例(T113-I LCD显示)

用户程序 │ ▼ open("/dev/dri/card0") ┌─────────────────────────────────────┐ │ VFS子系统 (fs/) │ │ sys_open() → 查找inode → 找到file_ops │ └─────────────┬───────────────────────┘ │ 调用 f_op->open ┌─────────────▼───────────────────────┐ │ DRM子系统 (drivers/gpu/drm/) │ │ drm_open() → 找到drm_driver │ └─────────────┬───────────────────────┘ │ 调用 driver->open ┌─────────────▼───────────────────────┐ │ sun4i_drm驱动 (drivers/gpu/drm/sun4i/)│ │ sun4i_drm_open() │ │ ├──► 调用 **时钟子系统API** │ │ │ clk_prepare_enable() │ │ │ (请求使能DE2时钟) │ │ │ │ │ ├──► 调用 **复位子系统API** │ │ │ reset_control_deassert() │ │ │ (释放DE2复位) │ │ │ │ │ └──► 直接写 **硬件寄存器** │ │ writel(VAL, de2_regs + CTL) │ │ (配置DE2寄存器) │ └─────────────────────────────────────┘

三、关键机制详解

3.1 驱动如何"接入"子系统?

以字符设备为例

// 1. 驱动实现硬件操作函数staticstructfile_operationsmy_fops={.owner=THIS_MODULE,.read=my_hardware_read,// 实际读硬件的函数.write=my_hardware_write,};// 2. 驱动注册到VFS子系统staticint__initmy_init(void){alloc_chrdev_region(&dev_num,0,1,"mydev");// 向VFS申请设备号cdev_init(&my_cdev,&my_fops);// 绑定操作函数cdev_add(&my_cdev,dev_num,1);// 正式注册到VFS}// 3. 用户调用时,VFS回调驱动函数// 用户: read(fd, buf, len)// → VFS: sys_read()// → 找到my_fops.read// → 调用my_hardware_read() (操作硬件寄存器)

3.2 SoC控制器驱动的特殊地位

SoC控制器驱动是**“驱动的驱动”**(中间层):

┌─────────────────────────────────────────┐ │ 具体设备驱动 (Device Driver) │ │ LCD驱动、网卡驱动、声卡驱动等 │ │ 调用通用API,不感知硬件差异 │ └─────────────────┬───────────────────────┘ │ i2c_transfer() / spi_write() │ dmaengine_submit() / clk_set_rate() ┌─────────────────▼───────────────────────┐ │ SoC控制器驱动 (Controller Driver) │ │ I2C控制器、SPI控制器、DMA控制器、CCU等 │ │ 将通用API转换为具体寄存器操作 │ └─────────────────┬───────────────────────┘ │ 读写寄存器 ┌─────────────────▼───────────────────────┐ │ 硬件寄存器 │ └─────────────────────────────────────────┘

T113-I时钟控制器(CCU)示例

// drivers/clk/sunxi/clk-sun8iw20.c (T113-I CCU驱动)// 1. 实现时钟操作(硬件相关)staticintsunxi_ccu_enable(structclk_hw*hw){structsunxi_ccu_clk*clk=to_sunxi_ccu_clk(hw);void__iomem*reg=clk->base+clk->enable_reg;// 直接写寄存器使能时钟writel(readl(reg)|BIT(clk->enable_bit),reg);return0;}// 2. 注册到时钟子系统(通用框架)staticconststructclk_opssunxi_ccu_ops={.enable=sunxi_ccu_enable,.disable=sunxi_ccu_disable,.recalc_rate=sunxi_ccu_recalc_rate,};// 3. 设备树解析后,时钟子系统统一管理// 其他驱动通过通用API使用:// clk_prepare_enable(de2_clk); // 调用到底层的sunxi_ccu_enable

四、总结:三层模型

层级位置职责代码示例
内核子系统kernel/mm/fs/资源管理、抽象接口、调度策略VFS、调度器、内存分配器
SoC控制器驱动drivers/clk/drivers/gpio/drivers/dma/硬件控制器初始化、寄存器封装、向子系统注册CCU驱动、GPIO控制器、pinctrl
设备驱动drivers/video/drivers/net/drivers/input/具体设备控制、业务逻辑、用户接口LCD驱动、网卡驱动、触摸驱动

调用关系口诀

用户调用子系统,子系统回调驱动,驱动操作硬件

SoC控制器驱动是"承上启下"的关键层

  • 对上:实现子系统定义的struct clk_ops/struct dma_device等标准接口
  • 对下:直接读写SoC内部寄存器(如T113-I的0x02000000时钟基地址)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 3:56:54

天下工厂:400万工厂,全行业通吃!

在制造业B2B这一领域之中,不管你是需要采购原材料、销售相关设备、去拓展代工业务,亦或是提供像物流、环保、工业软件这类配套服务,最大的瓶颈其实事实上从来都不是“没有需求”,真正的问题是找不到那些真实存在、相互匹配而且能够…

作者头像 李华
网站建设 2026/2/27 0:52:50

python+yt-dlp开源项目,支持 YouTube, Bilibili, TikTok/抖音,快手 等多个平台的视频/音频/字幕下载/ai摘要等功能

通过视频的链接url进行数据提取与处理 我的开源项目 video-link-pipeline 这是一个集成了视频下载、音频提取、字幕处理、语音转录和 AI 摘要生成的全流程工具集。旨在帮助用户快速从各大视频平台获取内容,并利用 AI 技术进行深度处理。 ✨ 主要功能 全能下载: 支…

作者头像 李华
网站建设 2026/2/26 3:18:49

【课程设计/毕业设计】基于Flask的在线教育平台的设计与实现基于python+flask框架的智慧教学平台的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华