首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核内核的那点事

Linux设备驱动,我们必须要解决的一个问题是:多个进程对共享资源的并发访问,并发的访问会导致竞态。 1、并发和竞态 并发(Concurrency):指的是多个执行单元同时、并行的被执行。...常见的互斥机制包括:中断屏蔽,原子操作,自旋,信号量,互斥体等。...再去访问该指令之后的访存动作 DSB(数据同步屏障),保证在该指令前的所有访存指令执行完毕(访存,缓存,跳转预测,TLB维护等)完成 ISB(指令同步屏障),Flush流水线,保证所有在ISB之后执行的指令都是从缓存或者内存获得...3.2.2 单CPU内部 在单CPU,我们常遇到访问外设寄存器时,某些外设寄存器就对读写顺序有很高的要求,为了避免执行乱序的发生,这时候就需要CPU的一些内存屏障指令了。...4、总结 由上文可知,为了解决 并发导致的竞态问题 高性能的编译器编译乱序问题 高性能的CPU带来的执行乱序问题 CPU和ARM处理器提供的内存屏障指令等,这也是内核存在的意义。

22020

Linux内核28-自旋

对于概念,我相信大家已经不陌生了,不论是实时嵌入式系统还是服务器上的操作系统,都使用了这个概念。所以对于的理解就不再赘述了。 自旋是设计用来在多核系统工作的一种特殊。...如果内核控制路径发现自旋空闲,则申请加锁然后执行。相反,如果发现已经被其它CPU上的内核控制路径占用,它就会一直自旋,就是在循环查看是否已经释放,直到该被释放。...自旋的自旋过程就是一个忙等待的过程。也就是说,正在等待的内核控制路径正在浪费时间,因为什么也不干。...2 自旋结构实现 Linux内核系统,自旋spinlock_t的实现主要使用了raw_spinlock_t结构,这个结构的实现,参考下面的代码: typedef struct raw_spinlock...raw_lock 表示自旋的状态,依赖于具体的架构实现。 break_lock 标志着进程正在忙等待(仅当内核同时支持SMP和内核抢占时才会出现)。 接下来,我们分析加锁的流程。

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux内核--自旋的理解

    所以在SMP系统,自旋的实现是完整的本来面目。但是对于UP系统,自旋可以说是SMP版本的阉割版。因为只有在SMP系统的自旋才需要真正“自旋”。...在Linux内核,自旋通常用于包含内核数据结构的操作,你可以看到在许多内核数据结构中都嵌入有spinlock,这些大部分就是用于保证它自身被操作的原子性,在操作这样的结构体时都经历这样的过程:上锁-...相反,如果内核控制路径发现由运行在另一个CPU上的内核控制路径“着”,就在原地“旋转”,反复执行一条紧凑的循环检测指令,直到被释放。...但是如果你保证没有中断代码会访问临界区,那么使用不带中断禁用的自旋API即可。 2、内核抢占(仅存在于可抢占内核) 在2.6以后的内核,支持内核抢占,并且是可配置的。...四、自旋操作组成 根据上的介绍,我们很容易知道自旋的组成: 中断控制(仅在中断代码可能访问临界区时需要) 抢占控制(仅存在于可抢占内核需要) 自旋标志控制 (仅SMP系统需要) 中断控制是按代码访问临界区的不同而在编程时选用不同的变体

    1.5K20

    Linux内核的各种:信号量互斥读写原子自旋内存屏障等

    使用实例如下: #include // 定义自旋 spinlock_t my_lock; void my_function(void) { spin_lock...(&my_lock); // 访问共享资源的操作 spin_unlock(&my_lock); } 互斥,要是当前线程没拿到,就会出让CPU;而自旋,要是当前线程没有拿到,当前线程在...而互斥则不是,前面说互斥加锁失败,线程会出让CPU,这个过程其实是由内核来完成线程切换的,因此加锁失败时,1)首先从用户态切换至内核态,内核会把线程的状态从「运行」状态设置为「睡眠」状态,然后把 CPU...这个过程,不仅有用户态到内核态的切换开销,还有两次线程上下文切换的开销。 线程的上下文切换主要是线程栈、寄存器、线程局部变量等。...为了支持内核抢占,内核引入了preempt_count字段,该计数初始值为0,每当使用时+1,释放时-1。

    1K10

    边缘计算技术主要有哪几种?如何应用在实际场景

    边缘计算是一种新的计算架构,它将计算资源移动到靠近终端用户的边缘设备,以实现更快、更可靠、更安全的数据传输和处理。...边缘AI智能拥有很多优势,并且也已经成为当前发展趋势,我们也推出了边缘AI计算硬件——智能分析网关,它能对监控视频流的人、车、物、行为等进行智能检测与分析,对异常情况进行抓拍、记录并告警。...4)自动驾驶:边缘计算可以将车辆传感器数据处理从云端转移到车载计算机,在实时控制和机器学习领域发挥重要作用,提高汽车自动化和安全性。...可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能,能应用在智慧安监、工地、工厂、校园、社区、园区、能源矿山、消防、物流仓储等场景

    1.1K20

    Linux内核30-读写自旋

    1 读/写自旋概念 自旋解决了多核系统在内核抢占模式下的数据共享问题。但是,这样的自旋一次只能一个内核控制路径使用,这严重影响了系统的并发性能。...为此,Linux内核提出了读/写自旋的概念。也就是说,没有内核控制路径修改共享数据的时候,多个内核控制路径可以同时读取它。...如果有内核控制路径想要修改这个数据结构,它就请求读/写自旋的写自旋,独占访问这个资源。这大大提高了系统的并发性能。...(2)将这条指令的执行结果写入到tmp2变量,将tmp的值写入到rw->lock地址处。 (3)如果tmp是负值,说明已经被占有,则执行wfe指令,进入低功耗待机模式。...成员break_lock 对于另一个成员break_lock来说,同自旋数据结构的成员一样,标志的状态。 rwlock_init宏初始化读写的lock成员。

    1.4K20

    【深入理解Linux内核】| 中断屏蔽

    Linux内核】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU的中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...弊端在于: Linux内核,除了系统进程调度依赖中断,还有一些异步I/O等众多操作都依赖中断,因此长时间屏蔽中断是很危险的,会对系统造成严重影响,因此也要求临界区代码要简短。...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...相关实现: mrs %0 IRQMASK_REG_NAME_R:mrs指令将由IRQMASK_REG_NAME_R宏指定的IRQMASK寄存器的值移动到flags变量。...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现

    65020

    驱动开发:内核的自旋结构

    提到自旋那就必须要说链表,在上一篇《驱动开发:内核的链表与结构体》文章简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解自旋的简单应用,自旋是为了解决内核链表读写时存在线程同步问题...,解决多线程同步问题必须要用,通常使用自旋,自旋内核中提供的一种高IRQL,用同步以及独占的方式访问某个资源。...,解决多线程同步问题必须要用,通常使用自旋,自旋内核中提供的一种高IRQL,用同步以及独占的方式访问某个资源。...NonPagedPoolExecute, sizeof(pMyStruct));// 赋值testA->x = 100;testA->y = 200;testB->x = 1000;testB->y = 2000;// 向全局链表插入数据...my_list_header, (PLIST_ENTRY)&testB->lpListEntry, &my_list_lock);}function_ins();// 移除节点A并放入到remove_entryPLIST_ENTRY

    29020

    驱动开发:内核的自旋结构

    提到自旋那就必须要说链表,在上一篇《驱动开发:内核的链表与结构体》文章简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解自旋的简单应用,自旋是为了解决内核链表读写时存在线程同步问题...,解决多线程同步问题必须要用,通常使用自旋,自旋内核中提供的一种高IRQL,用同步以及独占的方式访问某个资源。...,解决多线程同步问题必须要用,通常使用自旋,自旋内核中提供的一种高IRQL,用同步以及独占的方式访问某个资源。...pMyStruct)); // 赋值 testA->x = 100; testA->y = 200; testB->x = 1000; testB->y = 2000; // 向全局链表插入数据...my_list_header, (PLIST_ENTRY)&testB->lpListEntry, &my_list_lock); } function_ins(); // 移除节点A并放入到remove_entry

    33410

    Linux系统面试题

    Linux 主要有哪几种内核Linux 内核的同步机制是什么?...只有在内核空间才存在高端内存。用户进程最多只可以访问3G物理内存,而内核进程可以访问所有物理内存。目前现实,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。...进程间通信主要有哪几种方式?管道:两个进程需要有共同的祖先,pipe/popen 命名管道:两个进程可以无关 信号 消息队列 共享内存 信号量 套接字8. 伙伴系统申请内存的函数有哪些?...在支持并使能 MMU 的系统Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式?都运行在虚拟地址模式,页表转换对应由硬件单元MMU完成。12....TLB 缓存的是什么内容translation lookaside buffer, 也叫快表,用作页表缓冲。记录虚拟地址和物理地址的对应关系,用于加快地址转换。18. Linux 中有哪几种设备?

    1.7K44

    Linux内核编程--进程控制,线程控制,机制

    vfork与fork的区别是,vfork并不将父进程的地址空间完全复制到子进程。 vfork创建子进程后,子进程先运行,子进程调用exec或exit后,父进程再开始被调度运行。...system函数在系统的实现:system函数执行时,会调用fork、execve、waitpid等函数。...否则,返回错误编号 进程的主线程由exec执行后创建,其余的线程由pthread_create创建。 如果新线程创建成功,其线程ID可以通过tid指针返回。...线程场景可以使用pthread_join将一个线程挂起以等待另一个线程结束并获得它的退出状态。 被等待的线程的退出状态将存放到status指针指向的位置。...自旋和互斥的区别是,自旋机制在获得之前会一直忙等,而不会让线程因为阻塞而休眠。

    1.1K20

    Linux面试专题

    Linux面试专题 1 Linux主要有哪几种内核? Linux 的同步机制不断发展完善。从最初的原子操作,到后来的信号量,从大内核到今天的自旋。...这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡; 伴随着从非抢占内核到抢占内核的过度。Linux机制越来越有效,也越来越复杂。 Linux内核主要是自旋和信号量。...要是未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋可以在任何时刻防止多于一个的执行线程同时进入临界区。 Linux 的信号量是一种睡眠。...Linux 内核的同步机制:原子操作、信号量、读写信号量和自旋的API,另外一些同步机制,包括大内核、读写、大读者、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序...TLB,页表缓存,当线性地址被第一次转换成物理地址的时候,将线性地址和物理地址的对应放到TLB,用于下次访问这个线性地址时,加快转换速度。 18) Linux 中有哪几种设备? 字符设备和块设备。

    12110

    Linux内核container_of函数详解

    Linux 内核,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_structLinux 内核中有一个大名鼎鼎的宏container_of...我们先来看看它在内核是怎样定义的。 ? 我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。...因此,上述代码的作用是首先使用typeof获取结构体成员j的类型为int,然后顶一个int指针类型的临时变量__mptr,并将结构体变量的成员的地址赋给临时变量__mptr。...(struct test *)((char *)__mptr - offsetof(struct test,j)); 接着我们来看一下offsetof(struct test,j),他在内核如下定义...在回首一下它: (struct test *)((char *)__mptr - offsetof(struct test,j)); linux内核随随便便一个宏就有如此精妙 请输入正文

    2.1K90

    浅墨: 聊聊Linux IO()——Linux内核的IO栈

    接上一篇浅墨: 聊聊Linux IO(上),先上一张全貌图[4]: ?...由图可见,从系统调用的接口再往下,Linux下的IO栈致大致有三个层次: 文件系统层,以 write(2) 为例,内核拷贝了write(2)参数指定的用户态数据到文件系统Cache,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间的交互 结合这个图,想想Linux系统编程里用到的Buffered IO、mmap(2)、Direct IO,这些机制怎么和Linux IO栈联系起来呢...假设要去读一个冷文件(Cache不存在),open(2)打开文件内核后建立了一系列的数据结构,接下来调用read(2),到达文件系统这一层,发现Page Cache不存在该位置的磁盘映射,然后创建相应的...然后请求继续到达块设备层,在IO队列里排队,接受一系列的调度后到达设备驱动层,此时一般使用DMA方式读取相应的磁盘扇区到Cache,然后read(2)拷贝数据到用户提供的用户态buffer中去(read

    2.3K20
    领券