摘要:
1. RCU 1.1 RCU 背景(读写锁的问题) 1.1.1 读写锁(写独占,读共享,写锁优先级高) 读写锁是另一种实现线程间同步的方式。 读写锁的特性为:写独占,读共享;写锁优先级高 读写锁是“写模式加锁”时, 解锁前,所有尝试对该锁进行加锁(不管是读锁还是写锁)的线程都会被阻塞;–> 写独占读 阅读全文
摘要:
简介 在实际编程中,我们会经常碰到这种场景:进程P需要等待条件C的成立,才能继续执行某个动作。例如,当串口没有数据可以读取时,我们可以通过轮询的方式,等到有数据来的时候,串口程序再去读取。但是这种方式显得比较笨拙,影响CPU的性能。因此,内核中提供了等待队列的方式,即可以将进程P先挂到等待队列Q(w 阅读全文
摘要:
TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE 的区别 TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。 信号本质 信号是在软件层 阅读全文
摘要:
TTY结构体关系图 TTY设备 TTY 驱动类型如下,串口也属于TTY /* tty driver types */ #define TTY_DRIVER_TYPE_SYSTEM 0x0001 #define TTY_DRIVER_TYPE_CONSOLE 0x0002 #define TTY_DR 阅读全文
摘要:
__attribute__((alias(__stringify(A)))) 设置函数、变量的别名 #include <stdio.h> #define __stringify_1(x...) #x #define __stringify(x...) __stringify_1(x) void a( 阅读全文
摘要:
在设备树中有一个叫做aliases的节点: / { #address-cells = <1>; #size-cells = <1>; aliases { fimc0 = &fimc0; fimc1 = &fimc1; fimc2 = &fimc2; i2c0 = &i2c0; i2c1 = &i2c 阅读全文
摘要:
I2C总线 I2C总线和 platform 总线非常类似,platform 总线初始化位置如下: kernel_init(); kernel_init_freeable(); do_basic_setup(); driver_init(); platform_bus_init(); I2C总线是作为 阅读全文
摘要:
以 struct kobject 为例,讲解如何使用链表 struct list_head struct kobject { const char *name; struct list_head entry; struct kobject *parent; ... }; struct list_he 阅读全文
摘要:
open一个字符设备的流程大概是:文件路径 => inode => chrdev_open() => (kobj_lookup=>) inode.i_cdev => cdev.fops.my_chr_open()。所以只要通过VFS找到了inode,就可以找到chrdev_open(),这里我们就来 阅读全文
摘要:
struct inode Linux中一切皆文件,当我们在Linux中创建一个文件时,就会在相应的文件系统创建一个inode与之对应,文件实体和文件的inode是一一对应的,创建好一个inode会存在存储器中,第一次open就会将inode在内存中有一个备份,同一个文件被多次打开并不会产生多个ino 阅读全文