操作系统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 · 1997 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——读写自旋锁
读写自旋锁读写自旋锁(通常简称读写锁)是对自旋锁的改进,区分读者和写者,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥。如果读者占有读锁,写者申请写锁的时候自旋等待。如果写者占有写锁,读者申请读锁的时候自旋等待。读写自旋锁的定义:include/linux/rwlock_types.htypedef struct { arch_rwlock_t raw_lock; ...} rwlock_t;各种处理器架构需要自定义数据类型arch_rwlock_t,ARM6原创 2020-06-27 09:57:01 · 1305 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——自旋锁
自旋锁自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且不允许在临界区睡眠。申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器自旋等待(也称为忙等待)。进程、软中断和硬中断都可以使用自旋锁。目前内核的自旋锁是排队自旋锁(queued spinlock,也称为“FIFOticketspinlock”),算法类似于银行柜台的排队叫号。自旋锁的定义:include/linux/spinlock_types.htypedef struct raw_spinlock { arch..原创 2020-06-26 10:49:31 · 515 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——原子变量
原子变量原子变量用来实现对整数的互斥访问,通常用来实现计数器。内核定义了3种原子变量:(1)整数原子变量,数据类型是atomic_tinclude/linux/types.htypedef struct { int counter;} atomic_t;(2)长整数原子变量,数据类型是atomic_long_t(3)64位整数原子变量,数据类型是atomic64_t初始化静态原子变量的方法(以整数原子变量为例):atomic_t <name> = AT原创 2020-06-25 20:26:06 · 2602 阅读 · 1 评论 -
Linux内核深度解析之内核互斥技术——实时互斥锁
实时互斥锁实时互斥锁是对互斥锁的改进,实现了优先级集成(priority inheritance),解决了优先级反转(priority inversion)的问题。如果需要使用实时互斥锁,编译内核时需要开启配置宏CONFIG_RT_MUTEXES。实时互斥锁的定义:include/linux/rtmutex.hstruct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct ta原创 2020-06-25 19:05:17 · 1472 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——互斥锁
互斥锁互斥锁只允许一个进程进入临界区,适合保护比较长的临界区,因为竞争互斥锁时进程可能睡眠和再次唤醒,代价很高。尽管可以把二值信号量当做互斥锁使用,但是内核单独实现了互斥锁。互斥锁的定义:include/linux/mutex.hstruct 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 · 1028 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——读写信号量
读写信号量读写信号量是对互斥信号量的改进,允许多个读者同时进入临界区,读者和写者互斥,写者和写者互斥,适合在以读为主的情况下使用。读写信号量的定义:include/linux/rwsem.hstruct 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 · 789 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术——信号量
信号量信号量允许多个进程同时进入临界区,大多数情况下只允许一个进程进入临界区,把信号量的计数值设置为1,即二值信号量,这种信号量称为互斥信号量。和自旋锁相比,信号量适合保护比较长的临界区,因为竞争信号量时进程可能睡眠和再次唤醒,代价很高。内核使用的信号量定义:include/linux/semaphore.hstruct semaphore { raw_spinlock_t lock; /* 自旋锁,用来保护信号量的其他成员 */ unsigned int count; /*原创 2020-06-25 11:38:56 · 440 阅读 · 0 评论 -
Linux内核深度解析之内核互斥技术
内核互斥技术在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象、进程和软中断访问同一个对象、进程和硬中断访问同一个对象、多个处理器访问同一个对象等现象,我们需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。如果临界区的执行时间比较长或者可能睡眠,可以使用下面这些互斥技术:(1)信号量,大多数情况下我们使用互斥信号量(2)读写信号量(3)互斥锁(4)实时互斥锁申请这些锁的时候,如果锁被其他进程占有,进程将会睡眠等待,代价很高。如果临界区的执原创 2020-06-25 11:18:50 · 666 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断
中断中断是外围设备通知处理器的一种机制。1. 中断控制器外围设备不是把中断请求直接发送给处理器,而是发给中断控制器,由中断控制器转发给处理器。不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控制器描述符irq_chip,每种中断控制器自定义各种操作函数。GICv2控制器的描述符如下:drivers/irqchip/irq-gic.ctatic const struct irq_chip gic_chip = { .irq_mask = gic_mask_i.原创 2020-06-25 09:58:52 · 2070 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务
小任务小任务(tasklet,有的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势:(1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除(2)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。小任务根据优先级分为两种:低优先级小任务和高优先级小任务。1. 数据结构小任务的数据结构如下:原创 2020-06-25 09:54:23 · 356 阅读 · 0 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之软中断
软中断软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。kernel/softirq.cstatic struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; /* 软中断向量表 */include/l原创 2020-06-25 09:53:01 · 1362 阅读 · 1 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部
中断下半部Linux中断下半部有3种:软中断(softirq)、小任务(tasklet)和工作队列(workqueue)。3种下半部的区别:(1)软中断和小任务不允许睡眠;工作队列是使用内核线程实现的,处理函数可以睡眠(2)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除(3)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的...原创 2020-06-25 09:48:12 · 265 阅读 · 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 · 2951 阅读 · 2 评论 -
Linux内核深度解析之中断、异常和系统调用——中断下半部之工作队列
工作队列工作队列(work queue)是使用内核线程异步执行函数的通用机制。工作队列是中断处理程序的一种下半部机制,中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列。工作队列不完全是中断处理程序的下半部,同时内核的其他模块也可以将异步执行的函数交给它执行。1.编程接口内核使用工作项保存需要异步执行的函数,工作项的数据接口是work_struct,其定义如下:include/linux/workqueue.hstruct work_struct { atomic_l.原创 2020-06-21 17:06:43 · 1884 阅读 · 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 · 2413 阅读 · 0 评论
分享