04 内核移植及分析
...
05 Kbuild
KbuildKbuild(Kernel Build System)是Linux内核的构建系统,用于管理和协调内核的编译过程(也被其他开源软件所采用,比如U-Boot、BusyBox等) 它基于GNU Make,但通过预定义一些变量和目标(比如obj-y、zImage、menuconfig等)进行了扩展以支持内核特有的需求,如模块化编译、跨平台支持和灵活的配置选项 Kbuild由内核中的所有Makefile、Kconfig以及scripts文件中的一些脚本组成 执行流程 根据用户(内核)的配置生成相应的.config文件 将内核的版本号存入include/linux/version.h 建立指向 include/asm-$(ARCH)...
06 镜像烧写
镜像的烧写 之前一直用NFS+TFTP搭建开发环境,但实际生产环境不会用这种形式,会直接把镜像下载到存储介质中(SD/emmc…) 不同厂商的SoC烧录镜像所使用的工具,镜像的格式都不相同,所以这部分不是通用的,需要根据所用的平台来学习 我们在烧录时,不一定要把所有镜像(uboot、kernel、dtb、rootfs)都打包在一起再下载,可以分别下载各个部分 NXP平台NXP平台主要有2中方式,分别是针对USB烧录和SD卡烧录: USB烧录 MFGTool工具是NXP官方推荐的一个使用USB OTG来升级镜像的软件工具,它是NXP针对i.MX系列处理器专门使用的烧录工具,可以用来升级linux, 单独烧录某一系统分区,独立地烧录spi flash、 nor flash、sd card、nand flash,emmc等,...
07 TrustZone
TrustZone概述ARM TrustZone技术是所有Cortex-A系列CPU的基本功能,是通过ARM的安全扩展引入的。TrustZone从硬件层面提供安全机制,将CPU的工作状态分为Normal World(非安全世界)和Secure World(安全世界),涉及到安全相关的操作比如指纹、密码等都要在安全世界中进行,其他操作在非安全世界中运行 系统架构ARM提供了一套TrustZone技术的开源解决方案TF-A,他是一套底层固件,由于不同芯片原厂的SoC各不相同,芯片原厂一般会基于这个开源的TF-A针对自己的芯片再做一些修改,我们直接用芯片原厂修改好的就行了 前面提到了启用了ARM TrustZone后,CPU被分为2个世界,而这2个世界交互的桥梁就是ARM Trusted...
00 Linux内核模块
Linux内核模块Linux内核本身非常庞大,包含了很多东西,这带了一些问题: 许多功能我们可能并不需要,如果每次都把所有东西一起编译了,一是十分耗时,二是编译出来的镜像太大了 因此,Linux内核引入了“模块”机制,对于一些功能,它本身不直接编译进内核,而是以模块(.ko)的形式存在内核之外,一旦需要这些功能,可以动态将其加载进内核。一旦被加载,他们就和内核中其他部分没有区别 内核模块程序结构12345678910111213141516#include <linux/module.h>#include <linux/fs.h>static int __init mydriver_init(void) { printk(KERN_INFO "Driver loaded\n"); return 0;}static void __exit mydriver_exit(void) { printk(KERN_INFO "Driver...
01 驱动开发概述
Linux驱动开发概述简介Linux驱动开发是设备驱动模型、驱动子系统、内核基础设施三者的深度整合: 设备驱动模型提供通用框架,实现驱动与设备的匹配 各个子系统实现垂直领域优化(如输入、存储、网络) 内核设施与硬件操作解决并发、内存、中断等底层问题 驱动开发子系统定义 子系统是指针对特定功能领域或硬件类型设计的软件框架。其核心目标是解耦硬件差异,提供统一的API,使得驱动开发者无需直接操作底层寄存器或硬件细节,而是通过标准化API完成功能开发 所有的驱动子系统的实现均遵循分层架构原则 用户接口层:通过sysfs或/dev节点提供控制接口 核心层:实现事件队列、资源分配等通用逻辑 硬件驱动层:厂商实现具体寄存器操作 123456789 用户空间 │ ▼ 用户口层(如VFS、sysfs) │ ▼ 子系统核心层(标准API) ↗ ↖ ↖设备驱动层A 驱动层B ...
02 Linux设备驱动模型
Linux设备驱动模型简介Linux设备驱动模型是内核中用于统一管理硬件设备、驱动程序和总线关系的核心框架。它通过一系列抽象结构(如struct device、struct driver、struct class、struct bus_type等)构建了一个层次化的设备拓扑,使内核能够动态管理设备的生命周期(如热插拔、电源管理),并为用户空间(通过 /sys)提供标准化的设备信息接口。 设备驱动框架和设备驱动模型不是一个东西,前者指的是GPIO、Input、Pinctl等子系统,而后者主要是Linux内核对于驱动开发中的一种设计模式 Linux设备驱动模型的核心思想是把我们编写的驱动代码进行分层解耦: 设备:提供硬件资源 驱动:使用设备提供的硬件资源进行初始化等操作 总线:将设备和驱动匹配起来 任何设备都挂在在某个总线上,即使物理上没有总线,也要虚拟出来个总线(platform) 核心目标 统一管理硬件:无论设备是 PCI、USB、I2C 还是platform设备,都通过一致的接口管理 支持动态事件:热插拔、电源状态切换(休眠/唤醒)等 用户空间交互:通过...
04 设备树
...
