TaterLi 个人博客

fork 复制进程,execve 把它腾空重装:地址空间,代码,数据,栈,全部换掉,PID 不变.这条"进程身份延续,内容全换"的组合是 Unix 哲学的地基.这篇拿一个程序 exec 另一个程序,前后地址空间摆在一起对比,再把内核塞给新程序的&quo...

发布 0 条评论

Linux 造进程只有一个系统调用家族:clone.fork 是 clone 的特例,pthread 是 clone 的另一种特例,vfork 是历史特例.这篇把"一个 clone,几种人生"讲清楚,附两组硬数据:fork 和线程的创建成本差多少,COW 的缺页数能不能和内存...

发布 0 条评论

内核眼里的进程是一个 task_struct,几千行的大结构,身份,亲属,内存,调度,文件,信号全在里面.这篇不逐字段背书,挑最常用的几组 — 状态,PID 体系,亲缘关系 — 全部在板上现场制造现场观察:一个测试程序同时造出睡眠,僵尸,停止三种状态,...

发布 0 条评论

系统调用是用户态和内核唯一的正门:一次受控的特权级切换,带着编号和参数进门,办完事拿结果出去.1.1 讲过 EL 分层,1.3 讲过异常向量,这篇把这条路径彻底走通 — 包括真的给内核加一个自己的系统调用,从修改表到用户态调通,一步不缺. ...

发布 0 条评论

前面几篇把字符设备的零件拆着讲完了:read/write 的阻塞语义,等待队列,唤醒竞争.这篇把它们组装起来,写一个完整但迷你的字符设备:内核环形缓冲收数据,读端没数据可以睡,poll/epoll 挂进来,写端一脚踢醒所有人.设备叫 vchar0,不到一百...

发布 0 条评论

一个进程盯着几百个 fd,任何一个有动静就去处理 — select,poll,epoll 三代接口解决的都是这件事.上一篇讲阻塞时埋了伏笔,这篇把它收掉:驱动侧的 poll 回调怎么写,epoll 为什么快,水平触发和边缘触发到底差在哪.全部实测,LT 和 ET 的...

发布 0 条评论

read() 打到驱动上只有两种态度:有数据就拿走,没数据要么告诉我没有(-EAGAIN),要么睡到有为止.听起来简单,但"睡得下去,醒得过来"八个字里埋着内核最经典的一类竞态,丢失唤醒.这篇把这条链拆开: O_NONBLOCK 在驱动里怎...

发布 0 条评论

上一篇把设备注册出来了,这篇讲数据怎么进出:read/write 的返回值语义,copy_to_user 一族的安全职责,ioctl 命令编码,还有 mmap 零拷贝.实验模块一个设备四条通道,每条通道的边界行为都实测到,中间还有一个 f_pos 的翻车,比正文还精彩...

发布 0 条评论

字符设备是驱动入门的第一课,也是大多数简单硬件的正确形态:按字节流访问,open/read/write/close.前面几篇已经零散用过 miscdevice 和 cdev,这篇把框架本身说透:设备号体系,注册流程,以及每个驱动都要跳的那支 container_of 舞.实验...

发布 0 条评论

CPU 一纳秒也等不了外设,大批量数据搬运靠 DMA:设备自己读写内存,CPU 只管下命令.听起来简单,难在"设备眼中的内存"和"CPU 眼中的内存"不是一回事.这篇把 dma 地址和物理地址的关系,两种映射 API,swiotlb 和 CMA ...

发布 0 条评论