04 2023 档案

摘要:中断的分类 中断分为硬中断和软中断,其分类依据是实现机制,而不是触发机制,比如CPU硬中断,它是由CPU这个硬件实现的中断机制,但它的触发可以通过外部硬件(比如GPIO),软件的 INT 指令,或者CPU执行检测(访问非法地址、除法异常)。一些资料会把以上三种方式做区分,把INT n这种方式叫做软件 阅读全文
posted @ 2023-04-30 17:12 流水灯 阅读(828) 评论(0) 推荐(0) 编辑
摘要:什么是内核抢占呢? 周期性时钟中断:对于用户任务,当每个时钟中断到来后都会检查它的实际运行时间是否超过理想运行时间,或者运行队列中有没有优先级更高的进程,一般如果满足其中一个条件就会设置重新调度标志,然后在中断返回用户态的前夕发生调度,这是所谓的用户任务抢占。但是如果处于一个内核态的任务正在运行,这 阅读全文
posted @ 2023-04-29 13:58 流水灯 阅读(140) 评论(0) 推荐(0) 编辑
摘要:rw_semaphore,读写信号量 和mutex很像。保护临界区的原因是其同时有被修改和读的可能,如果这个资源只是被读永远不会修改,那也不需要保护。有这样一个场景,被保护的临界区大部分情况下都是读取操作,少数情况会被修改。如果使用mutex,假设此刻一个读者进入临界区,另外一个线程也是读取操作,那 阅读全文
posted @ 2023-04-28 22:17 流水灯 阅读(41) 评论(0) 推荐(0) 编辑
摘要:1. RCU 1.1 RCU 背景(读写锁的问题) 1.1.1 读写锁(写独占,读共享,写锁优先级高) 读写锁是另一种实现线程间同步的方式。 读写锁的特性为:写独占,读共享;写锁优先级高 读写锁是“写模式加锁”时, 解锁前,所有尝试对该锁进行加锁(不管是读锁还是写锁)的线程都会被阻塞;–> 写独占读 阅读全文
posted @ 2023-04-26 22:12 流水灯 阅读(557) 评论(0) 推荐(0) 编辑
摘要:简介 在实际编程中,我们会经常碰到这种场景:进程P需要等待条件C的成立,才能继续执行某个动作。例如,当串口没有数据可以读取时,我们可以通过轮询的方式,等到有数据来的时候,串口程序再去读取。但是这种方式显得比较笨拙,影响CPU的性能。因此,内核中提供了等待队列的方式,即可以将进程P先挂到等待队列Q(w 阅读全文
posted @ 2023-04-22 20:33 流水灯 阅读(446) 评论(0) 推荐(0) 编辑
摘要:TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE 的区别 TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。 信号本质 信号是在软件层 阅读全文
posted @ 2023-04-22 19:36 流水灯 阅读(268) 评论(0) 推荐(0) 编辑
摘要:TTY结构体关系图 TTY设备 TTY 驱动类型如下,串口也属于TTY /* tty driver types */ #define TTY_DRIVER_TYPE_SYSTEM 0x0001 #define TTY_DRIVER_TYPE_CONSOLE 0x0002 #define TTY_DR 阅读全文
posted @ 2023-04-17 20:42 流水灯 阅读(506) 评论(0) 推荐(0) 编辑
摘要:__attribute__((alias(__stringify(A)))) 设置函数、变量的别名 #include <stdio.h> #define __stringify_1(x...) #x #define __stringify(x...) __stringify_1(x) void a( 阅读全文
posted @ 2023-04-12 22:48 流水灯 阅读(511) 评论(0) 推荐(0) 编辑
摘要:在设备树中有一个叫做aliases的节点: / { #address-cells = <1>; #size-cells = <1>; aliases { fimc0 = &fimc0; fimc1 = &fimc1; fimc2 = &fimc2; i2c0 = &i2c0; i2c1 = &i2c 阅读全文
posted @ 2023-04-08 21:42 流水灯 阅读(224) 评论(0) 推荐(0) 编辑
摘要:I2C总线 I2C总线和 platform 总线非常类似,platform 总线初始化位置如下: kernel_init(); kernel_init_freeable(); do_basic_setup(); driver_init(); platform_bus_init(); I2C总线是作为 阅读全文
posted @ 2023-04-05 23:15 流水灯 阅读(342) 评论(0) 推荐(0) 编辑
摘要:以 struct kobject 为例,讲解如何使用链表 struct list_head struct kobject { const char *name; struct list_head entry; struct kobject *parent; ... }; struct list_he 阅读全文
posted @ 2023-04-02 20:29 流水灯 阅读(76) 评论(0) 推荐(0) 编辑
摘要:open一个字符设备的流程大概是:文件路径 => inode => chrdev_open() => (kobj_lookup=>) inode.i_cdev => cdev.fops.my_chr_open()。所以只要通过VFS找到了inode,就可以找到chrdev_open(),这里我们就来 阅读全文
posted @ 2023-04-01 16:26 流水灯 阅读(94) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示