linux kernel
linux kernel 学习
Embedded-Alien
这个作者很懒,什么都没留下…
展开
-
linux printk格式化打印
=========================================How to get printk format specifiers right:Author: Randy Dunlap rdunlap@infradead.org:Author: Andrew Murray amurray@mpc-data.co.ukInteger types::If variable is of Type, use printk format specifier:-----------原创 2021-08-27 11:07:15 · 1376 阅读 · 0 评论 -
icm20608 linux驱动 regmap spi的方式读写寄存器
开发版芯片 imx6ull驱动测量了系统调用read 10000次的时间验证了开启硬件浮点和不开启硬件浮点的运算浮点数时间基本相同驱动代码#include <linux/module.h>#include <linux/spi/spi.h>#include <linux/regmap.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h&原创 2021-08-27 09:37:57 · 699 阅读 · 0 评论 -
WRITE_ONCE()
WRITE_ONCE(prev->next, new)的作用就是安全地将prev->next指向new!相当于new = prev->next原创 2021-06-18 15:54:43 · 310 阅读 · 0 评论 -
likely()和unlikely()
编程的时候根据if条件成立的概率,手动引导编译器设置cpu 的cache命中率,提高程序运行效率编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度。likely(x)代表x是逻辑真(1)的可能性比较大;unlikely(x)代表x是逻辑假(0)的可能性比较大。...原创 2021-06-18 15:44:08 · 190 阅读 · 0 评论 -
usleep_range()函数
usleep_range 用于非原子环境的睡眠,目前内核建议用这个函数替换之前udelay。其源码分析如下:void __sched usleep_range(unsigned long min, unsigned long max){ #得到最早wakeup的时间 ktime_t exp = ktime_add_us(ktime_get(), min); #计算必须要在max-min这个时间段wakeup,然后将这个时间转成nsec u64 delta = (u64)(max - min)转载 2021-06-08 18:13:03 · 10689 阅读 · 0 评论 -
区分workqueue和waitqueue
首先要区分kernel中的waitqueue和workqueue概念,这是两个不同的内核机制workqueue是利用进程上下文来处理内核中的一些小型任务,将一些复杂耗时的任务可以放到workqueue的线程中执行,节省时间waitqueue是等待队列用于使进程等待某一特定的事件发生而无需频繁的轮询,不需要执行任务的时候,让进程睡眠,等待某个条件发生,一旦条件达成,任务被唤醒,开始执行,执行完毕接着让他睡眠workqueue的demo#include <linux/init.h>#inc原创 2021-04-06 19:22:36 · 379 阅读 · 0 评论 -
kernel api汇总
参考 https://www.kernel.org/doc/htmldocs/kernel-api/原创 2021-03-24 15:11:29 · 660 阅读 · 0 评论 -
linux notifier的理解和应用
notifier主要用于内核间的各个模块的通信(通知源)子系统A进行定义初始化和回调函数的调用(被通知)子系统B进行回调函数的注册和注销当A系统发生某种事件时,就调用通知链中的所有回调函数,B系统中注册的回调函数就会得到执行。一旦执行回调函数,他会从链表头依次执行每一个回调函数,那么依次执行是依次性执行完,执行过程中任意时刻都可睡眠?这些需求也就产生了4种类型的notifier_chain。struct notifier_block { /* chain的基本单位 */ int (*noti原创 2021-03-09 19:33:53 · 948 阅读 · 0 评论 -
get_device()和put_device()函数
在linux内核中,get_device()和put_device()是一对相反的操作函数。get_device()是对设备引用数量加一,put_device()是对设备引用减一以下就是源码/** * get_device - increment reference count for device. * @dev: device. * * This simply forwards the call to kobject_get(), though * we do take care to原创 2021-03-09 11:21:47 · 3684 阅读 · 0 评论 -
rtl8723bu linux wifi驱动移植教程
rtl8723bu linux 驱动移植教程将文件rtl8723BU_WiFi_linux_v4.3.9.3_13200.20150106_BTCOEX20140929-5443.tar.gz拷贝到linux源码目录drivers/net/wireless/net/下解压tar xzvf rtl8723BU_WiFi_linux_v4.3.9.3_13200.20150106_BTCOEX20140929-5443.tar.gz更改文件名mv rtl8723BU_WiFi_linu原创 2020-12-06 13:05:24 · 3698 阅读 · 0 评论 -
linux 内核中的链表学习总结以及应用
学习过数据结构的同学们都知道链表的结构种类:单链表,双链表,循环单/双链表,这种数据结构结构简单应用很广泛,相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或者删除数据。链表的开销主要是访问的顺序性和组织链的空间损失,不适合随机存取在Linux内核中链表的应用也非常多,对链表的操作为非就是初始化,添加节点,删除节点,遍历节点...原创 2020-03-20 21:37:47 · 297 阅读 · 0 评论 -
linux内核的中断机制
**linux的中断分为上半部和下半部两部分**上半部中断不能嵌套,中断被禁止,代码要尽量短,处理一些重要的事情,通常是改变一些标志状态下半部的中断可以嵌套,有三种处理的方式:SOFTIRQTASKLETworkqueue工作队列中断顶半部函数,禁止中断,不可嵌套(通过request_irq()申请)中断处理函数是被硬件请求执行的内核代码,所以它属于中断上下文。在中断上下文中...原创 2020-03-16 15:27:48 · 254 阅读 · 0 评论 -
关于ubuntu18.04版本系统中无法挂载开发板nfs文件系统的解决办法
问题描述:我本来用的是Ubuntu16升级Ubuntu18.04之后发现之前布置在电脑中的开发板nfs文件系统挂载不了了,尝试了很多方法,修改uboot的bootargs,修改exports,都没用,文件系统的其他配置都正确,就是奶粉是用不了,用了大半天时间,还是没办法,之后上网搜索Ubuntu18.04 nfs终于在网上找到解决办法:**原因:原来是这样的:ubuntu18.04只支...原创 2020-03-16 15:26:40 · 1884 阅读 · 1 评论