[内核学习]虚拟字符设备
前面几篇把字符设备的零件拆着讲完了:read/write 的阻塞语义,等待队列,唤醒竞争.这篇把它们组装起来,写一个完整但迷你的字符设备:内核环形缓冲收数据,读端没数据可以睡,poll/epoll 挂进来,写端一脚踢醒所有人.设备叫 vchar0,不到一百...
前面几篇把字符设备的零件拆着讲完了:read/write 的阻塞语义,等待队列,唤醒竞争.这篇把它们组装起来,写一个完整但迷你的字符设备:内核环形缓冲收数据,读端没数据可以睡,poll/epoll 挂进来,写端一脚踢醒所有人.设备叫 vchar0,不到一百...
一个进程盯着几百个 fd,任何一个有动静就去处理 — select,poll,epoll 三代接口解决的都是这件事.上一篇讲阻塞时埋了伏笔,这篇把它收掉:驱动侧的 poll 回调怎么写,epoll 为什么快,水平触发和边缘触发到底差在哪.全部实测,LT 和 ET 的...
read() 打到驱动上只有两种态度:有数据就拿走,没数据要么告诉我没有(-EAGAIN),要么睡到有为止.听起来简单,但"睡得下去,醒得过来"八个字里埋着内核最经典的一类竞态,丢失唤醒.这篇把这条链拆开: O_NONBLOCK 在驱动里怎...
上一篇把设备注册出来了,这篇讲数据怎么进出:read/write 的返回值语义,copy_to_user 一族的安全职责,ioctl 命令编码,还有 mmap 零拷贝.实验模块一个设备四条通道,每条通道的边界行为都实测到,中间还有一个 f_pos 的翻车,比正文还精彩...
字符设备是驱动入门的第一课,也是大多数简单硬件的正确形态:按字节流访问,open/read/write/close.前面几篇已经零散用过 miscdevice 和 cdev,这篇把框架本身说透:设备号体系,注册流程,以及每个驱动都要跳的那支 container_of 舞.实验...
CPU 一纳秒也等不了外设,大批量数据搬运靠 DMA:设备自己读写内存,CPU 只管下命令.听起来简单,难在"设备眼中的内存"和"CPU 眼中的内存"不是一回事.这篇把 dma 地址和物理地址的关系,两种映射 API,swiotlb 和 CMA ...
现代 SoC 上,一个外设能跑起来光有寄存器远远不够:它的时钟得开着,引脚得复用成正确功能,电源域得供电,不用时还得能断电省电.这四件事分别归四个框架管:clock,pinctrl,regulator,runtime PM.这篇不写新驱动,直接把板上四个框架的实景...
驱动和硬件打交道,九成是对着一段地址读写.MMIO 这件事原理简单,坑全在细节:寄存器布局,访问属性,顺序保证.这篇从 ioremap 讲到 readl/writel,每个环节都在真硬件上验证,中间还有一个我自己翻的车,值得先看. 这篇回答几件事: ...
platform 总线是嵌入式 Linux 的主力总线:DT 里那些不挂 PCI 不挂 USB 的外设,串口,I2C 控制器,GPIO 控制器,全是 platform 设备.上一篇看了总线三角,这篇站到驱动作者这边,把 probe/remove 生命周期,配对规则,devm 资源管理一次跑通,...
/dev 下一个设备节点背后是一整套对象体系:kobject,kset,bus,device,driver,它们把内核里成千上万个设备组织成一棵树,顺便解决了热插拔通知,引用计数,设备驱动配对这些脏活.这篇写一个完整设备从代码里"生"出来,看着它在 s...