Linux内核
Linux内核相关
QtHalcon
大学一直做嵌入式和音视频方向的开发,熟悉Linux,毕业转到了CV方向,现在在深圳从事计算机视觉的工作。
展开
-
linux内核的gpiolib学习
mach-s5pv210\mach-smdkc110.c/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */.phys_io = S3C_PA_UART & 0xfff00000,.io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc,....原创 2018-10-08 08:45:56 · 683 阅读 · 0 评论 -
互斥,同步,进程间通信和文件阻塞总结
互斥#########################中断屏蔽***********************************因为不能屏蔽其他CPU的中断,因此不能解决SMP多CPU引发的竞态,因为其他CPU也会引发竞争。因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法(换句话说,驱动中使用local_irq_disable/enable()通常意味着一个bug),它适...原创 2018-11-12 20:02:39 · 2018 阅读 · 0 评论 -
Linux设备树实战
可以学设备树的课程:https://edu.csdn.net/course/detail/9511?utm_source=blog2edu1 简单配置先配置编译:参考https://blog.csdn.net/flappy_boy/article/details/73752860参考:origen的设备树文件cp arch/arm/boot/dts/exynos4210-...原创 2018-11-04 17:03:20 · 2992 阅读 · 0 评论 -
读写自旋锁
自旋锁的衍生锁读写自旋锁(rwlock)可允许读的并发。读写自旋锁是一种比自旋锁粒度更小的锁机制,它保留了“自旋”的概念,但是在写操作方面,只能最多有1个写进程,在读操作方面,同时可以有多个读执行单元。当然,读和写也不能同时进行。1.定义和初始化读写自旋锁rwlock_t my_rwlock;rwlock_init(&my_rwlock); /* 动态初始化 */2.读锁定...原创 2018-11-11 16:52:52 · 529 阅读 · 0 评论 -
内存分配总结
kmalloc(),kzalloc***************************主要分配少量的字节,它利用了内核预先定义的缓冲池,分配和释放都很高效kzalloc:只是分配的内存预先被清零vmalloc(),vzalloc***************************可以分配到很大的的虚拟内存,但是不是连续的内存,可以解决内存碎片化页面分配**************...原创 2018-11-13 10:43:28 · 242 阅读 · 0 评论 -
顺序锁
读不必等待写写也不必等待读写与写仍然是互斥如果有写,其他写必须自旋,直到写释放了顺序锁读操作要读两次,如果两次相等就会就不会继续读,不相等就继续读。 1.获得顺序锁 void write_seqlock(seqlock_t *sl);int write_tryseqlock(seqlock_t *sl);write_seqlock_irqsave(lock, f...原创 2018-11-11 17:01:05 · 431 阅读 · 0 评论 -
设备I/O端口和I/O内存的访问
设备通常会提供一组寄存器来控制设备、读写设备和获取设备状态,即控制寄存器、数据寄存器和状态寄存器。这些寄器可能位于I/O空间中,也可能位于内存空间中。当位于I/O空间时,通常被称为I/O端口;当位于内存空间时,对应的内存空间被称为I/O内存。每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式...原创 2018-11-13 11:03:26 · 3601 阅读 · 0 评论 -
DMA
DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。 DMA通常与硬件体系结构,特别是外设的总线技术密切相关。DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间, CPU可以并发地执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,然后由CP...原创 2018-11-13 15:39:41 · 1016 阅读 · 0 评论 -
调试技巧(一):OOPS调试
当内核出现类似用户空间的Segmentation Fault时(例如内核访问一个并不存在的虚拟地址), Oops会被打印到控制台和写入内核log缓冲区。我们在globalmem.c的globalmem_read()函数中加上下面一行代码 } else { *ppos += count; ret = count; *(unsigned int *)0 = 1; /*...原创 2018-11-25 17:11:48 · 1631 阅读 · 0 评论 -
调试技巧(二):BUG_ON(), WARN_ON()和panic()
内核中有许多地方调用类似BUG()的语句,它非常像一个内核运行时的断言,意味着本来不该执行到BUG()这条语句,一旦执行即抛出Oops。 BUG()的定义为:#define BUG() do { \ printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ panic("BUG!"); \} whi...原创 2018-11-25 18:25:20 · 3457 阅读 · 0 评论 -
调试技巧(三):strace
在Linux系统中, strace是一种相当有效的跟踪工具,它的主要特点是可以被用来监视系统调用。我们不仅可以用strace调试一个新开始的程序,也可以调试一个已经在运行的程序(这意味着把strace绑定到一个已有的PID上)。对于globalmem字符设备文件,以strace方式运行如代码所示的用户空间应用程序globalmem_test,运行的结果如下: root@ubuntu:/us...原创 2018-11-25 18:48:37 · 8546 阅读 · 0 评论 -
为什么中断处理函数中不能出现阻塞
1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_struct(这点对于softirq和tasklet一样),因此真的休眠了,比如调用了会导...转载 2018-11-25 15:43:48 · 3486 阅读 · 0 评论 -
RCU机制
RCU适用于需要频繁的读取数据,而相应修改数据并不多的情景,例如在文件系统中,经常需要查找定位目录,而对目录的修改相对来说并不多,这就是RCU发挥作用的最佳场景。RCU非常适合对链表的操作主要函数:static inline void rcu_read_lock(void) //读者进入临界区rcu_dereference(p) //读者用于获取共享资源的内存区指针sta...原创 2018-11-12 19:42:51 · 2825 阅读 · 0 评论 -
软中断
软中断的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作; 下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。硬中断,软中断和信号硬中断是外部设备对CPU的中断 软中断通常是硬中断服务程序...原创 2018-11-12 16:21:30 · 276 阅读 · 0 评论 -
Linux的位图
可以参考:https://www.cnblogs.com/zpcdbky/p/5825849.html 重要宏定义:#define DYNAMIC_MINORS 64 /* like dynamic majors */#define DECLARE_BITMAP(name,bits) \ unsigned long name[BITS_TO_LONGS(bits)]#de...原创 2018-10-14 10:50:45 · 769 阅读 · 0 评论 -
Linux(内核)信号量源码解析(非系统调用)
1.信号量概述------------------------------------------------Linux中提供了两种信号量,一种用于内核程序中,一种用于应用程序中。由于这里讲解的是内核编程的知识,所以只对内核中的信号量进行详细讲述。自旋锁和信号量的区别:自旋锁:会一直检测是否可以上锁,因此当有锁可用时,自旋锁的反应快速信号量:没有锁后会进行休眠,直到有锁后被...原创 2018-10-14 17:15:00 · 1039 阅读 · 0 评论 -
Linux的自旋锁spin源码解析
1. 概述——————————————————————在Linux中提供了一些锁机制来避免竞争条件,最简单的一种就是自旋锁。引入锁的机制,是因为单独的原子操作不能满足复杂的内核设计需要。例如,当一个临界区域要在,多个函数之间来回运行时,原子操作就显得无能为力了。Linux中一般可以认为有两种锁,一种是自旋锁,另一种是信号量。这两种锁是为了解决内核中遇到的不同问题开发的。自旋锁的作...原创 2018-10-14 18:50:18 · 1255 阅读 · 0 评论 -
Linux完成量源码解析
一:概述:在驱动程序开发中,一种常见的情况是:一个线程需要等待另一个线程执行完某个操咋后,才能继续执行。前面讲的信号量其实也能够完成这种工作,但其效率比Linux中专门针对这种情况的完成量机制要差些。 Linux中提供了一种机制,实现一个线程发送一个信号通知另一个线程开始完成某个任务,这种机制就是完成量。完成量的目的是告诉一个线程某个事件已经发生,可以在此事件基础上做你想做的另...原创 2018-10-17 20:54:52 · 352 阅读 · 0 评论 -
Linux中断,时钟和延时
1 概述 ###############由于中断服务程序的执行并不存在于进程上下文中,所以要求中断服务程序的时间要尽量短。因此, Linux在中断处理中引入了顶半部和底半部分离的机制。另外,内核对时钟的处理也采用中断方式,而内核软件定时器最终依赖于时钟中断。 根据中断的来源,中断可分为内部中断和外部中断内部中断的中断源来自CPU内部(软件中断指令、溢出、除法错误等,例如,操作系...原创 2018-10-21 08:59:59 · 2297 阅读 · 1 评论 -
Linux中的IDR机制
IDR机制在Linux内核中指的就是整数ID管理机制。从实质上来讲,这就是一种将一个整数ID号和一个指针关联在一起的机制。1 IDR机制原理 ------------IDR机制适用在那些需要把某个整数和特定指针关联在一起的地方。例如,在1IC总线中,每个设备都有自己的地址,要想在总线上找到特定的设备,就必须要先发送该设备的地址。当适配器要访问总线上的IIC设备时,首先要知道它们的ID号...原创 2018-10-24 13:37:15 · 2023 阅读 · 0 评论 -
Linux的原子变量
原子变量的操作是一种不可以被打断的操作,原子操作需要硬件支持,因此是架构相关。类似于汇编的一条汇编指令,不可以被分割。两种原子变量:原子整型操作 原子位操作1 原子整型操作有时候需要共享的资源可能只是一个简单的整型数值。例如在驱动程序中,需要对包含一个count的计数器。这个计数器表示有多少个应用程序打开了设备所对应的设备文件。通常在设备驱动程序的open()函数中,将co...原创 2018-10-27 15:17:45 · 4328 阅读 · 0 评论 -
等待队列
在Linux驱动程序中,阻塞进程可以使用等待队列(Wait Queue)来实现。由于等待队列很有用,在Linux 2.0的时代,就已经引入了等待队列机制。等待队列的基本数据结构是一个双向链表,这个链表存储睡眠的进程。等待队列也与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。例如,当完成一项工作之后,才允许完成另一项工作。在内核中,等待队列是有很...原创 2018-10-27 16:55:23 · 2730 阅读 · 0 评论 -
分配内存
1 kmalloc()static __always_inline void *kmalloc(size_t size, gfp_t flags)falgs:kzalloc()同kmalloc一样,只是分配的内存预先被清零2 vmalloc()void *vmalloc(unsigned long size)可以分配到很大的的虚拟内存,但是不是连续的内存...原创 2018-10-27 19:55:19 · 330 阅读 · 0 评论 -
ARM Linux设备树
可以学设备树的课程:https://edu.csdn.net/course/detail/9511?utm_source=blog2edu1 ARM设备树DT: Device TreeFDT: Flattened DeviceTreeOF: Open Firmware(打开固件,这个前缀在后面的api中会用到)DTS : device tree soukeDTSI: dev...原创 2018-11-01 21:11:19 · 1267 阅读 · 0 评论 -
Linux的中断屏蔽
在单CPU范围内避免竞态的一种简单而有效的方法是在进入临界区之前屏蔽系统的中断,但是在驱动编程中不值得推荐,驱动通常需要考虑跨平台特点而不假定自己在单核上运行。CPU一般都具备屏蔽中断和打开中断的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程序所抢占,防止某些竞态条件的发生。优点:中断屏蔽将使得中断与进程之间的并发不再发生由于Linux内核的进程调度等操作都依赖中断来实...原创 2018-11-11 16:08:31 · 4640 阅读 · 0 评论 -
errno 的多线程问题
大多数系统调用都遵循这一过程,errno 是一个整数,可以用 perror 或 strerror 获得对应的文字描述信息。不过,也有几个特殊的系统调用,和上述使用方法存在些许差异。比如,其中有个函数会在调用之前将 errno 重置为 0,调用后,通过检查 errno 判断执行是否成功。此类函数只有非常少数的几个,使用之前,看看帮助页,就知道如何使用了。系统调用的使用规范就介绍到这里。此时,...原创 2019-09-13 20:09:41 · 941 阅读 · 0 评论