12 2019 档案
阻塞与非阻塞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