精华内容
下载资源
问答
  • Linux内核深度解析

    2020-10-29 17:06:21
    本书基于 4.x 版本的 Linux 内核,介绍了 Linux 内核的若干关键子系统的技术原理。本书主要内 容包括内核的引导过程、内核管理和调度进程的技术原理、内核管理虚拟内存和物理内存的技术原 理、内核处理异常和中断的...
    本书基于 4.x 版本的 Linux 内核,介绍了 Linux 内核的若干关键子系统的技术原理。本书主要内 容包括内核的引导过程、内核管理和调度进程的技术原理、内核管理虚拟内存和物理内存的技术原 理、内核处理异常和中断的技术原理,以及系统调用的实现方式等。此外,本书还详细讲解了内核 实现的各种保护临界区的互斥技术,以及内核的文件系统。本书内容丰富,深入浅出,通过大量的 图例来描述数据结构之间的关系和函数的执行流程,并结合代码分析,引导读者阅读和理解内核源 代码。 本书适用于负责维护和开发 Linux 内核或基于 Linux 内核开发设备驱动程序的专业人士,以及 想要学习了解 Linux 内核的软件工程师,也适合作为高等院校计算机专业的师生用书和培训学校的 教材。
    详情加2456102575
    
    展开全文
  • 内核互斥技术 在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象、进程和软中断访问同一个对象、进程和硬中断访问同一个对象、多个处理器访问同一个对象等现象,我们需要使用互斥技术,确保在...

    内核互斥技术

    在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象、进程和软中断访问同一个对象、进程和硬中断访问同一个对象、多个处理器访问同一个对象等现象,我们需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。

    如果临界区的执行时间比较长或者可能睡眠,可以使用下面这些互斥技术:

    (1)信号量,大多数情况下我们使用互斥信号量

    (2)读写信号量

    (3)互斥锁

    (4)实时互斥锁

    申请这些锁的时候,如果锁被其他进程占有,进程将会睡眠等待,代价很高。

    如果临界区的执行时间很短,并且不会睡眠,那么使用上面的锁不太合适,因为进程切换的代价很高,可以使用下面这些互斥技术:

    (1)原子变量

    (2)自旋锁

    (3)读写自旋锁,它是对自旋锁的改进,允许多个读者同时进入临界区

    (4)顺序锁,它是对读写自旋锁的改进,读者不会阻塞写者

    申请这些锁的时候,如果锁被其他进程占有,进程自旋等待(也称为忙等待)

    进程还可以使用下面的互斥技术:

    (1)禁止内核抢占,防止被当前处理器上的其他进程抢占,实现和当前处理器上的其他进程互斥

    (2)禁止软中断,防止被当前处理器上的软中断抢占,实现和当前处理器上的软中断互斥

    (3)禁止硬中断,防止被当前处理器上的硬中断抢占,实现和当前处理器上的硬中断互斥

    在多处理器系统中,为了提高程序的性能,需要尽量减少处理器之间的互斥,使处理器可以最大限度地并行执行。从互斥信号量到读写信号量的改进,从自旋锁到读写自旋锁的改进,允许读者并行访问临界区,提高了并行性能,但是我们还可以进一步提高并行性能,使用下面这些避免使用锁的互斥技术:

    (1)每处理器变量

    (2)每处理器计数

    (3)内存屏障

    (4)读-复制更新(Read-Copy Update,RCU)

    (5)可睡眠RCU

    使用锁保护临界区,如果使用不当,可能出现死锁问题。内核里面的锁非常多,定位很难,为了方便定位死锁问题,内核提供了死锁检测工具lockdep。

    展开全文
  • 下载请联系QQ:738755287

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    下载请联系QQ:738755287

     

     

    展开全文
  • 尽管可以把二值信号量当做互斥锁使用,但是内核单独实现了互斥锁。 互斥锁的定义: include/linux/mutex.h struct mutex { atomic_long_t owner; spinlock_t wait_lock; #ifdef CONFIG_MUTEX_SPIN_ON_OWNER ...

    互斥锁

    互斥锁只允许一个进程进入临界区,适合保护比较长的临界区,因为竞争互斥锁时进程可能睡眠和再次唤醒,代价很高。

    尽管可以把二值信号量当做互斥锁使用,但是内核单独实现了互斥锁。

    互斥锁的定义:

    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; /* Spinner MCS lock */
    #endif
    	struct list_head	wait_list;
    #ifdef CONFIG_DEBUG_MUTEXES
    	void			*magic;
    #endif
    #ifdef CONFIG_DEBUG_LOCK_ALLOC
    	struct lockdep_map	dep_map;
    #endif
    };

    初始化静态互斥锁的方法:

    DEFINE_MUTEX(mutexname)

    在运行时动态初始化互斥锁的方法:

    mutex_init(mutex)

    申请互斥锁的函数:

    (1)申请互斥锁,如果锁被占有,进程深度睡眠

    void mutex_lock(struct mutex *lock);

    (2)申请互斥锁,如果锁被占有,进程轻度睡眠

    int mutex_lock_interruptible(struct mutex *lock);

    (3)申请互斥锁,如果锁被占有,进程中度睡眠

    int mutex_lock_killable(struct mutex *lock);

    (4)申请互斥锁,如果申请成功,返回1;如果锁被其他进程占有,那么进程不等待,返回0

    int mutex_trylock(struct mutex *lock);

    释放互斥锁的函数:

    void mutex_unlock(struct mutex *lock);

     

    展开全文
  • 内核定义了3种原子变量: (1)整数原子变量,数据类型是atomic_t include/linux/types.h typedef struct { int counter; } atomic_t; (2)长整数原子变量,数据类型是atomic_long_t (3)64位整数原子变量...
  • 目前内核的自旋锁是排队自旋锁(queued spinlock,也称为“FIFOticketspinlock”),算法类似于银行柜台的排队叫号。 自旋锁的定义: include/linux/spinlock_types.h typedef struct raw_spinlock { arch..
  • 信号量 信号量允许多个进程同时进入临界区,...内核使用的信号量定义: include/linux/semaphore.h struct semaphore { raw_spinlock_t lock; /* 自旋锁,用来保护信号量的其他成员 */ unsigned int count; /*
  • 如果需要使用实时互斥锁,编译内核时需要开启配置宏CONFIG_RT_MUTEXES。 实时互斥锁的定义: include/linux/rtmutex.h struct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct ...
  • 不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控制器描述符irq_chip,每种中断控制器自定义各种操作函数。GICv2控制器的描述符如下: drivers/irqchip/irq-gic.c tatic const struct ...
  • 读写信号量 ...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_
  • 读写自旋锁 读写自旋锁(通常简称读写锁)是对自旋锁的改进,...include/linux/rwlock_types.h typedef struct { arch_rwlock_t raw_lock; ... } rwlock_t; 各种处理器架构需要自定义数据类型arch_rwlock_t,ARM6
  • 系统调用是内核给用户程序提供的编程接口。用户程序调用系统调用,通常使用glibc库针对单个系统调用封装的函数。如果glibc库没有针对某个系统调用封装的函数,用户程序可以使用通用的封装函数syscall(): #define ...
  • Linux中断下半部有3种:软中断(softirq)、小任务(tasklet)和工作队列(workqueue)。3种下半部的区别: (1)软中断和小任务不允许睡眠;工作队列是使用内核线程实现的,处理函数可以睡眠 (2)软中断的种类是...
  • 通常ARM64处理器在异常级别0执行进程,在异常级别1执行内核。ARM64处理器的异常级别0就是我们常说的用户模式,异常级别1就是我们常说的内核模式。 4.1.2异常分类 在ARM64体系结构中,异常分为同步异常和异步异常。...
  • 工作队列 工作队列(work queue)是使用内核线程异步执行函数的通用机制。 工作队列是中断处理程序的一种下半部机制,中断处理程序可以把耗时比较长...include/linux/workqueue.h struct work_struct { atomic_l.
  • 内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。 kernel/softirq.c static struct softirq_action softirq_vec[NR_SOFTIRQS] ...
  • 通常在内核模块卸载的时候调用该函数。 void tasklet_kill(struct tasklet_struct *t); 3. 技术原理 小任务是基于软中断实现的,根据优先级分为两种:低优先级小任务和高优先级小任务。软中断HI_SOFTIRQ执行高优先级...
  • 实时互斥锁实时互斥锁是对互斥锁的改进,实现了...如果需要使用实时互斥锁,编译内核时需要开启配置宏CONFIG_RT_MUTEXES。实时互斥锁的定义:include/linux/rtmutex.hstruct rt_mutex {raw_spinlock_twait_lock;str...
  • Linux内核C语言深度解析

    千次阅读 2019-06-24 19:01:08
    linux内核驱动中注册,经常遇到这种用法。 struct student{ int age; char name[20]; char number[20]; }; 第03课:语句表达式 -- 构造宏定义的好帮手 语句表达式: GNU C对C标准进行了扩展,允许...
  • Linux 内核 C 语言深度解析

    千次阅读 2018-04-12 10:41:42
    在看一些 GNU 开源软件,或者阅读 Linux 内核、驱动源码时,相信大家和我一样,经常会遇到一些“看似熟悉”,但一仔细分析又不是很懂的 C 语言“稀奇古怪”的语法。其实这些都是 GNU C 对 C 语言语法的扩展。一般的...
  • 一. 在 GNU C 中,通过数组元素索引,我们就可以给某个指定的元素直接赋值 #include <stdio.h> int main(){ int a[100] = {[10]=1, [20]=2, [30]=3}; for(int i = 1;... printf("%d\n", a[i*10...
  • 2)通过考核的同学将具有Linux内核工程师的资质,胜任定制内核,修改内核,更新内核等方面的工作。 学习安排! 第1周 linux 内核中的基础数据结构及内核中的同步方法(list链表;rb_tree;lock锁;mutex;spin_lock...
  • 嵌入式Linux与物联网软件开发——C语言内核深度解析C语言是嵌入式Linux领域的主要开发语言。对于学习嵌入式、单片机、Linux驱动开发等技术来说,C语言是必须要过的一关。C语言学习的特点是入门容易、深入理解难、...
  • 欢迎来到异步社区!... 异步社区依托于人民邮电出版社20余年的IT专业优质出版资源和编辑策划团队,打造传统出版与电子出版和自出版结合、纸质书与电子书结合、传统印刷与POD按需印刷结合的出版平台,提供最新技术资讯,...
  • 二是数组在定义的时候需要明确指定数组元素的个数,并且一般来说个数是不能改变的(Linux内核中会使用变长数组,在高级语言如C++当中也支持变长数组);三是某个元素的移动可能造成元素的大面积移动,效率不高。这些...
  • 第10章 程序员和编译器的暧昧 10.1 引言 语言从低级向高级发展的过程中,编译器所扮演者的角色越来越重要。作为一个合格的程序员,我们必须要对编译器有一定的了解,这样对我们编程来说会有极大的帮助。...
  • 答:在编译时,编译器会根据数据类型,决定在内存中所开辟内存空间的字节数,以及对于内存空间中存放数据的解析方式。 第2章 课后题答案 1. 答案: ❶ a|=BIT5 ❷ a &=~BIT5 分析:在32位系统中,宏BIT5所...
  • 第8章 C语言关键细节讨论 8.1 引言 打铁要趁热,通过对前面章节的学习,相信大家已经对C语言有了一定深度的了解。本章中我们主要讲解在C语言实际运用中值得注意的一些细节,主要内容如下: ❶ 什么是操作系统?之...
  • 虽然这些知识比较难,但是对于想要学习Linux内核的人,这是个必过的关卡,因为这种形式在Linux内核中多如牛毛。 最后,本章的实战部分还会提到如何用函数指针实现分层结构,像这一类的知识在Linux内核中也比比皆是。...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

linux内核深度解析

linux 订阅