Sourcelink

写过单片机,焊过BGA,睡过实验室,炸过小电容

详解Linux内核之自旋读写锁

一. 概述 内核版本: linux4.1.15 宿主机: imx6ul 架构: armv7, arm32 没有顺序没有优先级; 读写锁功能: 当没有线程拥有写锁的时候, 允许多个线程去拥有读锁; 当有线程拥有写锁的时候, 其他线程需要等其释放锁后, 才可以去读或者写; 二. 内核代码分析 typedef struct { arch_rw...

详解Linux内核之自旋锁

一. 概述 内核版本: linux4.1.15 主机: ubuntu16.04 自旋锁是为了防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。简单的说,它允许CPU执行一个死循环等待锁,直到锁被其他CPU释放; 打个比方: 自旋锁就好比一个外卖店维护两个账本, 一个账本是记录了今天需要送的外卖的总数, 另一个账本记录了已经送了外卖的总数; 当有新的订单...

详解Linux内核之引用

一. 概述 引用计数在linux内核中大量存在, 主要用于存在性保证, 比如当线程初次打开一个文件时, 会在文件系统的散列表中创建文件节点描述符, 并将引用计数设置为1. 随后的调用者在打开同一个文件时, 不会再次创建这个文件的节点描述符, 而是简单的将文件描述符引用计数加1; 在每个线程关闭文件对象时, 会将文件节点描述符的引用计数减1, 当最后一个应用文件节点描述符的调用者在关闭文...

详解Linux内核之位操作

[TOC] 一. 概述 内核版本: linux4.1.15 宿主机: imx6ul 主机: ubuntu16.04 在Linux内核中大量使用了位操作, 这样可以减少一定的内存, 一些关于位操作的宏如下: #define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p) #define clear_bit(nr,p) ATOMIC_BI...

详解Linux内核之原子计数

一. 概述 宿主机: imx6ul 内核版本: linux-4.1.15 在多核同步的众多手段中,原子操作可以说是最基础的,但需要注意的是,单核系统(UP)同样需要原子操作,只不过多核系统(SMP)要比单核系统中的原子操作面临更多的问题。“原子(atom)”一词来自希腊语,意思是“不可分割(indivisible)”。当然,现代物理学中所说的“原子”并非是不可分割的。 stat...

详解Linux内核之syscall

一. 概述 内核版本: linux4.1.15 宿主机: imx6ul 主机: ubuntu16.04 在Linux中,用户空间是不能直接访问内核空间,系统调用是用户空间访问内核的唯一方式, 一般情况下,在应用层调用的open(), read()等函数就是一个系统调用; 当我们需要打开一个设备的时候, 通常会使用open(/dev/xxx)方式进行,通过这样一个系统调用就可...

Linux内核之中断下半部

一. 概述 在处理当前中断时,即使发生了其他中断,其他中断也不会得到处理,所以中断的处理要越快越好。 但是某些中断要做的事情稍微耗时,这时可以把中断拆分为上半部、下半部。 在上半部处理紧急的事情,在上半部的处理过程中,中断是被禁止的; 在下半部处理耗时的事情,在下半部的处理过程中,中断是使能的; 以按键中断为例, 使用requst_irq()注册一个硬件中断服务(中断上半部...

Linux内核之异步通知

一. 概述 异步通知机制:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,是一种“信号驱动的异步I/O”。 二. 应用层 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <s...

Linux内核之poll机制

一. 概述 我们在应用层经常会用poll()去”轮询”文件描述符(Linux下一切皆文件); 相对于使用read()一遍遍的去读(这样才是真的轮询), 效率会高的多; 现在结合驱动来分析下poll机制的实现; 内核版本: linux4.1.15 主机: imx6ul 二. 应用层 应用层调用poll的代码片段大致如下: struct pollfd fds[1]; fds[...

Linux内核之休眠与唤醒

一. 概述 在驱动中有当等待某件事件发生时可以使当前进程以休眠的方式进行等待,这样不会占用cpu资源; 当事件发生的时候则将其唤醒; 内核版本: linux4.1.15 主机: imx6ul 二. 等待唤醒API详解 2.1 等待方式 #define wait_event_interruptible(wq, condition) \ ({ \ int...