04 SoC与系统架构
SoC与系统架构SoC/MCU/MPU/CPU的区别 SoC是将一个完整的系统整合到单一芯片上的集成电路,包括 CPU、GPU、存储控制器、外设接口、专用加速器(GPU/NPU/VOP)等 SoC 不一定有片上 RAM(有些会集成 LPDDR),但一定有外部内存接口 MCU是一种集成了CPU、内存(如闪存、RAM)、以及多种外设(如ADC、DAC、串行通信接口、定时器等)于一体的芯片,可以看成简易版的SoC。与SoC的核心区别: MCU通常不跑复杂OS(最多RTOS),但是SoC一般跑Linux/Android之类的 MCU的片上RAM/ROM都比较小,功耗比较低 MPU:不带片上...
03 计算机组成原理
...
06 操作系统
操作系统内存管理参考链接: Linux内存管理子系统技术树 - 知乎 1.介绍下Linux的内存子系统 虚拟内存管理:地址空间、页表、内存布局 物理内存管理:struct page、Zone区、伙伴系统、SLAB分配器 页缓存、回收、换页机制:通过页缓存加速 I/O;当内存紧张时,kswapd 回收不常用页、OOM-Killer...
26 PCIE
PCIE 访问流程PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转换才可以完成 参考链接:https://blog.csdn.net/u011037593/article/details/137697527 拓扑结构PCIE并不是像IIC/PCI那样的共享并行总线式结构,它是点对点通信的串行总线 点对点通信:不存在总线仲裁、广播冲突等问题 串行通信:一个bit一个bit的发送数据 在PCIE的拓扑中,有以下这些十分重要的概念: Root ComplexRoot...
27 DMA子系统
DMA子系统概述DMA(Direct Memory Access)是用于高效数据传输的一种技术,能够实现外设和内存之间直接交换数据,而无需CPU干预,它通常以独立的控制器存在。DMA不仅减轻了CPU负担,提高了数据传输效率,还能在数据传输过程中保持CPU的计算能力 传输模式DMA有几种常见的传输模式,具体方式取决于传输的源和目标设备以及数据的传输方向: 内存到内存 通常用于大数据块的移动,如从一个缓冲区复制数据到另一个缓冲区 外设到内存 比如一个传感器的测量结果可以直接写入内存供后续处理 内存到外设 比如将数据从内存直接写入到输出设备(如DAC、显示器) 外设到外设 比如将数据从ISP传到NPU做推理 硬件组成DMA控制器跟其他外设的控制器一样,内部有很多寄存器。除此之外,还引入“通道”概念。DMA通道指的是可以完成一次数据传输的硬件资源集合,每个通道都有一组独立的寄存器: 源地址寄存器 目标地址寄存器 传输计数器 控制与状态寄存器:方向、通道使能、中断使能、宽度… DMA通道 = 一套私有寄存器 + 地址生成器 + 总线请求逻辑DMA控制器...
06 开机自启动
Linux初始化系统 想要设置开发板的某程序开机时自启动,有多种方式,本质上是使用了Linux的初始化系统。在linux内核启动后期会尝试加载用户空间的init程序,init程序是由内核启动的第一个用户空间程序(PID为1),该程序负责启动用户空间的服务和程序 init程序由初始化系统提供,可以通过以下方法查看系统的init进程到底是谁: 法1: 法2:pstree -p BusyboxBusyBox 是一个高度集成的嵌入式Linux工具集,它既是一个轻量级初始化系统,也是一个精简版的Unix命令集合。它的核心设计目标是用最小的空间提供完整的Linux系统功能 BusyBox 提供了一个简化的init程序,用于替代传统的 SysVinit或 systemd,它的init程序有2种实现形式: (1) 传统 SysVinit 风格 配置文件:/etc/inittab 启动流程: 内核启动后执行 /sbin/init(通常是 BusyBox 的符号链接) BusyBox 读取 /etc/inittab,定义运行级别和启动脚本 执行 /etc/init.d/中的脚本(如...
01 驱动开发概述
Linux驱动开发概述简介Linux驱动开发是设备驱动模型、驱动子系统、内核基础设施三者的深度整合: 设备驱动模型提供通用框架,实现驱动与设备的匹配 各个子系统实现垂直领域优化(如输入、存储、网络) 内核设施与硬件操作解决并发、内存、中断等底层问题 驱动开发子系统定义 子系统是指针对特定功能领域或硬件类型设计的软件框架。其核心目标是解耦硬件差异,提供统一的API,使得驱动开发者无需直接操作底层寄存器或硬件细节,而是通过标准化API完成功能开发 所有的驱动子系统的实现均遵循分层架构原则 用户接口层:通过sysfs或/dev节点提供控制接口 核心层:实现事件队列、资源分配等通用逻辑 硬件驱动层:厂商实现具体寄存器操作 123456789 用户空间 │ ▼ 用户口层(如VFS、sysfs) │ ▼ 子系统核心层(标准API) ↗ ↖ ↖设备驱动层A 驱动层B ...
00 Linux内核模块
Linux内核模块Linux内核本身非常庞大,包含了很多东西,这带了一些问题: 许多功能我们可能并不需要,如果每次都把所有东西一起编译了,十分耗时且编译出来的镜像会很大 因此,Linux内核引入了“模块”机制,对于一些功能,它本身不直接编译进内核,而是以模块(.ko)的形式存在内核之外,一旦需要这些功能,可以动态将其加载进内核。一旦被加载,他们就和内核中其他部分没有区别 所以Linux的开发有2种方式: 1.将新功能直接编译进内核,这样当Linux内核启动时将自动运行设备驱动程序 2.将新功能编译成内核模块.ko文件,在Linux内核启动后使用相应命令加载驱动模块 通常在调试的时候使用第2种方式,这样在修改驱动时只需要修改驱动的代码,而不用重新编译整个内核并重启 内核模块程序结构12345678910111213141516#include <linux/module.h>#include <linux/fs.h>static int __init mydriver_init(void) { printk(KERN_INFO...
05 Kbuild
KbuildKbuild(Kernel Build...







