linux内核解析?linux内核深度解析 pdf

大家好,关于linux内核解析很多朋友都还不太明白,今天小编就来为大家分享关于linux内核深度解析 pdf的知识,希望对各位有所帮助!

Linux内核中断之中断调用流程

本文基于 RockPI 4A单板Linux4.4内核介绍中断调用流程。

ARMv8包括两种运行状态:AArch64和AArch32。

AArch64中不再使用AArch32中的7种特权模式,而是提出了Exception Levels的概念,包括:

1)EL0:用于用户态程序,权限最低

2)EL1:给内核使用,权限稍高

3)EL2:虚拟化相关,权限更高

4)EL3:安全相关,权限最高

Linux内核中一般只使用EL0和EL1。

AArch64异常向量表中的异常包括:

1)Synchronous exception(同步异常)

2)SError

3)IRQ

4)FIQ

注:SError、IRQ和FIQ属于异步异常。

在Linux内核中,在 arch/arm64/kernel/entry.S文件中定义了异常向量表,内容如下:

选取 el1_irq()函数介绍Linux内核中断的调用流程。

文件: arch/arm64/kernel/entry.S,调用流程如下:

1、handle_irq()初始化

在 DTS解析阶段完成 handle_irq()函数的初始化,流程如下:

gic_irq_domain_map()函数中完成了 handle_irq()函数的赋值,具体执行如下:

2、handle_irq()实现

以共享外设中断 SPI的中断处理函数 handle_fasteoi_irq()为例,继续跟踪中断的执行过程。

handle_irq_event_percpu()函数会调用已经注册的中断处理函数,同时唤醒 irq_thread线程。

3、中断处理线程

在使用 request_threaded_irq()函数申请中断时,会创建一个 irq_thread线程,调用流程如下:

irq_thread线程平时在睡眠状态,等待 handle_irq_event_percpu()函数唤醒,进一步执行已注册的中断处理线程函数。

使用 DRM框架中 HDMI中断验证中断调用流程。

文件: drivers\gpu\drm\bridge\synopsys\dw-hdmi.c

在中断处理函数 dw_hdmi_hardirq()和中断处理线程函数 dw_hdmi_irq中增加 dump_stack()调用(注:仅限于调试验证)。

插入 HDMI线,系统启动后,显示中断调用流程的日志如下:

Linux内核配置解析 - 概述(基于ARM64架构)

在探索Linux内核配置的道路上,初学者可能会感到困惑与挑战。Linux内核拥有多种进入方式,包括从设备驱动入手,研究源代码目录结构,关注内核启动过程,或直接从主要功能模块开始。然而,本文旨在以内核配置项作为切入点,提供对整个Linux内核的全面理解。

内核配置项繁多,这在进行移植时尤其明显,如面对“menuconfig”界面时,初次接触者可能会感到畏惧(请参考图片1)。配置项本质上用于功能设置和开关,它们能够直观反映出软件的功能划分。以Linux内核为例,Kconfig呈现的树状结构在功能组织上比目录结构更为清晰。

本文所使用的Linux内核版本为“X Project”下的“Linux 4.6-rc5”。接下来的系列文章将深入分析配置项,从整体上了解内核。

Linux内核配置项主要通过Kconfig语言组织,以架构为单位。以ARM64为例,其Kconfig入口位于“arch/arm64/Kconfig”。执行“make ARCH=arm64 menuconfig”命令后,用户可进入配置界面(请参考图片1)。

配置界面初期看起来较为简洁,但深入二级菜单时,内容变得丰富复杂。分析配置项时,可以结合Kconfig文件、跟随菜单项指引、利用强大的搜索引擎,必要时查阅源代码。本文将仅介绍Kconfig的一级菜单,作为后续深入分析的基础。

接下来,我们将通过分析“arch/arm64/Kconfig”文件,对menuconfig的一级菜单进行简要解读,旨在从实例出发理解Kconfig语言的语法和内核配置项的整体结构。这将为后续深入研究奠定基础。

简单概括Linux内核源码高速缓存原理(图例解析)

高速缓存(cache)概念和原理涉及在处理器附近增加一个小容量快速存储器(cache),基于SRAM,由硬件自动管理。其基本思想为将频繁访问的数据块存储在cache中,CPU首先在cache中查找想访问的数据,而不是直接访问主存,以期数据存放在cache中。

Cache的基本概念包括块(block),CPU从内存中读取数据到Cache的时候是以块(CPU Line)为单位进行的,这一块块的数据被称为CPU Line,是CPU从内存读取数据到Cache的单位。

在访问某个不在cache中的block b时,从内存中取出block b并将block b放置在cache中。放置策略决定block b将被放置在哪里,而替换策略则决定哪个block将被替换。

Cache层次结构中,Intel Core i7提供一个例子。cache包含dCache(数据缓存)和iCache(指令缓存),解决关键问题包括判断数据在cache中的位置,数据查找(Data Identification),地址映射(Address Mapping),替换策略(Placement Policy),以及保证cache与memory一致性的问题,即写入策略(Write Policy)。

主存与Cache的地址映射通过某种方法或规则将主存块定位到cache。映射方法包括直接(mapped)、全相联(fully-associated)、一对多映射等。直接映射优点是地址变换速度快,一对一映射,替换算法简单,但缺点是容易冲突,cache利用率低,命中率低。全相联映射的优点是提高命中率,缺点是硬件开销增加,相应替换算法复杂。组相联映射是一种特例,优点是提高cache利用率,缺点是替换算法复杂。

cache的容量决定了映射方式的选取。小容量cache采用组相联或全相联映射,大容量cache采用直接映射方式,查找速度快,但命中率相对较低。cache的访问速度取决于映射方式,要求高的场合采用直接映射,要求低的场合采用组相联或全相联映射。

Cache伪共享问题发生在多核心CPU中,两个不同线程同时访问和修改同一cache line中的不同变量时,会导致cache失效。解决伪共享的方法是避免数据正好位于同一cache line,或者使用特定宏定义如__cacheline_aligned_in_smp。Java并发框架Disruptor通过字节填充+继承的方式,避免伪共享,RingBuffer类中的RingBufferPad类和RingBufferFields类设计确保了cache line的连续性和稳定性,从而避免了伪共享问题。

阅读剩余
THE END