linux内核
文章平均质量分 93
bigDxin
这个作者很懒,什么都没留下…
展开
-
【Linux 内核】整理内核特殊宏、原语等
对于 volatile 修饰的变量,编译器不能对该变量进行缓存,当每次使用该变量的值时,编译器必须从内存重新读取该变量的值。假设程序中有两个线程,一个线程执行 foo()函数,另一个线程执行 bar() 函数,两个线程会并行访问全局变量 a在默认不开启任何优化选项时,编译器输出的 foo() 函数为。可以看到在未开启优化的时候,编译器的输出是符合程序的设计意图的再来看看开启编译优化 (gcc -O2) 时,编译器输出的 foo() 函数。可以看到加上 barrier() 之后,恢复为从内存读取变量的值。原创 2022-11-30 10:48:26 · 665 阅读 · 0 评论 -
[转载]内存屏障
在上图所示的 store buffer 中,CPU 在执行 store 操作后同样将修改的值保存到 store buffer 中,之后便继续执行之后的指令,当 CPU 执行 store 之后的 load 操作时,在访问对应的 cache line 之前需要访问 store buffer,若 store buffer 缓存有当前执行 load 操作的数据,load 操作会使用 store buffer 中缓存的数据,而非 cache line 中的数据。转载 2022-11-13 19:03:34 · 531 阅读 · 1 评论 -
【Linux 内核】原子变量、每CPU变量、RCU
原文一、linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句。从语句的意思可以看出是要使用与当前cpu相关的一个变量,不过查看这个变量的定义,总是有这样一个宏:DEFINE_PER_CPU(type, name),将这个宏展开成下面的语句: __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__#原创 2021-04-18 16:04:02 · 1112 阅读 · 0 评论 -
【Linux内核】从preempt_disable看看barrier()
#define preempt_disable() \do{ \ inc_preempt_count(); \ barrier(); \}while(0)一、这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误。但如果对I/O操作进行类似优化很可能造成致命错误。所以要使用内存屏障,以强制该语句前...转载 2020-10-22 13:33:40 · 571 阅读 · 0 评论 -
【Linux 内核】 中断上半部
中断分为上半部和下半部,先介绍上半部。 每个中断都有一个编号,CPU支持多个中断编号,但这是 远远不够的,那么就会有许多中断共享编号称为中断共享。一、硬件中断中断不能由处理器外部的外设直接产生,而必须借助于一个称为中断控制器(interrupt controller)的标准组件来请求,该组件存在于每个系统中。外部设备会向中断控制器发送中断请求,控制器在执行了各种电工任务之后,将中断请求转发到CPU的中断输入。因为外部设备不能直接发出中断,而必须通过上述组件请求中断,所以这种请求更正...原创 2020-06-18 11:41:29 · 720 阅读 · 0 评论 -
【linux 内核】 锁机制的实现 spin_lock()函数
这篇记录下内存锁是如何实现的。以下是spin_lock()函数的代码调用流程片段: 注意__raw_spin_lock这里调用了preept_disable()函数关闭了cpu抢占。这个函数不用关心LOCK_CONTENDED宏的作用,知道这里调用do_raw_spin_lock()函数就可以,参数是lock。锁的结构介绍:从__spin_lock_debug开始初见端倪,先尝试for循环4096×HZ次加锁,这里并没有挂死,400多万次的尝试加锁...原创 2020-05-28 09:58:27 · 2746 阅读 · 0 评论 -
【linux 内核】中断下半部
中断下半部包含:软中断、tasklet、任务队列。一、软中断: 软中断是一组静态定义的下半部接口,有32个,可以在所有处理上同时执行---即使两个类型相同的也可以。kernel/softirq.c中定义了饿一个包含有32个该结构体的数组,static struct softirq_action softirq_vec[NR_SOFTIRQS],NR_SOFTIRQS = 32...原创 2020-05-28 09:53:43 · 385 阅读 · 0 评论 -
【linux 内核】 内核启动流程
linux内核启动流程https://www.cnblogs.com/chenshikun/p/9389578.htmlLinux内核的引导https://www.cnblogs.com/wanghuaijun/p/7189769.htmlLinux内核引导过程https://blog.csdn.net/qingdaohaishanhu/article/details/8808...原创 2020-05-28 10:02:40 · 337 阅读 · 0 评论 -
【linux 内核】内核编译相关 Kconfig .config
内核源码可以看做是源码树,通过Kconfig .config Makefile 三个文件来控制内核哪些模块被编译,编译什么架构等。一下是经过网上查找的资料自己的理解。Kconfig 是内核模块节点的位置标记,相当于树节点,有位置域,数据域。位置域确定的该节点位于源码树的位置,这样有利于make menuconfig等可视化工具来管理模块,可以说make menuconfig 是根据Kcon...原创 2019-07-10 21:18:57 · 530 阅读 · 0 评论 -
【linux 内核】转载 内核启动分析
https://www.cnblogs.com/morphling/p/3595287.html转载 2019-06-11 08:59:55 · 163 阅读 · 0 评论 -
【linux 内核】 系统调用具体流程
最近看了下系统调用,理清了下用户态是怎么陷到内核的,先记录下理论基础,再一份select函数做为例子记录。一、理论在linux中,系统调用时用户空间访问内核的唯一手段;出异常和陷入外,他们是内核唯一的合法入口。系统调用的流程: printf()->c库中的printf()->c库中的write()->write()的系统调用。1、系统调用 通常需要定义零个、一个或...原创 2020-05-28 10:04:22 · 165 阅读 · 0 评论