![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
kernel
huangweiqing80
这个作者很懒,什么都没留下…
展开
-
设备驱动中的并发控制
现代操作系统有三大特性:中断处理、多任务处理和多核处理器(SMP)。这些特性导致当多个进程、线程或者CPU同时访问一个资源时,可能会发生错误,这些错误是操作系统运行所不允许的,这就是并发。并发是指在操作系统中,一个时间段中有几个程序正在运行,且这几个程序都是在同一个处理机上运行,但任一时刻点上只有一个程序在处理机上运行。并发容易导致竞争问题。竞争就是两个或者两个以上的新城同时访问同一个资源,从...原创 2018-10-12 18:04:28 · 273 阅读 · 0 评论 -
Linux内核之tasklet
中断下半部使用tasklet:手把手教你写Linux设备驱动—中断(二)–tasklet实现(基于友善之臂4412开发板)其实,tasklet的实现就是基于软中断的。软中断初始化函数softirq_init()中注册了两个tasklet软中断。void __init softirq_init(void){ ...... //此处注册两个软中断 open_softi...原创 2018-10-22 17:53:31 · 207 阅读 · 0 评论 -
Linux 之软中断softirq
softirq驱动开发人员一般都不会用到,到内核代码中会用到softirq机制,如在timer定时器中有用到softirq机制。。。下面我们来简单了解一下Linux中的软中断的使用。注册软中断处理函数open_softirqvoid open_softirq(int nr, void (*action) (struct softirq_action *));/** * @nr: 软中...原创 2018-10-22 16:50:13 · 2082 阅读 · 0 评论 -
Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运...转载 2018-10-22 15:07:54 · 358 阅读 · 0 评论 -
完成量
在驱动程序开发中,一种常见的情况是:一个线程需要等待另一个线程执行完某个操作后,才能继续执行。这个工作其实信号量也可以完成,但其效率比Linux中专门针对这种情况的完成量机制要差些一、完成量概述Linux中提供了一种机制,实现一个线程发送一个信号通知另一个线程开始完成某个任务,这种机制就是完成量。完成量的目的是告诉一个线程某个事件已经发生,可以在此事件基础上做你想做的另一个事件了。二、定义...原创 2018-10-17 11:39:53 · 2104 阅读 · 0 评论 -
linux内核线程
内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成,内核线程是独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。实际上,内核线程只能由其他内核线程创建,linux驱动模块中可以用kernel_threa...原创 2018-10-16 18:22:49 · 19637 阅读 · 1 评论 -
linux内核等待队列
等待队列在linux内核中有着举足轻重的作用,很多linux驱动都或多或少涉及到了等待队列。因此,对于linux内核及驱动开发者来说,掌握等待队列是必须课之一。 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。它有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待...转载 2018-10-15 17:43:23 · 286 阅读 · 0 评论 -
linux 内核 current全局变量
在内核的API里经常能够见到一个指针current,它表示的是当前的进程(如果说是一个全局变量虽然不合理,但更容易理解)linux 内核 current全局变量转载 2018-10-15 17:03:37 · 498 阅读 · 0 评论 -
Mutex 互斥锁
1、理解互斥锁?互斥锁的使用也是保持内核临界区的同步的,互斥锁可以说源于信号量,信号量设置计数器可以容许n个进程并发的访问临界区,而互斥锁不行,只能容许每次一个进程访问,也就是计数器值为1的信号量,可以这么理解。互斥锁和自旋锁有不同(显然的),互斥锁在中断处理程序中和可延迟函数中都不能使用,因为它是可以睡眠的,只能在进程上下文或者软中断上下文才能使用。struct mutex {/* 1: ...原创 2018-10-15 15:59:07 · 3018 阅读 · 1 评论 -
linux内核链表
链表有一个“头指针”变量,图中以head表示,它存放了一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包含两个部分:用户需要用的数据、下一个结点的地址。这样,head结点指向第一元素,第一个元素指向第二个元素…直到最后一个元素...原创 2018-10-15 11:11:49 · 166 阅读 · 0 评论 -
信号量
Linux中的常用信号量是锁的另一种实现机制,Linux中提供了两种信号量,一种用于内核程序中,一种用于应用程序中。这里讲解的是内核中的信号量一、信号量概述和自旋锁一样,信号量也是保护临界资源的一种有用方法。信号量只有当得到信号量时,进程或者线程才能够进入临界区,执行临界代码(down等函数后面的代码块)。信号量与自旋锁的最大不同点在于,当一个进程试图去获取一个已经锁定的信号量时,该进程不会...原创 2018-10-13 17:08:06 · 23676 阅读 · 3 评论 -
自旋锁
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/huangweiqing80/article/details/830142921.定义和初始化自旋锁一个自旋锁必须初始化才能被使用,对自旋锁的初始化可以在编译阶段通过宏来实现,初始化自旋锁可以使用宏SPIN_LOCK_UNLOCKED,这个宏表示一个没有锁定的自旋锁。在Linux中,申明定义一个自...原创 2018-10-12 18:38:00 · 274 阅读 · 0 评论 -
linux内核之工作队列
在我的文章Linux内核:软中断、tasklet中,我们已经了解了中断底半部的两种实现方式,即软中断和tasklet微线程。但是这两种方式归根结底都是采用软中断机制的,其根本上还是在中断的上下文中执行,所以这也就要求了采用这两种方式编写中断底半部,不能出现一些可能导致程序休眠或者是延迟的函数(虽然当发生中断嵌套时会生成Ksoftirq线程,但这个是不确定的,所以我们在编写程序时,还是不能采用具有休...原创 2018-10-23 15:45:45 · 1471 阅读 · 0 评论