- 博客(60)
- 收藏
- 关注
原创 DFS连通域统计:岛屿数量问题及其变形
本文介绍了算法中的岛屿数量问题及其解法。题目给定一个由0(海洋)和1(陆地)组成的矩阵,要求统计不相连的岛屿数量。解题思路采用深度优先搜索(DFS):遍历矩阵,遇到1时岛屿计数加1,并通过DFS将该岛屿所有相邻1标记为0以避免重复计数。文章提供了完整C++代码,详细解析了执行流程,并讨论了代码优化方法(如处理8方向相邻)。此外,还介绍了三种变种问题:求最大岛屿面积(统计1的数量)、计算岛屿周长(统计边界接触次数)和封闭岛屿(排除边缘连接的岛屿)。这些变种只需对基础代码稍作修改即可实现。
2026-04-06 17:48:29
246
原创 DFS:带重复项的全排列,程序运行全流程解析
本文探讨了如何生成包含重复数字数组的所有不重复排列。关键点在于先对数组排序,使相同数字相邻,然后在递归过程中通过剪枝避免重复排列。具体做法是:在递归树的同一层,若当前数字与前一个相同且前一个未被使用,则跳过当前数字。文章提供了完整的C++代码实现,并通过示例[1,1,2]详细解析了递归过程,展示了如何得到[[1,1,2],[1,2,1],[2,1,1]]这三个不重复排列。这种方法确保了结果按字典序排列且无重复。
2026-04-06 14:20:19
237
原创 【算法对比】连续子区间的两种控制逻辑:Kadane和滑动窗口
本文对比了处理连续子区间的两种算法:Kadane算法与滑动窗口。Kadane算法适用于求最大连续子数组和(如"岁晚可可塔"问题),通过动态比较当前元素与之前和来选择子数组起点。滑动窗口则适用于求满足条件的最短连续子数组长度(如"内存块分配"问题),通过双指针调整窗口边界来寻找最优解。关键区别在于:Kadane能处理含负数数组,而滑动窗口需要数组具有单调性(通常为正数)。选择算法时需根据问题特征:求最大和用Kadane,求最短/最长长度用滑动窗口,含负数则必须用Kada
2026-04-04 17:04:10
322
原创 【华为机考真题】动态规划之遗迹探险家小红(含C++源码)
二维费用背包问题的动态规划解法 本文介绍了一道华为机考中的二维费用背包问题,要求在规定时间和重型宝藏数量限制下获得最大价值。题目分析指出当存在互斥约束时,贪心算法失效,必须使用动态规划穷举所有状态。 解法核心是定义二维DP数组dp[j][k]表示剩余时间j和重型名额k时的最大价值。状态转移分为普通宝藏和重型宝藏两种情况,分别更新DP数组。实现时采用逆序遍历确保每件宝藏只选一次。 文章还总结了常见动态规划问题类型,包括0-1背包、完全背包、分组背包等。这道题属于二维费用的0-1背包变种,是动态规划的经典应用场
2026-04-04 14:11:28
294
原创 【华为机考真题】贪心算法解决幻兽防御战,有时急功近利反而效果更好
场景:有 n 只怪兽正在向遗迹冲来,试图破坏遗迹,小红在防守,要尽最大的努力在遗迹被破坏之前尽可能多的消灭怪兽。规则第i只怪兽距离遗迹的初始距离为dist_i,速度为speed_i。小红每分钟只能发射一次弩箭,消灭任意一只怪兽,从第 0 分钟开始算起。也就是说刚开始小红就可以发射弩箭。第i只怪物到达遗迹需要的时间。如果在第 k 分钟准备射击时,存在某只未被消灭的怪兽,则防守失败。任务是计算在防守失败之前小红最多能消灭多少只怪物。
2026-04-04 00:29:28
406
原创 【华为机考真题】魔法相册的重复记忆 C++ 实现
摘要: 本文解决了一个魔法相册照片统计问题。题目要求统计在超过一本相册中出现的照片,并按时间戳排序输出。核心思路是使用哈希表(unordered_map)存储照片信息,键为照片id,值为包含时间戳t和出现次数count的pair。处理输入时,通过stringstream逐行读取相册数据。最后将哈希表中符合条件的记录转入动态数组,按t排序后输出。关键点包括:哈希表的高效查询、stringstream处理不定长输入、以及Lambda表达式实现自定义排序。该方案时间复杂度为O(n),能高效处理大规模数据。
2026-04-03 15:16:15
451
原创 一篇文章让你彻底区分#define和typedef
本文深入分析了C/C++中#define和typedef的本质区别与使用场景差异。#define是预处理阶段的文本替换,不进行类型检查,可能导致指针声明错误、类型不匹配等问题;typedef则是编译阶段的类型别名定义,具有严格的类型检查。主要区别体现在:1)指针连续声明时#define可能产生意外结果;2)与const结合使用时语义不同;3)作用域规则不同;4)类型检查机制差异;5)typedef更适合封装复杂类型。文章通过代码示例和编译测试详细对比了两者的特性,建议根据实际需求选择合适的类型定义方式。
2026-04-02 13:11:52
375
原创 Linux驱动:用MPU6050手把手带你入门I2C子系统(附完整源码)
本文通过MPU6050传感器实例,从i2c-tools工具使用、用户层程序开发到内核驱动编写,系统介绍了Linux I2C子系统的开发方法。首先讲解了i2c-tools常用命令(i2cdetect、i2cget、i2cset等)的实际操作,详细分析了MPU6050关键寄存器功能。然后介绍了用户态编程中的核心数据结构i2c_msg和i2c_rdwr_ioctl_data,以及/dev/i2c节点的使用方法。最后提及了内核驱动的实现思路。文章内容由浅入深,适合Linux驱动开发初学者学习参考,更多详细内容可关注
2026-04-01 17:21:07
367
原创 一篇文章彻底搞懂Linux驱动的并发控制与中断上下半部机制
本文深入探讨了嵌入式Linux驱动开发中的并发控制与中断机制。首先分析了进程上下文和中断上下文的本质区别,指出中断上下文因缺乏task_struct而禁止休眠。其次对比了自旋锁和互斥锁的核心差异,阐明了各自适用场景及死锁风险。然后介绍了中断上下半部机制,比较了Tasklet和Workqueue的特点,并指出现代内核正逐步废弃Tasklet的趋势。最后提出两个思考问题:中断处理函数中调用msleep会导致崩溃,以及自旋锁与互斥锁的适用场景差异。全文通过理论分析和实验验证,为嵌入式Linux驱动开发提供了重要指
2026-03-31 00:32:21
377
原创 深度剖析 Linux Input 子系统(3):从零写一个 Input 驱动,最详细手把手(附完整代码)
我用的板子是野火的lubancat 2,搭载RK3568芯片,如下图:我外接了一个按键和两个 LED,LED 分别为红色和蓝色。按键所接引脚通过上拉电阻拉至 VCC,另一端接地。红色 LED 正极所接引脚配置为高电平有效,初始为低电平,负极与按键共地。蓝色 LED 正极所接引脚配置为低电平有效,初始为低电平,负极与按键共地。采用设备树描述硬件引脚,利用Platform 平台总线匹配驱动,实现软硬件深度解耦。当模块加载后,此时未按下按键,蓝灯亮,红灯灭,标志着驱动成功识别硬件。
2026-03-30 15:23:13
370
原创 深度剖析Linux Input子系统(2):驱动开发流程与现代 Multi-touch 协议
本文深入解析了Linux输入子系统的多点触控处理机制。首先介绍了标准Input驱动开发流程,包括设备分配、位图配置、注册和事件上报等关键步骤。重点分析了事件同步机制(input_sync)的必要性及其实现原理。随后详细阐述了多点触控Type B协议的核心概念:Slot机制用于区分不同手指的数据,Tracking ID实现手指持久跟踪。通过分析goodix驱动源码,展示了从硬件原始数据到规范化事件上报的全过程,包括Slot切换、坐标上报和同步处理。文章最后指出内核已将数据转换为标准input_event结构,
2026-03-29 13:31:38
478
1
原创 深度剖析Linux Input子系统(1):宏观架构与核心原理
Linux输入子系统采用三层架构(驱动层、核心层、事件层)实现硬件抽象化。核心层通过input_handle连接设备(input_dev)和处理器(input_handler),支持多对多绑定。设备注册时,内核遍历处理器列表进行匹配,成功则创建handle关联双方。事件上报时,核心层校验后分发给匹配的处理器,最终通过/dev/input/eventX节点传递给用户空间。这种设计实现了硬件与应用的解耦,简化了驱动开发。
2026-03-28 13:30:07
393
原创 【Linux驱动实战】:标准的按键控制LED驱动写法
本文介绍了一个符合Linux内核规范的按键驱动实现方案,以鲁班猫2平台为例,详细讲解了从设备树配置到驱动开发的完整流程。主要内容包括: 设备树配置:通过pinctrl子系统管理GPIO引脚复用和电气特性(如上拉配置),解决了按键抖动导致的中断风暴问题。 驱动程序设计: 使用私有结构体封装所有资源 采用devm系列API自动管理资源释放 实现中断处理+定时器消抖机制 包含字符设备驱动框架 通过等待队列实现高效阻塞唤醒 关键实现细节: GPIO逻辑电平转换 中断属性绑定 内核定时器消抖 用户空间事件上报 该驱动
2026-03-27 15:27:48
387
原创 拒绝懵逼!3张图带你彻底搞懂 Linux 按键驱动
本文通过3张流程图详细解析了Linux按键驱动的工作原理与实现机制。首先介绍了驱动加载流程,包括GPIO获取、中断注册和定时器初始化;其次阐述了运行时逻辑,重点分析了中断顶半部快速处理抖动、底半部定时器稳定读取电平的设计思想;最后讲解了驱动卸载时同步删除定时器的必要性。文章以直观的流程图形式,清晰展现了按键驱动从初始化、运行到卸载的全生命周期,特别强调了中断上下半部机制在按键消抖中的关键作用,为理解Linux驱动开发提供了实践指导。
2026-03-25 13:35:27
378
原创 【Linux驱动实战】:以按键驱动入门中断子系统(附源码)
在设备树的根节点下//中断属性关联,指定中断源compatible是用来匹配驱动和硬件的。驱动代码里的必须和这个字符串完全一致,驱动才能跑起来。中,&gpio3和RK_PA7是引用了我们上一节配置好的引脚。告诉内核这个引脚是低电平有效。Linux 的GPIOD子系统会根据这个标识,自动帮我们处理逻辑取反。指定由谁来处理这个中断,这里是&gpio3,即GPIO控制器本身也是一个中断控制器。interrupts中为触发方式,这里设为下降沿触发。
2026-03-24 17:05:07
405
原创 如果操作GPIO可能导致休眠,那么同步机制绝不能采用spinlock
摘要:在操作系统中,使用自旋锁(spinlock)保护可能导致休眠的GPIO操作会引发严重问题。自旋锁会关闭CPU抢占,要求持有锁的线程快速执行完毕;而休眠会主动让出CPU控制权。当操作通过低速总线(如I2C/SPI)扩展的GPIO时,底层驱动会触发休眠。若违反规则,将导致系统陷入僵死状态或崩溃。正确的做法是:在进程上下文中使用mutex替代spinlock,区分使用gpio_set_value和gpiod_set_value_cansleep接口,中断上下文则应采用线程化中断或工作队列来处理可能休眠的操作
2026-03-23 16:16:44
323
原创 从零点亮 RK3568 的 LED:设备树,平台总线,现代gpio子系统全解析(附完整代码)
本文详细介绍了在鲁班猫2开发板上实现LED驱动的完整流程。通过设备树描述硬件信息,使用平台总线实现软硬件解耦,并采用现代GPIO子系统(gpiod)操作引脚。重点讲解了设备树节点添加、平台总线匹配机制以及gpiod接口的使用方法,最终实现用户态通过字符设备控制LED亮灭的功能。该框架可扩展至其他外设驱动开发,只需修改具体逻辑而不改变整体架构。
2026-03-22 15:38:32
576
原创 【Linux驱动实战】:字符设备之ioctl与mutex全解析
摘要 本文深入讲解Linux驱动开发中的ioctl系统调用和mutex互斥锁的使用。ioctl用于处理设备特定控制指令,如修改波特率或清空缓冲区,弥补了标准读写操作的不足。文章详细解析了ioctl命令码的组成规则(方向、数据大小、幻数和序号),并演示了如何通过宏定义生成命令码。同时,针对并发安全问题,介绍了mutex互斥锁的初始化和使用,强调解锁时机的重要性以避免死锁。通过200多行实战代码,帮助读者掌握ioctl和mutex的核心用法,适用于初学者复习和高手巩固。
2026-03-21 15:29:29
431
原创 【Linux驱动实战】:字符设备驱动之内核态与用户态数据交互
本文是《Linux 驱动实战》专栏关于字符设备驱动的第二篇文章,主要讲解如何为字符设备添加实际功能,实现用户态与内核态的数据交互。文章采用分块讲解的方式,逐步实现一个完整的字符设备驱动。主要内容包括:定义设备结构体、实现文件操作接口(open/release/read/write)、处理用户空间与内核空间的数据拷贝(copy_from_user/copy_to_user)等。最终目标是通过echo和cat命令测试设备功能,并编写用户程序验证完整的读写流程。文章强调从简单完整的示例入手,循序渐进地掌握字符设备
2026-03-20 14:33:42
324
原创 【Linux驱动实战】:初识字符设备,内核自动创建设备节点的原理
本文介绍了Linux字符设备驱动的开发入门经验,重点讲解了如何实现自动创建设备节点的方法。作者通过一个简单的字符设备驱动示例代码,展示了如何动态申请设备号、使用class_create和device_create函数自动生成设备文件,而不需要手动执行mknod命令。文章详细分析了代码结构,包括指针判错的特殊处理方式、goto语句在错误处理中的优雅应用,以及编译运行的具体步骤。实验结果表明,通过这种方法,udev守护进程能够自动在/dev目录下创建设备节点,简化了驱动开发流程。这篇文章为Linux驱动开发初学
2026-03-19 18:41:08
368
原创 【Linux驱动实战】:带参数的内核模块
本文介绍了Linux内核模块开发入门实践,通过一个带参数传递功能的模块代码(param.c)详细解析了内核开发要点。文章首先对比了内核空间printk与用户空间printf的区别,解释了__init/__exit宏的内存优化机制,重点剖析了module_param参数的实现原理及权限设置。随后演示了模块编译加载过程,验证了参数传递效果,并探索了/sys文件系统下参数文件的动态修改特性。最后指出了sudo重定向操作中的权限陷阱,为初学者提供了完整的内核模块开发实践指南。
2026-03-18 20:19:45
526
原创 【Linux驱动实战】:最简单的内核模块
本文是Linux驱动开发系列的第一篇,作者从最简单的内核模块入手,详细记录了学习过程。文章首先解释了内核模块的特点:可动态加载、控制内核大小,加载后与内核完全融合。随后提供了一个完整的"Hello World"模块代码示例,包含初始化函数、退出函数和许可证声明,并逐行解析了关键语法和头文件。重点介绍了内核日志打印函数printk的8种优先级级别。文章还展示了Makefile编写方法、交叉编译过程,以及如何在开发板上加载/卸载模块并查看日志输出。最后作者建议读者尝试不同日志级别,并预告将持
2026-03-18 16:34:43
447
原创 嵌入式 Linux 启动:设备树的加载、传递和解析全流程分析
本文分析了U-Boot启动过程中设备树加载的关键流程。主要内容包括:1)/boot目录结构解析,重点说明dtb软链接的设计作用;2)详细解读boot.cmd脚本,阐明U-Boot如何通过load命令将内核镜像、initrd和dtb文件加载到指定内存地址;3)解释重要环境变量的含义及设备树overlay机制。文章揭示了从存储介质到内存的设备树加载全过程,为理解Linux启动流程提供了技术参考。
2026-03-13 13:17:32
412
原创 进来看看你对进程虚拟内存的了解有多深?
Linux进程虚拟内存机制解析 本文深入分析了Linux内核的虚拟内存管理机制。主要内容包括: 虚拟内存布局:32位系统采用3:1分割用户/内核空间,64位系统提供128TB用户空间。内核通过高端内存机制管理大物理内存。 用户空间组成:详细解析了代码段、数据段、堆、栈等区域的特性,以及.bss段不占磁盘空间的实现原理。 内核管理机制:介绍了mm_struct核心数据结构,解释了为何同时需要VMA链表和红黑树(O(1)遍历 vs O(logN)查找)。 关键问题解答:包括写时复制导致父子进程地址相同值不同、m
2026-03-12 13:18:01
900
原创 一个初学者用 C++ 解答合并 K 个升序序列的心路历程
摘要 本文记录了作者从C语言转向C++学习过程中解决LeetCode第23题"合并K个升序链表"的心路历程。文章首先介绍了暴力解法(时间复杂度O(NK))的局限性,然后重点讲解了利用C++优先队列(priority_queue)进行优化降维的思路。详细剖析了优先队列的工作原理,包括其完整模板结构和自定义比较规则的实现方法,最终将时间复杂度优化至O(NlogK)。作者通过扑克牌的生动比喻,将抽象算法问题具象化,并分享了完整代码实现。文章最后鼓励编程初学者不要畏惧困难题目,强调扎实基础与善用
2026-03-11 22:05:57
335
原创 C++ 链表修炼指南
本文记录了C++初学者学习链表的完整过程。首先介绍了标准链表节点的定义方式,包括数据域、指针域和三种构造函数的使用,对比了C语言与C++在内存初始化上的差异。然后重点讲解了虚拟头节点的概念及其在简化链表操作边界条件处理中的重要作用,并通过LeetCode 203题展示了具体应用。最后阐述了快慢指针算法的核心思想,说明其如何高效解决寻找链表中间节点等问题。全文以清晰的代码示例和详细注释,帮助C++新手理解链表的基本操作与常见算法。
2026-03-11 17:12:43
495
原创 Leetcode第七题:用C++解决接雨水问题
摘要:本文介绍了如何计算柱子高度图中能接住的雨水量。关键在于确定每个位置的凹陷条件,即左右两边都有更高柱子时才能存水。利用双指针法,每次移动较低一侧的指针,计算当前位置的存水量(min(左最高,右最高)-当前高度),并累加到总量中。该方法高效且每个元素仅访问一次,时间复杂度为O(n)。文章还通过代码示例和逻辑分析,解释了双指针法的巧妙之处,并延伸思考了算法背后的人生哲理。
2026-03-11 10:36:36
502
原创 Leetcode第六题:用 C++ 解决三数之和
本文介绍了使用C++解决"三数之和"问题的详细思路和实现方法。作者首先分析了暴力解法(O(n³))的不足,提出排序后使用双指针的优化方案(O(n²))。文章详细讲解了代码实现中的关键点:排序预处理、固定元素遍历边界(n-2)、固定元素去重以及双指针移动策略。特别强调了处理重复三元组的技巧,包括跳过相同固定元素和双指针去重。最后分享了作者多次练习后的感悟,认为算法学习需要反复实践才能深入理解。整个解决方案通过排序预处理和双指针技术,有效降低了时间复杂度并解决了重复结果的问题。
2026-03-10 21:37:16
565
原创 Leetcode第五题:用C++解决盛最多水的容器问题
本文介绍了解决"盛最多水的容器"问题的双指针算法。给定一个表示垂线高度的数组,需要找出两条垂线,使其与x轴构成的容器能容纳最多水。关键在于面积由底边宽度和较短垂线高度决定。算法通过初始化左右指针,每次计算当前面积并更新最大值,然后移动指向较短垂线的指针。这种策略在O(n)时间内找到最优解,避免了暴力解法的O(n²)复杂度。核心思想是移动短垂线可能增大面积,而移动长垂线只会使面积减小或不变。
2026-03-10 10:55:13
766
原创 Leetcode 第四题:用C++解决移动零问题
本文介绍了一种使用双指针法解决数组零元素移动问题的高效算法。通过快慢指针的巧妙配合,在保证非零元素顺序不变的前提下,将所有零元素移动到数组末尾。文章详细阐述了算法思路,通过图示直观展示指针移动过程,并提供了优化后的C++代码实现。同时分析了相关知识点,包括swap函数原理和vector容器的内存连续性优势。这种双指针方法不仅解决了问题,还体现了算法设计中时间和空间效率的平衡,具有广泛的实际应用价值。
2026-03-09 22:27:05
598
原创 Leetcode 第三题:用C++解决最长连续序列
摘要: 题目要求在未排序的整数数组中找到最长连续序列的长度(元素可间断)。解题核心是使用哈希表去重并优化查找效率: 去重处理:通过unordered_set存储数组元素,自动过滤重复值。 序列起点判断:若元素num的前驱num-1不存在,则num为序列起点,向后遍历统计连续序列长度。 时间复杂度优化:每个元素最多被访问两次(起点探测或序列计数),确保时间复杂度为O(n)。 C++关键点: 容器选择:unordered_set适用于纯键值存储场景。 性能优化:reserve()预分配内存避免rehash开销。
2026-03-09 12:36:29
620
原创 Leetcode第二题:用 C++ 解决字母异位词分组
本文介绍了如何将字母异位词分组的问题。解题思路是将每个单词排序后作为哈希表的键,原单词作为值存储。文章详细讲解了C++实现中的关键知识点:容器嵌套、范围for循环、标准排序算法、auto关键字、预分配内存和std::move的优化使用。特别强调了哈希表中键与值的正确选择,以及如何通过排序后的字符串作为唯一标识来高效分组。最终方案时间复杂度为O(nklogk),其中n是单词数,k是单词最大长度。
2026-03-08 23:14:26
608
原创 Leetcode第一题:用C++解决两数之和问题
本文记录了作者作为C++初学者通过LeetCode"两数之和"题目的学习过程。文章首先介绍了暴力解法(双重循环)的实现,然后优化为更高效的哈希表解法(空间换时间)。重点梳理了涉及的C++核心知识点:类的基本概念与访问控制、vector动态数组操作、引用传递(&)的优势、列表初始化返回方式,以及unordered_map哈希表的应用。通过这道题目,作者深入理解了C++面向对象特性、STL容器使用和现代C++语法特性,展现了从C语言到C++的编程思维转变。
2026-03-08 15:33:42
686
原创 Debian 10 (Buster) 停止维护后,如何配置 archive 源安装软件?
摘要:本文记录了在鲁班猫板卡上安装Debian 10(Buster)系统后,因软件源过期导致无法安装nfs-common的问题及解决方法。由于Debian 10已进入EOL状态,官方将其软件源移至archive.debian.org。解决方法是修改/etc/apt/sources.list,将源地址替换为归档源"deb http://archive.debian.org/debian/ buster main non-free contrib"。这为嵌入式开发中使用旧版系统提供了实用解决
2026-03-03 14:56:00
862
原创 你对 argc 和 argv 的理解有多深?
这篇文章深入探讨了C语言中main(int argc, char *argv[])函数的参数机制。主要内容包括: 通过实验验证argv[argc]确实为NULL,这是C语言标准强制规定的设计,提供了双重保障。 分析了进程栈上的内存布局,解释了参数如何存储以及与环境变量的关系。 追溯了参数传递的根源,从Shell处理到内核执行execve()系统调用的完整流程。 展示了通过修改argv[0]实现进程伪装的实际应用,包括安全风险和正规用途。 文章从语言标准、内存模型到系统实现多个层面,揭示了命令行参数处理的底层
2026-02-24 12:26:54
995
原创 LubanCat 2烧录一个新镜像后开发环境搭建
本文详细介绍了如何搭建嵌入式开发环境,主要包括三部分配置:1)通过Windows主机的网络共享功能让开发板联网;2)配置虚拟机桥接网络并设置静态IP;3)开发板网络配置及NFS共享设置。具体步骤包括:主机WIFI共享设置、虚拟机网络桥接模式配置、开发板静态IP设置、SSH远程登录以及NFS文件系统挂载。最终实现了开发板、主机和虚拟机三者之间的网络互通,并通过NFS实现了开发板与虚拟机的文件共享。文章提供了完整的配置过程和关键命令,为嵌入式开发环境搭建提供了实用指南。
2026-02-16 14:46:13
1171
原创 【字符设备驱动】:从基础到实战(下)
本文介绍了Linux字符设备驱动的核心API及使用方法。主要内容包括:设备号管理(动态/静态申请与释放)、cdev结构体操作(初始化、添加与删除)、文件操作集合的实现要点、用户空间与内核空间数据传输API(copy_from_user/copy_to_user),以及自动创建设备节点的现代方法(class_create和device_create)。文章通过详细的函数原型说明和参数解释,为编写完整的字符设备驱动提供了技术指导,涵盖了从设备注册到用户空间交互的关键环节。
2026-02-12 14:52:18
1154
原创 【字符设备驱动】:从基础到实战(上)
本文介绍了Linux字符设备驱动的核心概念与实现框架。首先从字符设备命名的历史渊源和设计理念入手,解释了其基于字节流访问的特性。通过/dev目录下的设备文件展示了字符设备在系统中的表现形式,并对比了字符设备、块设备和网络设备的区别。重点剖析了内核中字符设备的抽象模型,详细说明了cdev和file_operations两个关键结构体的作用与成员功能。文章采用由浅入深的方式,帮助读者建立对字符设备驱动的整体认知框架,为后续深入学习和开发实践奠定基础。
2026-02-10 15:32:46
999
原创 深入浅出 Linux 内核模块,写一个内核版的 Hello World
本文介绍了Linux内核模块的开发流程。首先讲解了内核模块的定义及其在扩展内核功能中的作用,对比了用户空间与内核空间的差异。随后通过一个简单的"Hello World"内核模块示例,详细解析了模块初始化函数、退出函数、printk日志级别等核心内容。文章还提供了模块编译所需的Makefile模板,并演示了使用insmod、lsmod、rmmod等命令进行模块加载、查看和卸载的操作步骤。最后强调编写内核模块需要格外谨慎,因为错误可能导致系统崩溃。该教程为后续更复杂的驱动开发奠定了基础。
2026-02-05 13:36:58
1131
原创 【CSAPP 读书笔记】第二章:信息的表示和处理
本文深入探讨了计算机系统中信息的表示与处理机制。主要内容包括:1) 计算机使用二进制存储信息,通过十六进制提高可读性;2) 大小端法对多字节数据的存储方式影响,通过代码示例展示小端法的实际应用;3) 整数表示方法(无符号编码和补码编码)及其转换规则;4) 类型转换时可能出现的意外情况,如无符号数比较时的隐式转换问题。文章通过理论讲解和C语言代码示例,揭示了底层数据表示的奥秘,帮助读者理解计算机处理信息的本质机制。
2026-01-31 15:26:20
955
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅