- 博客(218)
- 资源 (1)
- 收藏
- 关注
原创 原来这就是Linux内核的“任务快递站“!——深挖工作队列(workqueue)设计哲学(2)
概念核心作用关键结构工作项表示具体的异步任务单元,包含函数和参数。工作队列管理任务队列,将工作项分发到对应的工作池。工作池提供内核线程资源,执行工作项。协作流程工作项→ 提交到工作队列→ 通过路由到工作池→ 由工作池的内核线程执行。这种设计实现了异步任务的高效调度,同时确保内核线程资源的合理复用,避免了中断上下文的阻塞风险。
2025-03-16 21:51:33
645
原创 原来这就是Linux内核的“任务快递站“!——深挖工作队列(workqueue)设计哲学(1)
工作池的主要作用是提高系统效率,避免在需要执行工作时频繁创建和销毁线程所带来的开销。想象你正在经营一家24小时营业的快递站(内核空间),每天需要处理成千上万个包裹(工作任务)。这些包裹有的需要立即派送(中断处理),有的可以稍后处理(延迟任务),还有的需要特殊车辆运输(特定CPU核心处理)。:工作队列是一种内核机制,用于在进程上下文(而非中断上下文)中执行延迟工作。用户可以将需要延迟执行的工作项添加到工作队列中,内核会在合适的时机将这些工作项分配给工作池中的工作线程去执行。)来执行队列中的任务,实现程序的。
2025-03-16 20:33:17
810
原创 Linux系统调试:深入解析IS_ERR函数的使用
场景正确用法错误用法内存分配失败if (!ptr)资源获取类函数直接判空错误传递返回未经转换的指针掌握IS_ERR系列函数的使用,是Linux内核调试的重要基础。它不仅能帮助开发者准确定位资源分配错误,更是理解内核错误处理机制的关键入口。
2025-03-02 19:18:06
667
原创 《RISC-V取代Arm的100个理由:从“瑞士户口”到“全村希望”的硬核逆袭》
因为穷!Arm的授权费贵到能买下程序员的所有头发;RISC-V的开源精神便宜到能让老板笑出猪叫。最后一句暴论:“用Arm,你是打工人;用RISC-V,你才是爸爸!👑表情包配图:熊猫戴皇冠叉腰,配字:“叫爸爸!(转载请标注出处,否则你写的RISC-V代码会神秘变成Arm汇编)#RISC-V劝退Arm指南#开源白嫖哲学#芯片界的拼多多#2025年码农翻身计划。
2025-02-06 19:14:17
498
原创 Linux 内核源码can相关配置项
这些配置项主要用于控制Linux内核中CAN相关模块的编译和功能启用。根据你的硬件和软件需求,你可以选择性地启用这些选项。基本CAN支持:启用CONFIG_CAN和,用于基本的CAN通信。高级CAN功能:启用和,用于复杂的CAN网络拓扑。特定协议支持:启用和,用于特定的工业和汽车通信协议。
2025-02-06 18:30:05
814
原创 《2025年,嵌入式老狗如何用Linux内核代码当护身符?——普通本科生的硬核逆袭指南》
学历不够?代码来凑!本文教你如何在2025年用Linux内核代码糊住HR的嘴,用驱动bug吓退职场内卷,顺带把工资条焊死在涨停板上。
2025-02-06 13:59:08
790
原创 《用DeepSeek写周报,结果被猎头盯上了…》 —— 职场隐形战衣:如何用AI把周报写成“升职密码”,还让猎头疯狂挖角!
“小张啊,周报别写太长,但要有深度。”—— 曾经的我一听这话就瞳孔地震:❌ 周报の地狱模式:直到我祭出DeepSeek——现在的我be like:✅ AI打工人の奇幻漂流:今天,我就把这份《周报造神指南》偷偷塞给你!(温馨提示:用完后记得删聊天记录🤫)场景:这周就修了个按钮颜色,周报总不能写“把蓝色改成红色”吧?DeepSeek魔法:效果:操作流:猎头视角:DeepSeek话术库:双重暴击:操作步骤:话术库生成:输入“如何礼貌回应猎头又不让现公司发现?”DeepSeek输出:反侦察技巧:记住这个
2025-02-06 00:45:06
417
原创 《用DeepSeek+Excel,我让老板给我加了薪!》 —— 打工人の逆袭:如何用AI把Excel玩成“摸鱼神器”还让老板狂点赞[特殊字符]✨
“小张啊,这个季度的销售数据分析,下班前给我。”—— 曾经的我一听这话就眼前一黑:❌ Excel小白の日常:直到我遇到了DeepSeek——现在我的日常be like:✅ AI打工人の画风:今天,我就把这份《职场外挂指南》偷偷传给你!(嘘…别让老板知道真相🤫)场景:老板要统计“华东区单价>100元且复购率<5%的客户数量”。旧方法:DeepSeek魔法:效果:场景:每月都要合并20个分公司的Excel报表,手动操作到腱鞘炎发作…操作步骤:运行:按F5 → 喝口奶茶的功夫,数据自动合并完成!
2025-02-05 22:46:36
905
原创 《DeepSeek:你的AI新朋友,让代码和脑洞齐飞!》 一篇让小白也能看懂的“赛博魔法”指南
一个能陪你写代码、搞数据、聊人生的“AI全能助手”!
2025-02-05 21:02:26
1585
原创 Linux内核启动时处理启动参数
这些宏和函数主要用于在 Linux 内核初始化过程中解析和处理启动参数。通过宏,可以方便地注册启动参数及其处理函数,并将这些参数分类为早期处理或非早期处理。宏则提供了一种便捷的方式来处理启用和禁用的启动参数。和函数则在内核初始化过程中调用,解析这些参数。首先,我们定义一个全局变量my_value,用于存储my_option// 默认值为 0。
2025-01-12 20:19:02
1073
原创 修饰Linux驱动初始化以及逆初始化函数的宏定义详解
阅读Linux驱动源码时,我们发现驱动的初始化函数和逆初始化函数总会被一个宏进行修饰,__section__section__initcall;__exitcall;这段代码是 Linux 内核模块加载和卸载机制的一部分。它使用了一些宏和属性来确保模块在特定的阶段被正确加载和卸载。这个宏定义了,它实际上调用了宏,传入了平台驱动的注册和注销函数。.init.text.previous.exit.text通过这些机制,Linux 内核模块可以优雅地管理和加载/卸载平台驱动程序。
2025-01-12 19:56:57
440
原创 Linux 时区
时区是指地球上某个区域采用的统一时间标准。由于地球是圆的,且自转一周为 24 小时,因此需要将地球划分为 24 个时区,每个时区相差 1 小时。协调世界时(UTC)是国际标准时间,所有时区的时间都是基于 UTC 进行加减得到的。UTC 模式:如果硬件时钟配置为存储 UTC 时间,会将系统时间(UTC 时间)写入硬件时钟。本地时间模式:如果硬件时钟配置为存储本地时间,会将系统时间(本地时间)写入硬件时钟。默认行为hwclock -w会根据文件中的配置来决定硬件时钟的时间模式。
2024-12-29 19:27:09
1443
原创 Linux RTC 驱动框架
实时时钟(Real-Time Clock,简称 RTC)是一种能够持续记录时间的电子设备。它通常用于计算机、嵌入式系统和其他需要准确时间记录的设备中。RTC 可以在系统关机或断电的情况下继续运行,因此即使在系统重启后也能保持准确的时间。class.c:为底层驱动提供 register 与 unregister 接口用于 RTC 设备的注册/注销。初始化 RTC设备结构、sysfs、proc;:提供用户程序与 RTC 的接口函数;dev.c:将 RTC设备抽象为通用的字符设备,提供文件操作函数(
2024-12-24 23:57:24
1152
3
原创 UART驱动学习三(TTY驱动部分源码解析)
定义了与TTY设备相关的所有信:用于存储终端线的配置信息,如输入输出标志、控制标志等。:定义了行规程的操作集,包括打开、关闭、读取、写入等操作。tty_ldisc:表示一个行规程实例,包含指向其操作的指针。
2024-10-07 20:07:00
1018
原创 UART驱动学习二(TTY体系)
本文主要介绍了 Linux 系统中的 TTY 体系,包括 TTY 体系中各种设备节点的差别以及 TTY 驱动框架。提供了多篇必读的参考资料,包括对 TTY 的解密文章、关于 Linux 各种终端类型和概念的文章、Linux 终端和 Line discipline 图解文章以及关于电传机的介绍文章等。
2024-10-06 23:52:48
1418
1
原创 UART驱动学习一(UART硬件介绍)
以上不同的UART芯片代表了串口通信技术从早期8250到现代NS16850的演变过程,随着技术的发展,它们在数据处理能力、缓冲区大小和支持的波特率等方面逐步得到了增强。这使得现代的串口通信能够在更高的速度和更复杂的环境中工作。例如,现代操作系统和硬件往往使用NS16550A或NS16850,因为它们提供了优良的性能和功能。如果需要在特定应用中选择合适的串口芯片,可以根据上述特性进行参考。本文章参考了韦东山老师驱动大全部分笔记,其余内容为自己整理总结而来。水平有限,欢迎各位在评论区指导交流!!!😁😁😁。
2024-09-29 00:15:50
1996
原创 SPI驱动学习七(SPI_Slave_Mode驱动程序框架)
使用SPI传输时,最小的传输单位是"spi_transfer",对于一个设备,可以发起多个spi_transfer,这些spi_transfer,会放入一个spi_message里。从spi_master的队列里取出每一个spi_message从spi_message的队列里取出一个spi_transfer处理spi_transfer。
2024-09-28 20:05:07
2013
原创 SPI驱动学习六(SPI_Master驱动程序)
SPI 是“串行外设接口”的缩写,它在嵌入式系统中广泛使用,因为它是一个简单且高效的接口:基本上是一个多路复用的移位寄存器。它的三个信号线分别为时钟线(SCK,通常在 1-20 MHz 范围内)一个“主机输出从机输入”(MOSI)数据线和一个“主机输入从机输出”(MISO)数据线。SPI 是一种全双工协议;每在MOSI线上移出一位(每时钟一位),MISO线上就会移入一位。这些位在去往和从系统内存传送的过程中会被组装成各种大小的字。一个额外的芯片选择线通常是低电平有效的(nCS);
2024-09-23 00:06:13
1413
原创 SPI驱动学习五(如何编写SPI设备驱动程序)
SPI Master(或者说控制器) 通过platform总线设备驱动模型进行实现,SPI Device通过SPI driver驱动模型来实现。SPI设备的设备树节点,会被转换为一个spi_device结构体。在SPI子系统中,用spi_transfer结构体描述一个传输,用spi_message管理多个传输。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。在这个节点下,创建子节点,用来表示SPI设备。将该部分内容添加到主控板的设备树文件中。在设备树里,找到SPI控制器的节点。
2024-09-08 23:31:34
3071
原创 SPI驱动学习四(通过SPI操作外设模块)
首先要确定内核中已经含有spidev。要操作OLED,只需使用SPI接口发送数据,并不需要使用SPI接口读取数据。整体过程与SPI DAC模块类似,将该设备树内容添加到主控板设备树文件,重新编译内核,烧录到主控板重启即可;显存被分为8页、127列,要写某个字节时,需要先指定地址,然后写入1字节的数据。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。OLED上有128*64个像素,每个像素只有2种状态:亮、灭。让DC引脚为高,发起SPI写操作即可。对于OLED的初始化,在参考手册。
2024-09-08 19:27:01
1021
原创 SPI驱动学习三(spidev的使用)
1. 驱动框架 设备树示例:下图请双击放大查看!!! 设备树里某个spi设备节点的compatible属性等于下列值,就会跟spidev驱动匹配: 匹配之后,spidev.c的会被调用,它会: spidev.c通过file_operations向APP提供接口,上层通过这些接口操作SPI设备 为了便于大家深入学习,我借助阿里的对整个文件代码进行了注释,在这里分享给大家:二、SPI应用程序分析 内核提供的测试程序:,这里不提供源码,大家自己打开内核源码这个文件,学习驱动源码应该都有。
2024-09-01 22:53:37
3154
1
原创 SPI驱动学习二(驱动框架)
在SPI Master对应的设备树节点下,每一个子节点都对应一个SPI设备,这个SPI设备连接在该SPI Master下面。在设备树里,会有一个节点用来表示SPI控制器。会在设备树里使用子节点来描述SPI设备。这通常意味着该节点的资源大小是隐含的,或者不需要明确地在设备树中指定资源的大小。考虑一个设备树的片段,其中定义了一个总线节点,并且包含两个子节点:一个内存节点和一个设备节点。, Linux中使用spi_master结构体描述SPI控制器,里面最重要的成员就是。在设备树中,对于SPI Master,
2024-09-01 21:09:00
2171
原创 Linux: SPI应用编程
在 Linux 中,SPI(Serial Peripheral Interface)是一种串行通信协议,用于在主设备(如 CPU)和一个或多个从设备(如传感器、存储器等)之间传输数据。SPI 通信通常通过四个基本信号线进行:时钟(SCLK)、主输出从输入(MOSI)、主输入从输出(MISO)和片选(CS)。
2024-08-29 23:55:54
3073
原创 SPI驱动学习一(协议原理)
SPI(Serial Peripheral Interface)协议是一种用于微控制器与外部设备之间串行数据通信的标准接口协议。SPI协议由摩托罗拉公司最初开发,广泛应用于各种电子设备中,如传感器、存储设备、显示器等。SPI是一种同步串行通信协议,允许多个外部设备与主设备(通常是微控制器)进行数据交换。SPI协议的基本通信方式是全双工,即可以同时进行数据的发送和接收。也可以是单向的,数据传输的长度通常以字节为单位。SPI协议没有定义速度限制,读写操作由主设备发起,且外设的写操作和读操作是同步完成的.
2024-08-19 23:27:42
1242
原创 Linux 用户管理相关命令与配置文件详解
最近在搞 Linux 的用户管理,所以将一些知识进行简单的整理,分享给大家,也作为自己的学习笔记!passswdshadowgroup配置文件位于/etc目录下,这三个文件记录了系统用户信息以及用户登陆密码,这些文件的生成与修改与adduser、addgroup以及passwd命令相关。走读busybox源码可以发现,使用adduser新增用户时,该命令内部是会调用到addgroup以及passwd命令的实现函数的,所以只使用adduser就可以同时生成或修改这三个配置文件。
2024-08-19 00:14:46
780
原创 C++版设计模式简介 与 初识 工厂模式
关于并发编程的更多内容我会在后续的实际开发中进行总结,然后分享给大家!接下来将会和大家一起学习C++的设计模式😷(1)设计模式 是 软件开发人员在软件开发过程中 面临的一般问题的解决方案。(2)这些解决方案是众多软件开发人员经过 相当长的一段时间的 试验 和 错误总结出来的。(3)使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
2024-08-18 21:24:27
985
原创 Linux 内核RCU机制的使用
RCU背后的基本思想是将更新操作分为“移除”和“回收”两个阶段。移除阶段会删除数据结构中对数据项的引用(可能通过用这些数据项新版本的引用来替换它们),并且可以与读者(读操作)同时运行。之所以能够安全地与读者同时运行移除阶段,是因为现代CPU的语义保证读者将看到数据结构的旧版本或新版本,而不会看到部分更新的引用。回收阶段则执行在移除阶段从数据结构中删除的数据项的回收工作(例如,释放它们)。由于回收数据项可能会干扰同时引用这些数据项的任何读者,因此在读者不再持有对这些数据项的引用之前,回收阶段不能开始。
2024-08-11 22:42:47
1226
原创 Modbus协议了解与简单使用
Modbus 是一种串行通信协议,用于工业自动化系统中的数据传输。它被广泛应用于监控和控制设备。Modbus 协议由 Modicon(现在是施耐德电气的一部分)在 1979 年开发,用于其 PLC(可编程逻辑控制器)中。它是一种开源协议,可以在不同类型的网络和设备中使用。它是用于在电子设备之间的串行线路上传输信息的方法。
2024-07-21 21:01:37
1129
原创 基于syslog协议的Linux系统日志服务程序的了解与使用
syslog协议是一种标准化的方法,用于在网络设备间传输日志信息,允许各种设备如服务器、路由器、防火墙等,将日志消息发送至中央日志服务器,便于集中管理与分析。以下是syslog。
2024-07-14 22:57:28
1272
原创 Linux于自动化编译程序命令——make
在Linux系统中,make命令是一个强大且有用的工具,它被广泛用于构建和管理软件项目。本文将详细介绍make命令的使用以及它在开发过程中的重要性。
2024-06-23 23:18:29
1718
原创 解析中断引起的调度延迟问题
硬件中断和软件中断都有可能导致调度延迟,但两者的影响方式略有不同。 硬件中断:当硬件设备发送中断请求时,CPU 会立即响应中断并执行对应的中断处理程序。在处理硬件中断时,CPU 会暂时中断当前任务的执行,切换到中断处理程序,处理完中断后再切换回原任务。硬件中断有可能打断正在执行的任务,引起调度延迟。 软件中断:软件中断是由软件程序触发的中断,通常是通过系统调用或软中断指令来实现。软件中断不像硬件中断那样突然而来,一般在优先级比较低,不会立即打断正在执行的任务。但是,软件中断也需要处理,其处理过程可能
2024-06-10 23:21:01
1531
原创 深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*
在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD(Memory Technology Device)子系统是Linux内核的一个组成部分,它为各种类型的闪存和EEPROM设备提供了一个统一的接口。/dev/mtd*和,它们的用途、区别以及如何在实际场景中应用这些知识。MTD(Memory Technology Device)子系统是 Linux 内核中的一个子系统,用于管理非易失性存储器设备,如闪存芯片(NAND、NOR 等)。
2024-03-26 00:04:40
10226
2
原创 Linux:管道文件及相关API
在 Linux 系统中,管道是一种非常常用的进程间通信机制,它简单、高效,并且易于使用。本文将深入介绍 Linux 管道的原理、分类、特点以及使用方法,帮助读者更好地理解和应用管道在系统编程中的重要性。在 Linux 系统中,管道文件相关的 API 主要包括pipe()mkfifo()open()read()write()等函数。
2024-03-03 23:18:38
2931
1
原创 Linux: shm_xx系列函数使用详解
分离共享内存段后,如果没有其他进程仍然连接着该共享内存段,系统会释放该共享内存段,从而释放相关资源。函数是用于生成 System V IPC 键值的一个实用工具函数,可以通过指定文件路径和项目标识来确保生成唯一的键值,用于进程间通信的各种资源的创建和访问。函数时,需要注意确保对共享内存的大小和权限的设置,避免潜在的问题,比如内存溢出或者权限不足等。函数的返回值是共享内存标识符(shmid),用于后续对共享内存段的访问操作,比如连接共享内存、获得共享内存的地址等。
2024-03-01 00:31:36
3142
原创 初识 Rust 语言
自Linux 6.1起,初始的Rust基础设施被添加到Linux内核中。此后为了使内核驱动程序能够用Rust编程语言编写,Linux内核已经合并了许多其他管道和内务管理工作。随着即将到来的Linux 6.8内核周期,第一个Rust网络驱动程序将被引入。去年vivo开发者大会上发布的蓝河操作系统,也使用了Rust语言进行开发。作为一名软件开发人员,对于新技术总要保持着好奇心和不断进取的精神,过年抽空简单看了看Rust语言,在这里简单总结分享一下!
2024-02-18 23:18:59
1736
1
原创 Linux:简单聊聊线程调度
在 Linux 中,线程调度是由内核管理的过程。内核负责根据预定义的调度策略和优先级来决定哪个线程在给定的时间点运行。它的目标是提高系统的并发能力、公平性和响应性。下面是一些关于 Linux 线程调度的详细信息:调度策略SCHED_OTHER(默认):基于时间片轮转的策略,允许多个线程共享 CPU 时间。SCHED_FIFO:先进先出策略,优先级高的线程会一直运行,直到它主动放弃 CPU。SCHED_RR:基于时间片轮转的策略,优先级高的线程运行一段时间后被抢占。
2024-01-28 18:27:27
2551
1
原创 C语言:va_xx、getopt_xx、str_xx等函数
在C语言学习过程中,有些函数并不会怎么见,但是在工作以后经常会见到和使用。今天在这里和大家简单介绍一下。
2024-01-14 20:12:42
1001
原创 Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx
本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件,共同学习!/proc/kmsg是一个特殊的文件,它提供了内核消息缓冲区的访问,这个缓冲区包含了内核产生的所有消息,包括各种调试和错误信息,如内核的启动打印。/proc/kmsg文件通常只能被 root 用户或具有相应权限的用户读取。这个文件通常被用于调试和故障排除,因为它可以提供关于内核发生事件的详细信息。注意:这是一个缓冲区,所以其内的数据是会被刷新覆盖的!!!一般情况下,你可以使用以下方式来使用/proc/kmsg。
2024-01-14 19:13:08
3693
原创 Linux:NTP校时、PTP校时
在进行网络协议通信时,我们有时候需要计算通信的延迟。一般的方式就是:A端获取本地时间信息并将其填充到网络数据包中进行发送,B端收到数据包后进行解析获取到A发来的时间,然后B获取本地时间进行运算,网络延迟 = B端本地时间 - A端本地时间。NTP(Network Time Protocol)是一种用于同步计算机时间的协议。它能够确保计算机时钟与全球统一的时间标准保持同步。NTP使用一组分层的时间服务器来提供准确的时间参考。顶层的时间服务器会从原子钟或其他高精度时间源获取时间,并将它们传播到更低层的服务器。
2024-01-12 00:59:20
6283
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人