![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
小生聊【linux kernel】
文章平均质量分 88
本专栏分享关于linux内核、linux驱动程序、linux应用开发等相关的文章。
iriczhao
软件工程师一枚。读书时搞过Web开发,对html + css + JavaScript开发栈有一定了解。毕业后,成了一名软件工程师,主要研究和学习MCU端软件的开发、嵌入式Linux内核、嵌入式Linux应用软件的开发。做过可穿戴设备、物联网设备、医疗控制设备的软件开发;对人工智能、物联网、智能家居、5G技术等领域同样有着浓厚兴趣。
茫茫人海中,您无意识的一眼凝眸皆是缘分,如果您有想说的话,欢迎与我交流(iriczhao@163.com);如果您发现了分享的文章出现了错误,请您多拍砖,小生将自觉改正。
展开
-
【linux kernel】一文总结linux的clk框架
本文浅析linux的clk框架原创 2024-07-18 20:44:14 · 327 阅读 · 0 评论 -
【linux kernel】一文总结linux的uevent机制
本文描述linux内核的uevent机制。原创 2024-06-24 21:45:27 · 1102 阅读 · 0 评论 -
【linux kernel】一文总结linux输入子系统
本文记录linux输入子系统的一些知识点。原创 2024-06-24 21:39:29 · 1221 阅读 · 0 评论 -
【linux kernel】一文浅析linux HID核心
本文总结Linux内核的hid核心原创 2024-05-30 20:53:58 · 1073 阅读 · 2 评论 -
【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析
分析linux hid触摸源码hid-multitouch.c文件原创 2024-05-08 21:17:52 · 434 阅读 · 0 评论 -
【linux kernel】杂项(misc)设备驱动总结
文本总结misc杂项设备相关知识点原创 2024-05-08 21:10:02 · 1114 阅读 · 0 评论 -
【linux kernel】 一文总结linux内核中的kobject、kset和ktype
总结linux内核中的kobject、kset和ktype知识点原创 2024-04-20 10:11:41 · 1331 阅读 · 0 评论 -
【linux kernel】linux的SPI框架分析
本文分析linux内核的SPI框架!原创 2024-01-02 21:13:10 · 1520 阅读 · 1 评论 -
【linux kernel】linux 的uart驱动框架分析
本文分析linux的uart框架原创 2023-11-13 21:49:26 · 950 阅读 · 1 评论 -
【linux kernel】linux的platform设备驱动框架分析
本文分析linux的platform设备驱动框架。原创 2023-10-16 08:44:08 · 448 阅读 · 0 评论 -
【linux kernel】linux内核设备驱动的注册机制
向linux内核注册驱动由driver_register()完成。它将驱动程序的信息添加到内核的驱动程序列表中,使得内核能够在需要时与该驱动程序进行交互。本文将分析该函数!原创 2023-10-15 15:24:19 · 670 阅读 · 0 评论 -
【linux kernel】对linux内核设备的注册机制和查找机制分析
linux内核设备的注册由```device_register()```函数完成,这个函数是linux设备驱动模型的核心函数,本文将分析该函数!原创 2023-10-15 15:16:33 · 381 阅读 · 0 评论 -
【linux kernel】linux内核中的debugfs
本文分析和讨论linux内核中debugfs常用的API和使用方法。原创 2023-08-22 21:17:40 · 460 阅读 · 0 评论 -
【linux kernel】一文总结linux内核通知链
文本基于内核源码4.19.4描述构成通知链的具体数据结构和API接口,同时描述四种通知链的具体应用场景,并对API接口进行简要分析。原创 2023-07-06 12:00:00 · 1322 阅读 · 0 评论 -
【linux kernel】linux内核数据结构分析之哈希表
出自Linux内核文件是Linux内核中实现散列表的基础数据结构之一,它提供了高效的链表管理机制,用于处理具有相同哈希值的元素。在结构中,first是一个指向链表中第一个节点的指针,它指向通过使用,可以将具有相同哈希值的元素按照链表的形式连接起来,并且可以通过first指针快速访问链表中的第一个元素。在散列表的实现中,每个桶都使用来维护对应链表的头节点。这样可以方便进行链表的插入、删除和遍历操作。只是链表头节点的数据结构,并不存储实际的数据。实际的数据存储在链表节点。原创 2023-06-20 21:03:43 · 933 阅读 · 0 评论 -
【linux kernel】linux内核数据结构分析之链表
Linux内核中实现了一套经典的链表操作,定义在/include/linux/list.h文件中,本文基于linux内核源码6.2.7,记录了其常用操作链表的API函数,便于在阅读linux内核源码时更好的理解程序执行的过程和细节。原创 2023-06-19 21:48:56 · 1312 阅读 · 0 评论 -
【linux kernel】linux media子系统分析之media控制器设备
Media Controller设备:Media Controller设备是一个虚拟的设备,它代表了整个媒体设备的拓扑结构,包括所有的媒体实体、媒体端口、连接关系等。在Media Controller中,每个媒体设备都被描述为一个媒体实体(Media Entity),每个媒体实体都有一个或多个媒体端口(Media Pad),每个媒体端口都可以连接到另一个媒体设备的媒体端口上,从而形成一个媒体设备的拓扑结构。它负责创建和管理媒体设备子系统中的设备节点,以便应用程序可以通过设备节点与媒体设备进行通信。原创 2023-06-18 22:24:12 · 1272 阅读 · 0 评论 -
【V4L2】 v4l2框架分析之v4l2_fh
🔺相关源码文件:在V4L2中,结构用于保存V4L2框架中使用的文件句柄(File Handle)的数据,即每个打开的视频设备都会对应一个结构体,该结构体包含了与该设备相关的各种信息,例如该设备的控制器、缓冲区、状态等等。通过,V4L2子系统能够跟踪设备文件的打开和关闭,并管理与句柄相关的状态和控制操作。原创 2023-06-17 11:19:36 · 367 阅读 · 0 评论 -
【V4L2】 v4l2框架分析之v4l2_subdev
在linux内核中,许多驱动程序需要与子设备通信,这些子设备用于完成一些子任务,最常见的是:处理音频或视频的播放、编码或解码。传感器和摄像机控制器。这些设备通常是I2C设备(但也不全是)。原创 2023-06-15 22:47:09 · 1238 阅读 · 0 评论 -
【V4L2】 v4l2框架分析之v4l2_device
对于想要接入V4L2子系统的设备,每个设备实例都由一个表示。对于简单的设备可以只分配这个结构,但大多数情况下,可以把这个结构嵌入到更大的结构中。//指向struct device的指针。//指向struct media_device的指针,值可以为NULL。struct media_device表示一个媒体设备。//用来跟踪注册的子设备。//自旋锁。用于锁定这个结构体;如果这个结构体被嵌入到一个更大的结构体中,也可以被驱动程序使用。原创 2023-06-12 21:52:55 · 915 阅读 · 0 评论 -
【V4L2】v4l2框架分析之video_device
本文基于Linux内核版本4.1.15分析V4L2框架下的video_device。原创 2023-06-11 12:04:39 · 866 阅读 · 0 评论 -
【linux kernel】Linux设备驱动模型 | bus
本文首先描述与总线相关的数据结构,重点描述```struct bus_type```结构体内部各个元素的含义以及内部之间的联系。接着会描述linux设备驱动模型初始化过程中关于总线的初始化流程,这部分由```buses_init()```完成,最后会描述对总线的几个操作接口函数。原创 2023-01-16 21:43:03 · 1092 阅读 · 0 评论 -
【linux kernel】linux内核重要函数 | do_initcalls
从上述内容可以知道,linux内核中使用基于封装出的多个接口API初始化内核的各个模块,使用这些API接口会将指定的函数放到名称为的section中,id为初始化调用级别,内核中定义了14种调用级别:分别为17和1s7s(linux 3.0后增加的扩展)。这些调用级别是按照先后顺序依次排列的。(4-1)linux内核中,对于内核的各个模块的初始化,正是通过使用的衍生宏定义接口API将初始化函数放置到section中,不同模块的初始化函数按照调用级别顺序排列。原创 2023-01-14 22:56:40 · 1296 阅读 · 0 评论 -
【linux kernel】linux内核裁剪随想
为什么需要裁剪?首先,裁剪并不一定是缩小内核镜像的大小,而是**移植和适配**。内核支持的特性很多,站在项目的角度,不一定全部需要这些特性和功能。这时候就需要将不需要的特性和功能剔除,随着这个过程的进行,内核的镜像会逐渐缩小。原创 2022-12-21 22:01:21 · 2298 阅读 · 0 评论 -
【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S
本文基于ARM64分析linux内核的链接脚本。原创 2022-11-15 20:29:59 · 1733 阅读 · 0 评论 -
嵌入式linux开发 | 搭建网络开发环境
本文的目的是既要保证嵌入式Linux平台的网络环境正常工作,又要保证笔记本电脑(Windows)端、虚拟机Ubuntu都能正常访问外网。实现的核心思路是:使用VMware Workstation虚拟两个网络VMnet0、VMnet2,VMnet0桥接到无线WLAN,实现外网的访问;VMnet2桥接到以太网,用于虚拟机Ubuntu与目标硬件板卡之间通过网线通信,便于嵌入式Linux平台下的开发和调试。原创 2022-10-09 20:53:29 · 903 阅读 · 0 评论 -
【linux kernel】以tftp方式启动linux内核
在嵌入式linux开发中,我们一般是在自己的个人电脑或者服务器上进行linux相关的编译构建,在编译构建完成后,生成的系统镜像、系统组件等文件需要烧写到具体的目标机子上。然而,在实际调试开发过程中,如果每修改一次系统镜像和组件就向目标机子烧写一次,这将是一件繁杂且低效率的事情,这时候,我们则可以在开发电脑和目标平台之间搭建tftp服务环境。这么做,我们可以很方便的通过tftp下载开发主机上的文件到目标平台上。原创 2022-08-20 19:44:58 · 1700 阅读 · 0 评论 -
【linux kernel】start_kernel函数详解系列之proc_caches_init
start_kernel函数详解系列之【proc_caches_init】一、开篇 在start_kernel函数中将调用proc_caches_init()用于为linux内核中内核对象初始化slab缓存描述符。该函数定义如下(/kernel/fork.c):void __init proc_caches_init(void){ sighand_cachep = kmem_cache_create("sighand_cache", sizeof(struct sighand_struct原创 2022-05-14 12:04:54 · 484 阅读 · 0 评论 -
【linux kernel】start_kernel函数详解系列之fork_init
start_kernel函数详解系列之【fork_init】一、开篇小聊在start_kernel()中会调用fork_init()函数,该函数定义在(/kernel/fork.c)文件中:void __init fork_init(void){#ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR#ifndef ARCH_MIN_TASKALIGN#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES#endif /* create原创 2022-05-13 10:29:59 · 403 阅读 · 0 评论 -
【linux kernel】start_kernel函数详解系列之rcu_init
一、闪亮登场(注)本文代码出自linux内核版本:4.1.15在start_kernel()函数中会使用rcu_init函数对RCU进行初始化,该函数内部实现取决于以下两个内核配置选项:CONFIG_TINY_RCUCONFIG_TREE_RCU在第一种情况下,rcu_init函数定义在内核的/rcu/tiny.c中,第二种情况下,rcu_init函数会在内核的/rcu/tree.c中定义。本文假设是第二种情况。RCU全称read-copy-update,是linux内核中实现的一种可扩展的原创 2022-05-12 08:18:05 · 458 阅读 · 0 评论 -
【linux kernel】start_kernel函数详解系列之proc_root_init
一、开篇 本文所有代码出自linux内核版本:4.1.15 在start_kernel函数中将调用proc_root_init()初始化proc文件系统的目录。该函数定义如下(/fs/proc/root.c):void __init proc_root_init(void){ int err; proc_init_inodecache(); err = register_filesystem(&proc_fs_type); if (err) return; proc_s原创 2022-05-11 22:19:56 · 626 阅读 · 0 评论 -
【linux kernel】start_kernel函数的早期操作
文章目录一、setup_arch简介二、setup_arch函数分析(2-1)启动处理器(2-2)设置machine_desc结构参数和machine_name字符串(2-3)设置init_mm结构的参数(2-4)备份命令行参数(2-5)设置linux启动早期参数(2-6)页表初始化(2-7)请求标准资源(2-8)创建设备树节点(2-9)构建cpu逻辑映射关系(2-10)psci初始化(2-11)对称多处理器下初始化(2-12)架构早期初始化三、结尾一、setup_arch简介 路一直走,来到了set原创 2022-05-11 22:13:52 · 668 阅读 · 0 评论 -
【linux kernel】linux内核如何启动用户空间进程【2】
一、开篇在《【linux kernel】linux内核如何启动用户空间进程-01》一文中,分析了start_kernel函数启动用户空间进程的入口点,本文将分析余下部分的启动过程。对于在linux内核启动主线start_kernel()函数中调用的run_init_process()函数,或者是execveat系统调用,这两个操作到最后都将会调用到do_execveat_common()这个重磅函数。该函数用于linux内核执行一个新的程序。do_execveat_common()函数原型如下(定义在/原创 2022-04-28 21:33:13 · 1343 阅读 · 0 评论 -
【linux kernel】一文总结linux内核的完成量机制
文章目录一、completion完成量二、使用方法(2-1)初始化完成量(2-1-1)动态初始化完成量(2-1-2)静态声明和初始化完成量(2-2)等待完成量(2-3)发送信号量完成(2-4) try_wait_for_completion()/completion_done()三、使用实例一、completion完成量linux内核中,completion是一种代码同步机制。如果有一个或多个线程必须等待某个内核活动操作达到某个点或某个特定状态,那么completion完成量可以提供一个无竞争的解决方案原创 2022-04-23 12:17:48 · 2806 阅读 · 0 评论 -
【linux kenrel】一文总结linux内核设备驱动的注册和卸载
一、背景在linux驱动开发中,肯定会接触到driver_register()和driver_unregister()函数,本文将从内核源码角度,来看看这两个函数的具体实现。在linux内核源码(/drivers/)目录中,放置的是某一类设备驱动框架,例如(spi、I2c,net)等。这些框架的核心大多都会调用到driver_register()函数。这两个函数的原型如下:int driver_register(struct device_driver *drv);void driver_unregi原创 2022-04-19 21:52:53 · 1205 阅读 · 1 评论 -
【linux】一文总结linux系统平台完整的启动周期
本文内容很短,主要为方便梳理知识而写。本文站在linux系统平台启动的完整周期的角度出发,描述其整个的启动周期。一、开篇linux系统平台完整的启动周期分为四个阶段:(1)引导加载程序当系统(硬件和软件组成的完整系统)上电后,引导加载程序立刻会获得整个系统的控制权,一般引导加载程序存储在系统的非易失性内存(闪存或ROM)中。引导加载程序主要用于处理器底层的初始化、linux系统镜像的加载和系统诊断。然后会将系统的控制权转交给linux操作系统。(2)启动加载程序启动加载程序(见《【linux k原创 2022-04-16 18:09:39 · 1665 阅读 · 0 评论 -
【linux kernel】启动加载程序的总结
文章目录一、背景二、启动加载程序的结构(2-1)piggy.xxx.S文件(2-2)head.o文件(2-3)misc.c文件三、启动加载程序的功能(3-1)启动加载程序向linux内核的跳转(3-2)解压linux内核镜像四、结尾一、背景对于很多架构来说,都会使用【启动加载程序】将linux内核镜像加载到内存中。有的启动加载程序还会对内核镜像进行校验和检查,还有的会解压linux内核镜像并重新部署linux内核镜像。对于linux内核来说,【启动加载程序】可以看做是引导加载程序与linux内核镜像之原创 2022-04-16 17:06:27 · 1197 阅读 · 0 评论 -
【linux kernel】linux内核入口:head.o
一、开篇对于linux内核来说,她有一个统一的入口,那就是head.o模块,在不同架构下,该模块有着不同的文件名称,例如head.S、head_xxx.S;该文件的具体路径是(/arch//kernel/head.S),其中是具体的架构名称。head.o模块用于完成和架构、CPU相关的初始化工作,主要用于为内核主体的执行做准备。除此之外,head.o的功能还有:检查处理器和架构的有效性。创建初始的页表表项。启用处理器的内存管理单元(MMU)。进行错误检测并报告。跳转到内核主体的起始位置。(ma原创 2022-04-13 21:47:58 · 4617 阅读 · 0 评论 -
【linux kernel】挂载根文件系统之rootfs
挂载根文件系统之rootfs文章目录挂载根文件系统之rootfs一、开篇二、rootfs根文件系统(2-1)初始化rootfs(2-2)挂载rootfs文件系统(2-3)创建简单的rootfs根文件系统目录和文件(2-4)打开0、1、2文件描述符三、挂载用户指定的根文件系统一、开篇 对于linux内核来说,文件系统可以说是给内核增添了无尽的“乐趣”。在linux运行情况下,对于一个文件系统来说,只有挂载到内存中目录树的一个目录下,文件系统才会被linux所访问。linux内核中很多地方都运用“父—子原创 2022-04-06 22:15:41 · 7627 阅读 · 2 评论 -
【linux kernel】start_kernel详解系列之【setup_arch】
start_kernel详解系列之【setup_arch】文章目录start_kernel详解系列之【setup_arch】一、开篇二、setup_arch函数分析(2-1)启动处理器(2-2)设置machine_desc结构参数和machine_name字符串(2-3)设置init_mm结构的参数(2-4)备份命令行参数(2-5)设置linux启动早期参数(2-6)页表初始化(2-7)请求标准资源(2-8)创建设备树节点(2-9)构建cpu逻辑映射关系(2-10)psci初始化(2-11)对称多处理器下原创 2022-04-10 18:40:48 · 2025 阅读 · 0 评论