LINUX驱动
放狼的爷们
阳光 儒雅 博学 勤思 死宅
展开
-
Linux中的各种锁
在Linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、semaphore(信号量)等。并且它们几乎都有对应的rw_XXX(读写锁),以便在能够区分读与写的情况下,让读操作相互不互斥(读写、写写依然互斥)。而seqlock和rcu应该可以不算在经典之列,它们是两种比较有意思的同步机制。转载 2017-06-08 23:53:44 · 284 阅读 · 0 评论 -
LINUX将制定的线程号、进程号绑定到指定CPU核上
考虑到大量并发,很多线程频繁调度的场景下,linux系统的性能会下降,那么关键的线程得不到及时调度,就会产生问题。为了保证关键的线程能够及时调度,可以使用把线程、进程,绑定到指定的CPU核上面,避免不停多核之间调度。coolshell最新的文章《性能调优攻略》在“多核CPU调优”章节,提到“我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地转载 2017-08-21 23:52:22 · 1782 阅读 · 0 评论 -
自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
转自:http://blog.csdn.net/wh_19910525/article/details/11536279 自旋锁的初衷:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。单处理器的自旋锁:首先,自旋锁的目的如果在系统不支持内转载 2017-08-22 23:41:07 · 1882 阅读 · 0 评论 -
gprof使用介绍-优化程序性能
gprof1.1 简介gprof实际上只是一个用于读取profile结果文件的工具。gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集每个函数的被调用情况和被调用次数;也使用采样方法,在运行时按一定间隔去检查程序计数器并在分析时找出程序计数器对应的函数来统计函数占用的时间。 Gprof具有以下优缺点: 1) 优转载 2017-11-06 00:10:26 · 672 阅读 · 1 评论 -
oprofile性能分析优化程序
转载:http://www.cnblogs.com/bangerlee/archive/2012/08/30/2659435.htmloprofile利用cpu硬件层面提供的性能计数器(performance counter),通过计数采样,帮助我们从进程、函数、代码层面找出占用cpu的"罪魁祸首"。下面我们通过实例,了解oprofile的具体使用方法。 常用命令使用oprof转载 2017-11-06 00:14:45 · 329 阅读 · 0 评论 -
linux中高端内存和低端内存的理解
高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑。实际上这个概念比较简单,理解这个概念,需要追溯一下Linux的内存管理。 从前,CPU的地址总线只有32位。32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间,在物理上理论上最多拥有 4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间。为了合理的利用4G空间,转载 2018-01-04 00:13:28 · 3697 阅读 · 0 评论 -
kmap映射高端内存
作者:唐浩然链接:https://www.zhihu.com/question/30338816/answer/49056599来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。Kmalloc 分配的内存在上图的Direct Memory region区域,这区域的个大小为896M,且与物理内存的关系是直接的线性映射, 即0xC0000000转载 2018-01-04 00:42:37 · 670 阅读 · 0 评论 -
linux mmap内存映射文件的理解
利用ioremap访问硬件,需要经过两次拷贝1.明确:不管是在用户空间还是在内核空间,软件一律不能去直接访问设备的物理地址;2.在内核驱动中如果要访问设备的物理地址,需要利用ioremap将设备的物理地址映射到内核虚拟地址上(动态内存映射区),以后驱动程序访问这个内核虚拟地址就是在间接得访问设备的物理地址(MMU,TLB,TTW)3.如果用户要访问硬件设备,不能直接转载 2018-01-04 00:51:12 · 1804 阅读 · 0 评论 -
Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一 概念说明在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程转载 2018-01-29 23:47:27 · 166 阅读 · 0 评论 -
linux驱动链表的使用
链表的原理还比较经典。http://www.cnblogs.com/Anker/p/3472271.htmlhttp://www.cnblogs.com/SuperXJ/archive/2010/01/02/1637976.html转载 2017-08-04 23:45:49 · 500 阅读 · 0 评论 -
中断后半段处理,tasklet使用机制与工作队列
在编写设备驱动时, tasklet 机制是一种比较常见的机制,通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成。 为了最大程度的避免中断处理时间过长而导致中断丢失,有时候我们需要把一些在中断处理中不是非常紧急的任务放在后面执行,而让中断处理程序尽快返回。在老版本的 linux 中通常将中断处理分为 top half handler 、 bottom half h转载 2017-07-09 19:58:48 · 468 阅读 · 0 评论 -
linux驱动 并发策略
访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁、信号量等。互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。信号量:在Liunx中的信号量是一种睡眠锁。假如进程A先持有信号量F,然后进程B试图获取已经被进程A持有的信号量F时(假如信号量F资源值为1),信号量会将B进程推入等待队列,然后让 其睡眠。当持有信号量的进程转载 2017-07-10 23:44:06 · 315 阅读 · 1 评论 -
linux驱动 内存池的机制和使用
内存池(memory pool)是Linux 2.6的一个新特性。内核中有些地方的内存分配是不允许失败的。为了确保这种情况下的成功分配,内核开发者建立了一种称为内存池的抽象。内存池其实就是某种形式的后备高速缓存,它试图始终保存空闲的内存,以便在紧急状态下使用。下边是内存池对象的类型: typedef struct mempool_s { spinlock_t lock转载 2017-07-12 23:56:41 · 500 阅读 · 0 评论 -
linux同步机制之wait_event和wake_up
关于 wait_event_interruptible() 和 wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue 队列中转载 2017-07-09 15:40:08 · 996 阅读 · 0 评论 -
linux同步机制之信号量down 和up
Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干。 信号量在创建时需要设置一个初始值,表示同时能有几个任务能访问该信号量保护的共享资源,初始值为1就变成互斥锁(Mutex),即同时只能有一个任务能访问信号量保护的共享资源。 一个任务要想访问共享资源,首先必须得转载 2017-07-09 15:49:07 · 916 阅读 · 0 评论 -
互斥锁和自旋锁的区别
自旋锁(Spin lock)自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:1、自旋锁一直占用CPU,他在未获得锁的情况转载 2017-07-09 16:02:19 · 739 阅读 · 0 评论 -
linux睡眠和唤醒的一个例子
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它可以被转载 2017-07-30 18:19:29 · 3543 阅读 · 0 评论 -
进程上下文和中断上下文的含义
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬件运行于内核空间转载 2017-07-28 03:04:40 · 545 阅读 · 0 评论 -
kmalloc/kfree,vmalloc/vfree函数用法和区别
1.kmalloc1>kmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零.tiger说明:在用kmalloc申请函数后,要对起清零用memset()函数对申请的内存进行清零。> 2>kamlloc函数原型:#includeLinux/slab.h>Void *kmalloc(size_t size, int flags)转载 2017-07-12 00:02:54 · 859 阅读 · 0 评论 -
Linux驱动开发需要注意的点/KO大小/内存管理
因为做了大量调试的工作,呵呵,所以对代码质量要求比较高。1.不要想不通就写代码,不要为了存粹的解决问题而加代码,不要忽视任何一种场景可能,因为躲得了一时,躲不了一波,BUG迟早会被挖出来的,到时候更加苦逼。2.内存是个很严肃的问题,不要直接调用系统函数,最好把malloc、kmalloc、kzalloc、vmalloc封装一层,入参module ID,size,name,统计好申请的内存,可以用p...原创 2018-03-01 23:44:36 · 1732 阅读 · 0 评论