操作系统Linux
linuxweiyh
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
proc文件系统简介及/proc目录介绍
1.proc文件系统简介 proc文件系统是由内核创建的虚拟文件系统,被内核用来向用户导出信息,通过它可以在Linux内核空间和用户空间之间进行通信。 2./proc目录介绍 /proc目录下有很多目录、文件,下面对一些常见的进行介绍: /proc/buddyinfo -- 每个内存区中的每个order有多少块可用,和内存碎片问题有关 /proc/cmdline -- 启动时传递给kernel的参数信息 /proc/cpuinfo -- cpu的信息 /proc/crypto...原创 2020-06-30 21:51:30 · 2035 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——读写自旋锁
读写自旋锁 读写自旋锁(通常简称读写锁)是对自旋锁的改进,区分读者和写者,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥。 如果读者占有读锁,写者申请写锁的时候自旋等待。如果写者占有写锁,读者申请读锁的时候自旋等待。 读写自旋锁的定义: include/linux/rwlock_types.h typedef struct { arch_rwlock_t raw_lock; ... } rwlock_t; 各种处理器架构需要自定义数据类型arch_rwlock_t,ARM6原创 2020-06-27 09:57:01 · 1355 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——自旋锁
自旋锁 自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且不允许在临界区睡眠。申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器自旋等待(也称为忙等待)。 进程、软中断和硬中断都可以使用自旋锁。 目前内核的自旋锁是排队自旋锁(queued spinlock,也称为“FIFOticketspinlock”),算法类似于银行柜台的排队叫号。 自旋锁的定义: include/linux/spinlock_types.h typedef struct raw_spinlock { arch..原创 2020-06-26 10:49:31 · 557 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——原子变量
原子变量 原子变量用来实现对整数的互斥访问,通常用来实现计数器。 内核定义了3种原子变量: (1)整数原子变量,数据类型是atomic_t include/linux/types.h typedef struct { int counter; } atomic_t; (2)长整数原子变量,数据类型是atomic_long_t (3)64位整数原子变量,数据类型是atomic64_t 初始化静态原子变量的方法(以整数原子变量为例): atomic_t <name> = AT原创 2020-06-25 20:26:06 · 2665 阅读 · 1 评论 -
Linux内核深度解析之内核互斥技术——实时互斥锁
实时互斥锁 实时互斥锁是对互斥锁的改进,实现了优先级集成(priority inheritance),解决了优先级反转(priority inversion)的问题。 如果需要使用实时互斥锁,编译内核时需要开启配置宏CONFIG_RT_MUTEXES。 实时互斥锁的定义: include/linux/rtmutex.h struct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct ta原创 2020-06-25 19:05:17 · 1520 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——互斥锁
互斥锁 互斥锁只允许一个进程进入临界区,适合保护比较长的临界区,因为竞争互斥锁时进程可能睡眠和再次唤醒,代价很高。 尽管可以把二值信号量当做互斥锁使用,但是内核单独实现了互斥锁。 互斥锁的定义: include/linux/mutex.h struct mutex { atomic_long_t owner; spinlock_t wait_lock; #ifdef CONFIG_MUTEX_SPIN_ON_OWNER struct optimistic_spin_queue osq;原创 2020-06-25 18:50:27 · 1053 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——读写信号量
读写信号量 读写信号量是对互斥信号量的改进,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥,适合在以读为主的情况下使用。 读写信号量的定义: include/linux/rwsem.h struct rw_semaphore { atomic_long_t count; struct list_head wait_list; raw_spinlock_t wait_lock; #ifdef CONFIG_RWSEM_SPIN_ON_OWNER struct optimistic_原创 2020-06-25 15:06:35 · 814 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——信号量
信号量 信号量允许多个进程同时进入临界区,大多数情况下只允许一个进程进入临界区,把信号量的计数值设置为1,即二值信号量,这种信号量称为互斥信号量。 和自旋锁相比,信号量适合保护比较长的临界区,因为竞争信号量时进程可能睡眠和再次唤醒,代价很高。 内核使用的信号量定义: include/linux/semaphore.h struct semaphore { raw_spinlock_t lock; /* 自旋锁,用来保护信号量的其他成员 */ unsigned int count; /*原创 2020-06-25 11:38:56 · 471 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术
内核互斥技术 在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象、进程和软中断访问同一个对象、进程和硬中断访问同一个对象、多个处理器访问同一个对象等现象,我们需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。 如果临界区的执行时间比较长或者可能睡眠,可以使用下面这些互斥技术: (1)信号量,大多数情况下我们使用互斥信号量 (2)读写信号量 (3)互斥锁 (4)实时互斥锁 申请这些锁的时候,如果锁被其他进程占有,进程将会睡眠等待,代价很高。 如果临界区的执原创 2020-06-25 11:18:50 · 693 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断
中断 中断是外围设备通知处理器的一种机制。 1. 中断控制器 外围设备不是把中断请求直接发送给处理器,而是发给中断控制器,由中断控制器转发给处理器。 不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控制器描述符irq_chip,每种中断控制器自定义各种操作函数。GICv2控制器的描述符如下: drivers/irqchip/irq-gic.c tatic const struct irq_chip gic_chip = { .irq_mask = gic_mask_i.原创 2020-06-25 09:58:52 · 2127 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务
小任务 小任务(tasklet,有的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势: (1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除 (2)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。 小任务根据优先级分为两种:低优先级小任务和高优先级小任务。 1. 数据结构 小任务的数据结构如下:原创 2020-06-25 09:54:23 · 387 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之软中断
软中断 软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。 内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。 kernel/softirq.c static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; /* 软中断向量表 */ include/l原创 2020-06-25 09:53:01 · 1423 阅读 · 1 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部
中断下半部 Linux中断下半部有3种:软中断(softirq)、小任务(tasklet)和工作队列(workqueue)。3种下半部的区别: (1)软中断和小任务不允许睡眠;工作队列是使用内核线程实现的,处理函数可以睡眠 (2)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除 (3)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的 ...原创 2020-06-25 09:48:12 · 289 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——系统调用
系统调用 系统调用是内核给用户程序提供的编程接口。用户程序调用系统调用,通常使用glibc库针对单个系统调用封装的函数。如果glibc库没有针对某个系统调用封装的函数,用户程序可以使用通用的封装函数syscall(): #define _GNC_SOURCE #include <unistd.h> #include <sys/syscall.h> /* 定义SYS_xxx */ long syscall(long number, ...); 参数number是原创 2020-06-21 22:17:53 · 3025 阅读 · 2 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之工作队列
工作队列 工作队列(work queue)是使用内核线程异步执行函数的通用机制。 工作队列是中断处理程序的一种下半部机制,中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列。 工作队列不完全是中断处理程序的下半部,同时内核的其他模块也可以将异步执行的函数交给它执行。 1.编程接口 内核使用工作项保存需要异步执行的函数,工作项的数据接口是work_struct,其定义如下: include/linux/workqueue.h struct work_struct { atomic_l.原创 2020-06-21 17:06:43 · 1935 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——ARM64异常处理
4.1 ARM64异常处理 4.1.1异常级别 ARM64处理器定义了4个异常级别:0~3。通常ARM64处理器在异常级别0执行进程,在异常级别1执行内核。ARM64处理器的异常级别0就是我们常说的用户模式,异常级别1就是我们常说的内核模式。 4.1.2异常分类 在ARM64体系结构中,异常分为同步异常和异步异常。 同步异常: (1)系统调用 (2)数据中止 (3)指令中止 (4)栈指针或指令地址没有对齐 (5)没有定义的指令 (6)调试异常 异步异常: (1)中断(IRQ) ..原创 2020-06-14 22:05:17 · 2472 阅读 · 0 评论
分享