- 博客(256)
- 资源 (1)
- 收藏
- 关注
原创 linux kernel源码解析之:smp系统cpu热插拔
本文分析了SMP系统中CPU热插拔流程及per-cpu slab无锁缓存机制。通过流程图展示了CPU热插拔过程,并详细解析了slab缓存的构建与析构代码实现,包括slab元数据管理和object数组回收机制。重点阐述了无锁设计在per-cpu缓存中的运用,通过多幅代码截图展示了关键数据结构的操作流程。该机制有效提升了多核环境下的内存分配性能,同时保证了CPU动态调整时的缓存一致性。
2025-12-20 11:02:41
24
原创 linux字符设备驱动
摘要:该代码实现了一个Linux字符设备驱动memdev,包含设备初始化、读写操作等功能。通过register_chrdev_region或alloc_chrdev_region分配设备号,使用cdev_init和cdev_add注册字符设备,并创建4KB的内存缓冲区。实现了open/release/read/write/llseek等文件操作接口,支持用户空间与内核空间的数据拷贝。最后通过class_create创建设备类,为udev/mdev自动创建设备节点提供支持。
2025-11-28 13:43:07
33
原创 linux kernel之proc文件系统源码解析
本文对比了新旧Linux内核中proc文件系统的数据结构差异,通过图示直观展示了架构变化。同时解析了老版本内核proc文件系统的实现源码,揭示其内部工作机制。两幅配图分别呈现了数据结构对比和源码实现细节,为理解proc文件系统的演进提供了可视化参考。
2025-11-25 16:22:52
43
原创 如何解释c指针?
本文阐明了指针的本质是编译器/链接器的抽象概念,而非CPU直接使用的机制。通过C代码示例和伪汇编分析表明:指针本质上是指导编译器生成多级寻址代码的标记——每增加一个指针层级(),编译器就自动补充一次寻址操作。CPU执行时只处理地址和数据总线上的具体数值,通过逐步访问内存地址链(如0x1000→0x2000→0x3000)最终到达目标数据。无论是读写变量还是多级指针,CPU的底层操作流程完全一致,区别仅在于编译器根据指针层级生成的寻址次数不同(0级变量1次寻址,每多1个增加1次寻址)。这揭示了高级语言指针与机
2025-11-12 10:21:53
44
原创 linux module机制
Linux内核模块文件(ko文件)是动态扩展内核功能的二进制文件,采用ELF格式存储模块代码和数据。ko文件包含关键节区如.text(代码)、.data(变量)和.modinfo(元数据)。其生成过程经过预处理、编译、汇编和链接阶段,其中链接阶段处理内核符号引用和版本控制。加载ko文件时,系统会进行签名验证、内存分配、符号解析,最后执行初始化函数完成模块激活。这种机制实现了内核功能的动态扩展和"即插即用"特性。
2025-10-30 12:15:54
66
原创 linux 大文件直接IO带来的性能提升
摘要: 通过对比常规IO与直接IO(O_DIRECT)的性能测试发现,对于大文件连续读写,绕过page buffer的直接IO显著提升速度。测试显示,10MB文件直接IO速度达8123MB/s,远超常规IO的683MB/s;500MB文件直接IO速度达8245MB/s,而常规IO仅640MB/s。直接IO通过内存对齐分配和磁盘扇区(512B)直接访问,避免了page buffer的中间处理,尤其适合确定的大文件操作。代码使用posix_memalign确保内存对齐,并对比了不同规模文件的写入效率。
2025-10-23 15:21:06
56
原创 《linux kernel 进程加载器、进程调度器源码解析》
本文分析了Linux内核中进程加载器的实现机制,以传统a.out格式为例,探讨了执行./a.out时内核如何加载程序的过程。文章详细介绍了a.out文件结构,包括代码段、数据段、BSS段等布局,并对比了现代ELF格式。同时解析了task_struct数据结构中关键字段,如内存管理边界、进程标识、权限机制(uid/euid/suid)等。通过分析内核加载可执行文件的流程,揭示了从文件系统到进程创建的系统内部工作原理,特别关注了权限切换和资源继承机制。
2025-10-10 14:34:02
768
原创 从linux0.11再探minix文件系统设计原理
之前分析过fatfs32文件系统的设计原理,顺带探讨了ext2这种使用多级bitmap级联的文件系统设计原理。本文,将会以linux kernel 0.11为基础,全面分析minix 1.0文件系统的设计原理。代码需要跳来跳去,用顺序的文字比较难描述清楚,后面再说。
2025-09-28 15:21:32
508
原创 嵌入式带屏幕设备(单片机 + lvgl,或linux + soc + qt),纯c代码生成二维码图片
二维码是一种图片编码的文件格式,文件格式比较复杂。对于android、qt、web都比较容易实现二维码,有原生或第三方的库。但是对于单片机开发,可以借助开源轻量级库来实现二维码生成。例子虽然是linux,但是是纯c,因此可以很容易编译进单片机项目中,再调用gui库例如lvgl、emwin,即可实现二维码图片的显示。
2025-09-28 10:19:02
413
原创 从RTC时钟问题,引入CAS无锁化
本文通过实验室加锁的类比,解释了CAS(Compare-And-Swap)无锁技术的原理和优势。传统加锁方式会带来额外开销,而CAS通过"君子约定"和状态检测实现了无锁并发控制。文章提供了两个Go语言示例:1)使用atomic包实现的无锁计数器,10个goroutine各递增100万次;2)基于指针原子操作实现的无锁队列,详细展示了Enqueue和Dequeue的CAS操作流程。这些实现避免了锁竞争带来的性能损耗,通过重试机制保证线程安全,适用于高并发场景。
2025-09-25 15:22:01
573
原创 RTC时钟芯片读取时间不准?以为是RTC芯片或晶振的问题?
摘要:RTC时钟芯片读取存在时间误差问题,常见原因是程序员未正确处理时间进位。典型错误代码直接读取各时间寄存器,可能在读取过程中发生进位导致数据不一致。Linux内核采用双重读取机制:先完整读取时间数据,再验证秒值是否变化,若变化则重新读取,确保获取同一时间点的一致性数据。这种原子性操作避免了因进位导致的时间读取错误,解决了小概率但量产致命的时间误差问题。
2025-09-25 14:31:15
371
原创 定时器设计之->分级时间轮
文章摘要:介绍了定时器的多种实现方案,包括Linux定时器API、编程语言级定时器、红黑树和时间轮等,重点分析了分级时间轮模型。通过Go语言代码展示了时间轮的具体实现,包含任务创建、取消、层级迁移等核心功能。时间轮采用环形双向链表结构,支持多级扩展,适用于不同规模的定时任务场景(从200到10万级),具有动态修改和精确调度的特点。代码实现了任务取消、多级时间轮协作等关键机制,并提供了性能监控接口。
2025-09-01 18:41:47
443
原创 论,物联网日志系统架构如何设计?
本文描述了一个物联网日志系统的双引擎存储架构。系统采用MongoDB存储用户行为日志、设备元数据和用户配置,使用Elasticsearch存储应用系统日志和设备状态数据。架构包含设备层(4G终端和执行器)、通信层(MQTT服务)、服务层(REST API和日志服务)、数据存储层(MongoDB分片集群和Elasticsearch集群)以及分析层(Kibana和Grafana)。MongoDB采用分片副本集群架构,包含多个分片副本集和配置服务器,通过mongos路由器处理客户端请求。该设计实现了设备数据采集、
2025-08-14 13:54:18
397
原创 linux c实现协程
makecontext(ucontext_t *ucp, void (*func)(), int argc, …swapcontext(ucontext_t *oucp, const ucontext_t *ucp):保存当前上下文到 oucp,然后恢复 ucp 上下文。setcontext(const ucontext_t *ucp):恢复 ucp 所保存的上下文并继续执行。getcontext(ucontext_t *ucp):获取当前执行上下文并存储到 ucp 中。
2025-07-01 11:07:35
532
1
原创 hex、json、cbor、protobuf编码压缩率对比
protobuf: 1.2倍长度 适用于网络游戏,坏处是强耦合性(app和服务器需要随时保持同步,同过.proto文件存储位置元数据)json解析时是通过特殊符号," ’ { } [] 的匹配,来确定key:value,是位置无关编码,可读性最强,但是特殊符合过多。坏处是json序列化之后的数据长度,是十六进制t l v格式的3~4倍。在嵌入式行业,有大量的工程师在使用header type value value crc这种十六进制的编码协议。这种协议的好处是数据紧凑,数据量小。
2025-06-13 15:18:28
504
原创 LRU 和 DiskLRU实现相册缓存器
我是写Linux后端的(golang、c++、py),缓存算法指的是内存里面的lru,没有用内存lru与disklru结合的场景需求。近段时间研究android开发,里面有一些设计思想值得后端学习。经过缓存的图片从内存或文件加载,速度快了很多。为了简化测试,用Python编程语言实现。看到了android开发里面的一个片段。
2025-06-06 19:46:18
730
原创 PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别
rx是响应式编程框架的集大成者,相当于应用内部的轻量级的ASMQ(高级消息队列),前端是ui和逻辑分离的特点,需要大量的数据双向多层传递。用rx可以从出发点直达终点,数据不需要层层传递,比如说原来的传递路径是6层,你修改一次数据类,你就需要修改6个地方的代码,用rx只需要修改前后紧挨着的2个数据管道之间的代码。中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。只关心最终结果的场景(如计算完成后的结果)。
2025-06-05 11:56:38
1039
原创 android与Qt类比
通过这种类比,可快速将 Android 的列表开发思维迁移到 Qt 的模型 - 视图体系中,核心差异在于 Qt 的模型与视图解耦更彻底,数据操作通过索引间接完成,而 Android 的 Adapter 直接管理视图单元的创建和绑定。
2025-06-04 10:59:11
519
原创 golang 柯里化(Currying)
使用场景:参数在语义上属于不同组,Go 语法无法在单次调用中声明多组可变参数,通过柯里化可以实现分步接收参数。有的参数是在不同时间段产生,使用Currying可以让函数记住(缓存)参数,避免应用代码去手工管理缓存的参数。
2025-05-28 14:21:33
420
原创 双重检查锁定(Double-Checked Locking)机制
线程 A 释放锁,线程 B 获得锁,进入同步块后发现 instance 已经被创建,不执行实例化操作。线程 A 和 B 都通过了第一次 instance == null 检查,进入同步块前。线程 A 先获得锁,进入同步块,再次检查 instance == null,创建实例。后续所有线程都不会进入同步块,直接返回已创建的实例。
2025-05-24 11:33:13
230
原创 fatfs文件系统设计原理
3)应用层,与进程结合的文件(每个进程有一个数组,存放打开的文件列表)2)内存里面,与操作系统结合的文件接口vfs、存储驱动接口。1)磁盘里面,带格式的文件。
2025-04-25 14:40:21
370
原创 microPython(合宇ESP32-C3开发板)实现24c02的跨页写入、读取
esp32-c3 使用microPython实现at24c02的单字节写、单字节读、连续写(跨页)、连续读(跨页)
2025-03-25 16:19:05
379
原创 github提交不上去,网络超时问题解决
编辑hosts文件,不存在则创建,不要带任何缀名,文件名就叫hosts,可以用git bash命令创建文件:touch hosts。DNS服务器数据不同步,github的服务器发送迁移,在本地缓存的ip地址现在无效了。按照上述操作之后,git push就正常了。
2024-12-31 17:44:45
967
原创 golang自定义MarshalJSON、UnmarshalJSON 原理和技巧
当一个类型实现了encoding/json包中的json.Marshaler接口的MarshalJSON方法时,json.Marshal函数就会调用这个自定义的MarshalJSON方法来进行 JSON 序列化。好的解决办法是:限定拷贝的数据范围,将需要特殊处理的时间戳,单独封装在一个结构体里面。但是引入了新的问题: 对象多拷贝一次,当数据量比较大,api调用比较频繁的时候,浪费cpu时间。问题出现的原因:在前后端分离的项目中,经常出现的问题是时间戳格式的问题。前端由于各种原因,日期格式不完善。
2024-12-21 15:23:33
962
2
原创 《国产单片机,soc的一些现实问题》
在一堆芯片面前,八九不离十,盯着价格最低的那个芯片就不走了,就像一只饥肠辘辘的狗,看到了一块肉。不是电子信息专业的,去搞嵌入式,就会盯着某个芯片、元器件的价格死磕到底,导致研发失败,或用其他地方十几倍的潜在成本,来弥补老板节省下的那一个物料的成本。做嵌入式,是一个系统性的工作,你的成本构成由:采购、研发、测试、销售、售后、机会成本。很多老板,pm,认知水平之低,目光之肤浅,令人发指难以想象,这些吊毛是怎么混到现在的。当然,stm32也不是完全ok,曾经也出现过iic问题,某款芯片功耗大的问题。
2024-12-17 10:00:40
772
原创 android studio 模拟器不能联网?
在下一次关机之前,android studio里面的模拟器就可以上网了。.关闭所有AVD设备实例。
2024-12-10 14:13:11
1285
1
原创 linux c串口应用编程,参照golang里面的json.Marshal/json.Unmarshal
protocol.c 代码,实现二进制流序列化、反序列化。
2024-11-29 09:39:22
430
1
原创 《设计一款蓝牙热敏打印机》
安卓apk用java + kotlin编写、上位机用Qt编写。主控芯片用易兆威蓝牙ic,通讯接口:蓝牙、串口、usb。
2024-05-06 10:37:06
628
1
原创 Android Studio控制台输出中文乱码问题
1.找到studio的安装目录下的studio64.exe.vmoptions启动配置文件;2.打开文件,最后一行添加 -Dfile.encoding=UTF-8;3.重启android studio;
2024-03-28 21:40:23
3439
2
原创 《一个电子工程师的12年》
redis、mysql、sqlite、kafka、zeromq、mongodb、http/https、rest api、mqtt、thread pool、go routine等等,陷入了复杂重复的循环中,中间,我见过形形色色的人,有的很傻,有的很自私,有的很狭隘,有的很极端,有的很要面子,有的很无耻,有的很卑鄙,有的人能当着你的面出尔反尔,这些人的所作所为有适合能惊掉你的下巴……2012年专科毕业,单片机没有学会,keil也不熟悉,protel 99se不熟悉,烙铁不熟悉,就突然毕业了。
2024-02-29 00:06:40
230
原创 boost正负压电路设计和原理分析
如图所示,为模拟电子电路中的Boost电路,可同时提供正压、负压。虽经打板实测,但不可用于商业目的,否则后果自负。
2024-02-04 14:27:23
2123
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅