- 博客(42)
- 收藏
- 关注
原创 第四十二期-ARM Linux内核的系统调用(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中的系统调用和定义系统调用的流程,这一期我们将介绍系统调用的执行过程。一、ARM Linux内核中系统调用的执行过程在第二十九期和第三十期中,我们介绍过ARM Linux内核中的异常向量表和异常处理的一般流程。系统调用属于同步异常的范畴,因此遵循异常处理的一般流程。ARM Linux 内核的异常向量表在/kernel-4.19/arch/arm64/kernel/entry.S文件中:该表从上到下共有四组,系
2020-06-23 19:29:04
1548
原创 第四十一期-ARM Linux内核的系统调用(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了工作队列相关的关键函数,这一期我们将介绍ARM Linux内核中的系统调用。一、ARM Linux内核中的系统调用在ARM Linux内核中,系统调用是一种特殊的异常,通常被归于同步异常的范畴,这是因为它是通过SVC指令触发的。我们在第二十七期中提到过,同步异常是由正在运行的指令或指令运行的结果造成的异常。SVC指令在ARMv8体系中被归于异常处理类指令,该指令能允许用户程序调用内核,其格式如下[1]:异常处理程序可以从异常症状
2020-06-23 19:14:50
1022
原创 第四十期-ARM Linux内核的中断(10)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中添加工作项的关键函数,这一期我们继续介绍其他与工作队列相关的关键函数。一、ARM Linux内核与工作队列相关的关键函数从第38期我们可以知道,一个worker_pool数据结构中维护了两个工作者列表:一个空闲的工作者列表和一个工作者的busy hash table。事实上每个工作者都对应了一个内核线程[1],而工作者线程调用函数worker_thread(),该函数的源码在openeuler/kernel/b
2020-06-23 19:02:01
441
原创 第三十九期-ARM Linux内核的中断(9)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中工作队列相关的关键数据结构,这一期我们将介绍与工作队列相关的关键函数。一、ARM Linux内核中与工作队列相关的关键函数与工作队列相关的关键函数主要涉及工作项的添加、工作者线程的运行、工作的处理和工作者的调度等。工作项的添加通过函数调用链queue_work()->queue_work_on()->__queue_work()完成。queue_work()函数的源码可以在openeuler/kernel/blob/kernel-
2020-06-23 16:10:46
346
原创 第三十八期-ARM Linux内核的中断(8)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中的底半机制和软中断的处理流程,这一期我们将介绍ARM Linux内核中小任务的工作流程和与工作队列相关的关键数据结构。一、ARM Linux内核中小任务的工作流程在ARM Linux内核中,小任务分为高优先级的小任务和低优先级的小任务,它们是基于软中断实现的,ARM Linux内核通过softirq_init()函数将高优先级的小任务和低优先级的小任务分别注册为HI_SOFTIRQ类型的软中断和TASKLET_
2020-06-05 12:29:31
487
原创 第三十七期-ARM Linux内核的中断(7)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中与中断相关的常用函数,这一期我们将介绍ARM Linux内核中的底半机制。一、ARM Linux内核中底半机制Linux系统内核在处理中断时,为避免复杂的中断嵌套,通常采用关闭中断的策略,例如使用上一期中提到的local_irq_disable()和local_irq_save()函数。但是系统关闭中断的时间不能过长,这是因为用户敲击鼠标和键盘等外设中断的响应时间关系到用户体验。为了减少关闭中断的时间,Linu
2020-06-04 19:36:36
404
原创 第三十六期-ARM Linux内核的中断(6)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中SGI的处理流程,这一期我们将介绍ARMLinux内核的与中断相关的常用函数。一、ARM Linux内核中与中断相关的常用函数在ARM Linux内核源码中,常见的与中断有关的函数包括中断处理程序注册函数、中断释放函数、开中断函数和关中断函数。中断处理程序注册函数用于注册设备所用的中断处理函数,主要有request_irq()和request_threaded_irq()。request_irq()是通过调
2020-05-29 19:02:26
300
原创 第三十五期-ARM Linux内核的中断(5)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期我们中我们介绍了ARM Linux内核中外设中断的一般流程,这一期中我们将介绍软件产生的中断的处理流程。一、ARM Linux内核中软件产生的中断的处理流程软件产生的中断(SGI)是ARM GICv3支持的一种中断类型,SGI通常用于处理器间的通行,通过写GIC的SGI寄存器能产生SGI。ARM Linux内核定义了多个CPU间交互的接口,这些接口在openEuler源码仓库的openeuler/kernel/blob/kernel-4.19/
2020-05-29 18:51:05
1527
原创 第三十四期-ARM Linux内核的中断(4)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM Linux内核中外设中断处理的部分流程,这一期我们将继续介绍ARMLinux内核的外设中断处理流程中与中断描述符相关的部分。一、ARM Linux内核的中断描述符上一期我们提到ARM Linux内核处理外设中断时会通过调用Linux中断号对应的中断描述符里的handle_irq()函数来处理相关中断。中断描述符在ARM Linux中由结构体irq_desc来表示,其代码在openEuler源码仓库的/openeuler/ke
2020-05-29 18:38:08
460
原创 第三十三期-ARM Linux内核的中断(3)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期我们从处理器的视角介绍了ARM Linux内核的中断流程,这一期我们从内核的视角来考察ARM Linux中的中断流程。一、ARM Linux内核的中断流程:内核的视角在第二十九期的异常向量表中我们可以看到,当发生IRQ中断时,内核会通过异常向量表中的IRQ相关项进入中断处理流程,相关代码在openEuler源码库中的/kernel/blob/kernel-4.19/arch/arm64/kernel/entry.S文件里可以找到:我们以64位
2020-05-29 17:38:12
642
原创 第三十二期-ARM Linux内核的中断(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了中断的状态,从这一期开始我们将介绍ARM Linux内核处理中断的基本流程。首先我们从ARM处理器和GIC的视角来介绍中断处理的过程。一、ARM Linux内核中断处理的基本流程:硬件的视角ARM处理器通常用中断(Interrupt)来指代中断信号,对ARM-A系列的处理器来说,它就是外设发送的FIQ或IRQ信号。对ARMv8-A架构来说,FIQ通常是为安全的中断源保留的,而在更早的ARM版本中,FIQ和IRQ分别用于指代高优先级的中
2020-05-29 16:10:07
489
原创 第三十一期-ARM Linux内核的中断(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了Linux内核的异常,在从这一期开始的接下来六期中我们将介绍ARM Linux内核的中断,首先我们将介绍GICv3的中断状态。一、GICv3的中断状态我们在第27期时提到过,ARM64体系的异常可以分为同步异常和异步异常1,外设所发出的中断就是一种异步异常。用户敲击键盘或点击鼠标的行为产生的外设中断可能在程序运行的任意时刻发生,从而与指令的执行是异步的。在第28期的时候我们介绍了GICv3。ARMv8-A架构的处理器在接收外设中断时
2020-05-29 15:47:37
619
原创 第三十期-Linux内核的异常(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了Linux 4.19内核的异常向量表,这一期我们将介绍Linux 4.19内核在ARM64处理器上的异常处理。一、Linux 4.19内核在ARM64处理器上的异常处理当异常发生时,处理器需要调用异常处理程序来处理异常,该调用过程可以粗略地分为保存处理器当前状态、调用异常处理程序和恢复异常发生前的处理器状态三步,具体说来内核...
2020-05-07 19:02:40
498
原创 第二十九期-Linux内核的异常(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一章中我们介绍了与ARM64体系中的异常与中断。这一期我们将介绍Linux 4.19内核中的异常向量表。一、Linux 4.19内核的异常向量表上一期中我们提到,异常向量被保存在异常向量表中。在/openeuler/kernel/blob/kernel-4.19/arch/arm64/kernel/entry.S文件中我们可以找到定义异常...
2020-05-07 18:08:14
525
原创 第二十八期-ARM64体系的异常与中断(2)
第二十八期-ARM64体系的异常与中断(2)作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARM64体系的异常,这一期我们将介绍ARM64体系中通用中断控制器(GeneralInterrupt Controller,GIC)的中断处理流程。一、GICv3简介1中断是外设给处理器传递信息的一种方式,外设中断相对于处理器通常是异步的。ARM64体系中外设中断是通过通用中...
2020-04-28 15:55:00
522
原创 第二十七期-ARM64体系的异常与中断(1)
第二十七期-ARM64体系的异常与中断作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一章中我们介绍了与ARM体系结构有关的一些基础知识,这一章我们将介绍openEuler中异常与中断的相关知识。首先我们从处理器的视角出发,介绍一下ARM64体系中的异常与中断。一、ARM64体系中的异常在计算机术语中,异常通常指在程序运行过程中发生的异常事件1。 ARM64体系中的异常可以分为同步异常...
2020-04-28 14:47:03
790
原创 第二十六期-openEuler汇编语言(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了一些ARM汇编语言的编程方法,这一期我们介绍一下ARM内嵌汇编器并尝试分析一下openEuler中的一段汇编代码。一、内嵌汇编器1C/C++编译器中包含了内嵌汇编器,使用这些内嵌汇编器可以在C或C++代码中使用大部分ARM指令和Thumb指令。内嵌汇编指令中,作为操作数的寄存器和常量可以是C或C++表达式,其类型包含char...
2020-04-18 19:35:25
492
原创 第二十五期-openEuler汇编语言(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上两期中我们介绍了ARMv8-A的缓存一致性特性,在这两期中我们介绍openEuler系统中的汇编语言。为了更好地学习这些汇编语言,我们先来了解一下ARM体系结构相关的汇编语言的使用。一、ARM汇编语言在之前的连载中我们介绍了ARMv8-A架构的指令集和寄存器。指令集就如同高级程序设计语言中的语句,寄存器就如同语句中的变量。然而只了解语句也无...
2020-04-18 17:41:02
514
原创 第二十四期-ARMv8-A缓存一致性(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了一些常用的缓存一致性模型,这一期中我们将介绍ARMv8-A架构1中与缓存一致性密切相关的两个概念:原子性和访存顺序。一、ARMv8-A架构的原子性原子性是访存行为的一个特征,我们一般称具有原子性的访存操作为原子性操作。ARMv8-A架构有两种原子性,一种是单拷贝原子性(single-copy atomicity),另一种是多...
2020-04-13 15:28:48
791
原创 第二十三期-ARMv8-A缓存一致性(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上两期中我们介绍了ARMv8-A的存储模型,在这两期中我们着重介绍ARMv8-A架构缓存一致性相关的内容。本期我们介绍缓存一致性相关的基础知识。一、缓存一致性受功耗等因素的限制,单处理器的主频无法无限提高,促使处理器向多核架构发展。另一方面,多级缓存可以有效节省带宽,提升数据访问效率。多核处理器架构和多级缓存存储体系的发展催生了缓存一致性问题...
2020-04-13 14:02:04
655
原创 第二十二期-ARMv8-A存储模型概述(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARMv8-A架构中的地址转换机制和访问控制机制,这一期我们将考察ARMv8-A架构中的应用级内存模型(Application Level Memory Model)。一、ARMv8-A架构的应用内存模型应用级内存模型指的是从应用软件的视角来观察和操作处理器的内存行为而形成的模型。ARM v8-A 架构中的内存主要有两种类...
2020-04-04 15:51:19
665
原创 第十九期-处理器存储模型概述(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARMv8-A架构中的异常级别,从这一期开始的接下来四期我们将介绍ARMv8-A的存储模型。第一期我们将介绍存储模型中地址转换和访存控制的一般概念,第二期我们将介绍缓存相关的基本概念,最后两期我们将介绍ARMv8-A架构中的地址转换、访存控制和缓存机制。本期中我们介绍处理器中地址转换机制和访问控制的一般概念。处理器的地址转换和...
2020-04-04 15:15:42
415
2
原创 第二十一期-ARMv8-A存储模型概述(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上两期中我们介绍了处理器存储模型的一般概念,这一期我们将介绍ARMv8-A架构中的地址转换系统。一、VMSAv8-64地址转换系统虚拟内存系统架构(Virtual Memory System Architecture, VMSA)提供了管理单元(Memory Management Unit, MMU),MMU控制了处理器的地址转换、访存控制,...
2020-04-04 15:14:29
521
原创 第二十期-处理器存储模型概述(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了处理器的地址转换机制和访问控制机制,这一期我们将考察处理器中的缓存机制。一、处理器的缓存机制计算机中用于存储的硬件设备主要有寄存器、缓存、主存和磁盘,处理器访问它们的速度依次减小。由于处理器对于不同数据的访问有不同的速度要求,计算机中构建了层次化的存储结构。对访问速度要求最高的数据往往放在寄存器中,访问速度要求稍低但对存储容...
2020-04-04 14:43:38
324
原创 第十八期-ARM体系结构基础(4)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARMv8-A架构的执行状态,这一期我们介绍ARMv8-A架构的异常级别和安全状态。ARMv8-A的异常级别与安全状态ARMv8-A有四个异常级别,从EL0到EL3。对于异常级别ELn,整数n增加表示软件执行的特权权限变大了。EL0级别下的执行叫非特权执行(unprivileged execution)。EL1主要用于运行操...
2020-04-04 14:02:20
258
原创 第十七期-ARM体系结构基础(3)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了ARMv8-A架构1里操作系统常用的寄存器的基本使用情况,这一期中我们将介绍ARMv8-A架构中的执行状态。一、ARMv8-A的执行模式ARMv8-A有两种执行模式,一种是AArch64执行模式,另一种是AArch32执行模式。执行状态定义处理单元(Processing Element, PE)的执行环境,包括以下内容:...
2020-04-04 13:53:07
253
原创 第十六期-ARM体系结构基础(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一节中我们学习了ARM汇编指令集的有关知识,这一节我们主要学习ARM架构寄存器的有关知识。在处理器中,寄存器用于保存需要被快速访问的数据,在操作系统中需要特别注意的寄存器主要有栈指针寄存器(SP)、连接寄存器(LR)、程序计数器(PC)以及当前程序状态寄存器(CPSR)和保存程序状态寄存器(SPSR)。本小节主要以ARMv8-A为例介绍ARM架...
2020-04-04 01:15:20
415
原创 第十五章-ARM体系结构基础(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心鲲鹏处理器采用ARM架构,欧拉系统可以运行在鲲鹏架构的服务器上,想要了解欧拉操作系统对硬件的支持,首先需要了解一些ARM架构的基础知识。操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因此我们对ARM体系结构的介绍也围绕ARMv8-A的汇编指令和寄存器来展开。处理器架构是处理器厂商为同一个系列的处理器规定的一个规范。ARM架构是一...
2020-04-04 00:45:43
635
原创 第十四期-Linux内核的分布式编译(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了用源码包安装distcc的方法,这一期我们尝试用distcc对Linux4.19.90内核进行分布式编译。Linux内核的分布式编译我们尝试用同一个子网中的三台服务器对Linux 4.19.90版内核做分布式编译。首先确定这三台服务器的内网ip分别为172.16.0.16、172.16.0.9和172.16.0.13,对应...
2020-04-03 23:06:57
280
原创 第十三期-Linux内核的分布式编译(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心上一期中我们介绍了Linux内核模块依赖图的绘制方法,这一期中我们将介绍Linux内核的分布式编译方法和分布式编译工具distcc的安装过程。Linux内核的分布式编译分布式编译是指将源程序通过网络中的多台计算机的协同编译过程编译成目标程序的技术。分布式编译一般通过TCP或SSH等协议将编译任务分配至网络中不同的计算机上,使这些计算机协同完成...
2020-04-03 22:41:59
410
原创 第十二期-Linux内核模块依赖关系图绘制(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们介绍了如何查看Linux内核中各个模块之间的依赖关系,这一期我们将介绍一下根据模块的依赖关系如何绘制模块依赖图。使用freemind绘制模块依赖图Freemind是一款常用的思维导图绘制软件,可以使用freemind来绘制模块依赖图。在Ubuntu 16.04环境下运行命令:sudo snap install freemind...
2020-04-03 22:21:37
1768
原创 第十一期-Linux内核模块依赖关系图绘制(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们以Linux网络模块中的CAKE系统为例,介绍了对Linux补丁源码的分析方法,这一期中我们将介绍如何查看Linux内核中各模块的依赖关系。一、查看Linux内核模块依赖关系Linux内核中各个模块之间有相互依赖的关系,表现为一个模块中的文件可以包含另一个模块中的头文件,从而实现对其它模块中定义的函数和变量的调用。为了查看模...
2020-04-03 21:44:02
1475
1
原创 第十期-Linux内核补丁源码分析(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分析方法。一、Linux内核补丁源码分析在软件工程中,软件的数据流是对软件进行结构化分析的重要分析对象。结构化分析可以用于软件工程的需求分析阶段,用于产生符合用户需要的需求规格文档,其思想对我们分析...
2020-04-03 21:24:25
4405
原创 第九期-Linux内核补丁源码分析(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们介绍了Linux内核编程环境,在这一期中,我们希望通过实例来介绍如何分析Linux内核的补丁。一、Linux内核补丁在“Linux内核发展史”中,我们简要介绍了Linux内核发展中各个版本的主要更新内容。内核的更新主要是通过补丁(patch)来实现的,社区开发人员向内核代码的git仓库提交补丁文件,补丁文件中包含了对内核代码的...
2020-04-03 20:46:02
308
原创 第八期-Linux内核编程环境(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们介绍了Linux内核编译方法,这一期我们用一个例子来介绍如何向Linux内核中增加一个模块。一、LKM内核模块LKM是Loadable Kernel Module的缩写,意思是可加载内核模块。它有点儿像动态链接库,可在运行时加载,成为内核代码和数据的一部分,访问全部内核地址空间,也可运行时动态卸载(需要解决依赖关系,并释放内存...
2020-04-03 18:26:16
211
原创 第七期-Linux内核编程环境(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们介绍了Linux内核的源码结构,这一期我们介绍Linux内核编程环境,首先介绍的是Linux内核的编译方法。一、Linux内核编译方法本期中我们以Linux 4.19.94版内核来介绍内核编译的方法和流程。首先,运行命令:wget https://cdn.kernel.org/pub/linux/kernel/v4.x/l...
2020-04-03 18:04:58
344
原创 第六期-Linux内核源码结构(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们按照openEuler内核的目录结构简要介绍了openEuler内核目录中各个子目录的功能,这一期我们将简要介绍Linux内核的基本功能和抽象层级。一、Linux内核Kernel Map简介Linux内核的Kernel Map从功能上将Linux内核划分为不同功能的区域,并展示了不同区域中函数互相之间的调用关系。下图展示了Li...
2020-04-03 17:42:00
341
原创 第五期-Linux内核源码结构(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心在上一期中,我们介绍了Linux内核发展的历史,也介绍了与其相关的UNIX和GNU的相关知识。从这一期开始,我们将介绍Linux内核的源码结构。我们将先根据Linux源码的目录结构进行分析,到本文章发布前,Linux 4.19的最新版本为Linux 4.19.94,我们将依据openEuler开源社区源码并参考Linux 4.19.94版内核源码...
2020-04-03 17:30:37
360
原创 第四期-Linux内核发展史(3)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心这一小节我们主要介绍Linux系统应用程序的主要来源——GNU。一、GNULinux包含系统内核和提供系统服务和工具的应用程序两个部分。Linux所使用的应用程序是由许多程序元编写并自由发布的。Linux支持自由软件的概念,即软件本身不应受限,它们应遵守GNU(GNU是GNU’s Not UNIX的递归缩写)通用公共许可证(GPL)1。软件通...
2020-04-03 17:15:36
295
原创 第三期-Linux内核发展史(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心Linux是由赫尔辛基大学的Linus Torvalds开发的,在系统开发期间得到了因特网上广大UNIX程序员的帮助。它最初只是受Andy Tanenbaum教授的Minix(—个小型的类UNIX系统)启发而开发的一个程序,纯属个人爱好,但后来它逐步发展成为一个完整的系统。Linux的成功来源于其之前操作系统和应用软件的已有工作,主要是UNIX和...
2020-04-03 15:56:09
499
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人