
Linux内核之驱动编程
文章平均质量分 82
linux设备驱动
qxqxa
meizuo
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
nand flash位反转简析
块已被成功回收并替换为备用块,原块数据已迁移至新块,且映射表(如BBT/ABBT)已更新48。原创 2025-04-29 14:57:37 · 617 阅读 · 0 评论 -
dma_request_slave_channel_compat 与 dma_request_channel 的区别
dma_request_slave_channel_compat 内部调用 of_dma_request_slave_channel,直接解析设备树节点;dma_request_slave_channel_compat 的 compat 参数可用于支持旧版设备树或不同厂商的控制器兼容;dma_request_channel 基于 dma_cap_mask 和过滤函数动态匹配,不依赖设备树。不强制绑定主从关系,适用于内存到内存的传输(DMA_MEM_TO_MEM)或自定义主控制器场景。原创 2025-04-29 10:27:29 · 432 阅读 · 0 评论 -
详解epoll的回调机制
当文件描述符的状态发生变化时,ep_poll_callback 的调用流程如下:底层驱动程序检测到状态变化(例如数据到达、缓冲区可用等)。驱动程序调用 wake_up_interruptible 或类似函数,通知所有注册在等待队列上的回调函数。wake_up_interruptible 调用 __wake_up_common,逐个遍历等待队列中的条目。对于 epoll 注册的等待队列项,__wake_up_common 调用其回调函数 ep_poll_callback。原创 2025-04-10 10:26:13 · 743 阅读 · 0 评论 -
platform_get_resource怎么获取reg和irq的
下面是一段那paltform_device获取irq和reg的代码,platform_get_resource_byname加IORESOURCE_MEM参数获取特定名字的内存空间上面通过直接读中断属性,读出的物理中断号值加上16得出最终的irq;platform_get_irq会调用platform_get_resource来获取irq;那证明在platform_get_resource之前已经有过转换操作了,也即of_irq_get。原创 2024-12-05 11:31:00 · 794 阅读 · 0 评论 -
为什么建议使用copy_from_user
(1)无论是内核态还是用户态访问合法的用户空间地址,当虚拟地址并未建立物理地址的映射关系的时候,page fault的流程几乎一样,都会帮助我们申请物理内存并创建映射关系。所以这种情况下memcpy()和copy_{to,from}_user()是类似的(2)当内核态访问非法用户空间地址的时候,通过.fixup和__ex_table两个段的帮助尝试修复异常。这种修复异常并不是建立地址映射关系,而是修改do_page_fault()返回地址。原创 2024-11-21 11:41:31 · 985 阅读 · 0 评论 -
device_create,device_register,device_add的应用场景的区别
主要应用场景是在/dev下创建设备节点;主要是dev_t设备号,引起了device_add的设备节点创建操作。原创 2024-11-04 17:27:50 · 484 阅读 · 0 评论 -
简述linux通知链机制
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,有时需要使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。为满足这样的需求,内核实现了事件通知链机制(notification chain)。通知链只能用在各个子系统之间(当然一个子系统内部也可以使用),而不能在内核和用户空间进行事件的通知。事件通知链表是一个事件处理函数的列表,每个通知链都与某个或某些事件有关,当特定的事件发生时,就调用相应的事件通知链中的回调函数,进行相应的处理。原创 2024-07-12 16:58:11 · 609 阅读 · 0 评论 -
linux怎么创建进程
fork创建的子进程是父进程的一个完全独立的拷贝,而vfork创建的子进程是父进程的一个共享副本。使用哪个系统调用取决于具体的需求和上下文。通常情况下,应该优先选择fork,因为它更灵活、安全,并且不会带来未定义行为。而vfork则对于一些特殊场景(如在子进程中立即调用exec)可能会更加适用。原创 2023-12-16 11:20:27 · 1014 阅读 · 1 评论 -
新进程创建后,怎么执行的?
1.创建一个独立的虚拟地址空间:此处的创建虚拟地址空间并不是真正的空间,而是创建映射函数所需要的相应的数据结构,比如页表,它存着虚拟空间和物理空间的联系。2.读取可执行文件头并且建立虚拟空间与可执行文件的映射关系:当程序发生页错误时,操作系统 将从物理内存中分配一个物理页,然后将该”缺页“从磁盘中读取到内存中,再设置缺页的虚拟页和物理页的映射关系,这样程序才得以正常运行。设置缺页的虚拟页和物理页的映射关系(数据结构)是装载的核心。3.将CPU的指令寄存器设置成可执行文件的入口地址,启动运行。原创 2023-12-23 21:52:59 · 1077 阅读 · 1 评论 -
并发和竟态的基本概念
有的还允许访存的非阻塞,即如果前面一条访存指令因为缓存不命中,造成长延时的存储访问时,后面的访存指令可以先执行,以便从缓存中取数。因此,即使是从汇编上看顺序正确的指令,其执行的顺序也是不可预知的。解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问,中断屏蔽、原子操作、自旋锁、信号量、互斥体等是。这一乱序对于单核的程序执行是不可见 的,因为单个CPU在碰到依赖点(后面的指令依赖于前面指令的执行结果)的时候会等待。指令之前的内存访问完成;原创 2024-02-28 17:56:40 · 981 阅读 · 1 评论 -
cache一致性的概念和场景
Cache是由cache Line组成 它是 CPU 从内存读取的基本单位;数据在Cache和内存之间传输时,不是一个字节一个字节进行传输的,而是以缓存行(Cache Line)为单位进行传输的。不同CPU的Cache line大小可能不同,典型的CPU Cache line大小是64个字节而cache Line 是由各种标志(Tag)+ 数据块(Data Block)组成;但是怎么写呢?:如果命中,直接将数据写到cache和主存;如果没命中,直接写到主存:写到Cache line,标记为脏;原创 2024-06-25 14:52:02 · 776 阅读 · 0 评论 -
内核模块的各种概念及示例
在Linux中,所有标识为__init的函数如果直接编译进入内核,成为内核镜像的一部分,在连接的时候都会放在.init.text这个区段内--#define _ _init _ _attribute_ _ ((_ _section_ _ (".init.text")))所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数,并在初始化完成后,释放init区段(包括.init.text、.initcall.init等)的内存。原创 2024-06-20 11:28:06 · 908 阅读 · 0 评论 -
简述等待队列的概念和实例
就是创建队列头,和队列元素;然后将元素加入队列;然后让出调度器;等资源满足,就将该元素从队列移除for (;;) {break;break;schedule();内核封装了一些步骤,统一简化使用方法for (;;) {break;schedule();原创 2024-06-03 11:20:41 · 489 阅读 · 0 评论 -
linux信号机制分析
对于有通过 signal、sigaction 注册信号处理函数的信号,设定堆栈后跳转到用户态的信号处理函数开始执行,此函数返回后触发一个 sigreturn 系统调用后再次回到内核,然后恢复旧的堆栈继续运行。原创 2024-04-23 17:02:55 · 950 阅读 · 0 评论 -
驱动的阻塞与非阻塞IO
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数(ep_ptable_queue_proc),把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。原创 2024-03-27 10:28:10 · 339 阅读 · 0 评论 -
设备树配置GPIO的简单总结
和,这两章已经简单说了下gpio是怎么在linux里面工作的,说白了就是为了统一的接口,半导体厂商按照框架在自己的驱动里去在底层做的实现gpio我们一般就是指的是通用的具有输入输出高低电平的控制器,这个做的也就是gpio子系统干的事,设置方向,电平等。但是外接的io引脚,一般不光有gpio的功能,还有其他的复用功能,比如i2c,spi等;这个io怎么输入输出就取决于连接的外设的驱动,怎么定义的了;这个一般有个复用管理的控制器来选择当前跟io连接的是那种功能,当然这个也就是pinctrl的部分工作内容。原创 2023-12-03 11:32:00 · 5613 阅读 · 1 评论