阻塞与非阻塞io
摘要:等待队列 等待队列是一个双向列表,有队列头与队列节点组成。将休眠的进程挂载到等待队列节点上。wait_queque_head_t 队列头。DECLARE_W AIT_QUEUE_HEAD()宏可以作为定义并初始化等待队列头, 运行期间可以采用wait_queue_head_t my_queue定义一
阅读全文
posted @
2019-12-17 10:51
yangjunhe
DMA
摘要:基于 DMA 的硬件使用总线地址而非物理地址,总线地址是从设备角度上看到的内存地址,物理地址则是从 CPU 角度上看到的未经转换的内存地址(经过转换的为虚拟地址) 。内核提供了如下函数用于进行简单的虚拟地址/总线地址转换.unsigned long virt_to_bus(volatile void
阅读全文
posted @
2019-12-10 17:35
yangjunhe
内存映射VMA
摘要:用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现 mmap()函数,这个函数可使得用户空间能直接访问设备的物理地址。实际上,mmap()实现了这样的一个映射过程:它将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地址范围时,实际上转化为对设备的访问。mmap()必须以
阅读全文
posted @
2019-12-07 11:30
yangjunhe
per-cpu变量
摘要:PER-CPU变量为系统的每个处理器分配一个变量的副本。 声明一个变量:DEFINE_PEC_CPU(int ,my_percpu);声明一个数组 DEFINE_PER_CPU(int[3], my_percpu_array); 读取其他处理器的副本可以使用 per_cpu(var, cpu). 动
阅读全文
posted @
2019-12-06 09:21
yangjunhe
linux内存分配与io内存
摘要:系统内存分区图: 一,页分配器 void *kmalloc(size_t size, int flags); kmalloc()的底层依赖_ _get_free_pages()实现,中断处理函数、tasklet 和内核定时器等非进程上下文中不能阻塞,此时驱动应当使用 GFP_A TOMIC 标志来申
阅读全文
posted @
2019-12-05 16:22
yangjunhe
Linxu 时间管理
摘要:一, jiffies 1,get_jiffies_64 获取jiffies. HZ, 时间比较函数,time_after(a, b)等,时间转换jiffies_to_msecs();等。 2, 长延时,忙等待方式。 unsigned long j = jiffies + HZ; while(time
阅读全文
posted @
2019-12-05 14:14
yangjunhe
3次握手,
摘要:https://blog.csdn.net/hyg0811/article/details/102366854 https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652664500&idx=1&sn=5f4c1e85cf5a4c38d3a1
阅读全文
posted @
2019-12-03 13:48
yangjunhe
linux 中断
摘要:local_irq_disable()和 local_irq_enable()都只能禁止和使能本地 CPU 内的中断, 因此,并不能解决 SMP 多 CPU 引发的竞态。因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法,它适宜与自旋锁联合使用。与 local_irq_disable()不同
阅读全文
posted @
2019-11-29 10:11
yangjunhe
阅读(430)
推荐(0)
select函数详解及实例分析
摘要:https://www.xuebuyuan.com/3261729.html Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、 accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式bl
阅读全文
posted @
2019-11-19 10:24
yangjunhe
sysfs API总结
摘要:https://blog.csdn.net/qb_2008/article/details/6846412 sysfs是用于表现设备驱动模型的文件系统,它基于ramfs。要学习linux的设备驱动模型,就要先做好底层工作,总结sysfs提供给外界的API就是其中之一。sysfs文件系统中提供了四类文
阅读全文
posted @
2019-11-13 17:36
yangjunhe
VFS的核心概念:file、dentry、inode、super_block
摘要:https://blog.csdn.net/Rebecca_Chou/article/details/82712782 每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用f
阅读全文
posted @
2019-11-08 09:49
yangjunhe
设备类class理解
摘要:http://blog.chinaunix.net/uid-20729583-id-1884552.html 设备类struct class一个类是一个设备的高级视图,它抽象出低级的实现细节。例如,驱动可以见到一个SCSI磁盘或者一个ATA磁盘,在类的级别,他们都是磁盘,类允许用户空间基于它们作什么
阅读全文
posted @
2019-10-23 10:52
yangjunhe
阅读(1291)
推荐(0)
linux设备驱动程序--sysfs用户接口的使用
摘要:https://www.cnblogs.com/downey-blog/p/10501514.html 自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。 与ext系列和fat等文件系统不同的是,s
阅读全文
posted @
2019-10-18 09:52
yangjunhe
Makefile 中:= ?= += =的区别
摘要:在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为: ifdef DEFINE_VRE VRE = “Hello World!” else endif ifeq ($(OPT),define) VRE
阅读全文
posted @
2019-10-18 08:48
yangjunhe
【Linux 内核】文件系统(结构篇)
摘要:https://blog.csdn.net/wenqian1991/article/details/49557277
阅读全文
posted @
2019-10-17 17:27
yangjunhe
Linux用户空间与内核空间
摘要:https://blog.csdn.net/f22jay/article/details/7925531 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对
阅读全文
posted @
2019-10-17 15:28
yangjunhe
linux驱动笔试题总结
摘要:1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 答: -在32位架构cpu中,物理内存大小限制在4G。linux将4G内存分为两部分,0~1G为kernel使用,1~4G为用户使用;进程运行在kernel,就是运行在0-1G,进程运行在用户空间,就是运行在1-4G。 -用户
阅读全文
posted @
2019-10-17 15:00
yangjunhe
内核空间与用户空间的通信方式
摘要:1.使用API:这是最常使用的一种方式了 A.get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中。 B.put_user(x,ptr):在内核中被调用,将内核空间的变量x的数值保存到到用户空间指定地址处。 C.Copy_from_user()/copy_t
阅读全文
posted @
2019-10-17 14:46
yangjunhe
linux 内核符号
摘要:1,cat /proc/kallsysms 当前内核符号表,more /boot/system.map 内核二进制符号表。 nm vmlinux 查看内核符号列表。 nm module_name c查看模块符号列表。 2,模块参数 用户空间通过:echo -n ${value} > /sys/mod
阅读全文
posted @
2019-09-29 10:44
yangjunhe
阅读(546)
推荐(0)