ARM64 架构基础
原图
ARM64 架构介绍
ARMv8-A 架构介绍
ARMv8-A 是 ARM 公司发布的第一代支持 64 位处理器的指令集和架构。ARMv8-A 架构除了提高了处理能力外,还引入了很多吸引人的新特性。
具有 64 位宽的虚拟地址空间。
提供 31 个 64 位宽的通用寄存器,可以减少对栈的访问,从而提高性能。
提供 16KB 和 64KB 的 page,有助于降低 TLB 的未命中率(miss rate)。
具有全新的异常处理模型,有助于降低操作系统和虚拟化的实现复杂度。
具有全新的加载-获取、存储-释放指令(load-acquire,store-release instruction),专为 C++11 以及 Java 内存模型而设计。
ARM64 的基本概念
ARM 处理器实现的是精简指令集计算机(Reduced Instruction Set Computer,RISC)架构。本节介绍 ARMv8-A 架构中的一些基本概念。
处理单元: ARM 公司的官方技术手册中提到了一个概念,可以把处理器处理事务的过程抽象为处理单元(Processing Element,(PE ...
Linux 中断子系统(七)WorkQueue
原图
概述
工作队列不完全是中断处理程序的下半部。内核的很多模块需要异步执行函数,这些模块也可以创建一个内核线程来异步执行函数。但是,如果每个模块都创建自己的内核线程,会造成内核线程的数量过多,内存消耗比较大,影响系统性能。所以,最好的方法是提供一种通用机制,让这些模块把需要异步执行的函数交给工作队列执行,共享内核线程,节省资源。
实现(扩展🙈)
首先介绍一下工作队列使用的术语。
work:工作,也称为工作项。
work_queue:工作队列,就是工作的集合,work_queue 和 work 是一对多的关系。
worker:工人,一个工人对应一个内核线程,我们把工人对应的内核线程称为工人线程。
worker_pool:工人池,就是工人的集合,工人池和工人是一对多的关系。
pool_workqueue:中介,负责建立工作队列和工人池之间的关系。工作队列和 pool_workqueue 是一对多的关系,pool_workqueue 和工人池是一对一的关系。
数据结构
工作队列分为两种。
绑定处理器的工作队列:默认创建绑定处理器的工作队列,每个工人线程绑定到一个处理器
不绑定 ...
Linux 中断子系统(六)Tasklet
原图
为什么有 tasklet
linux kernel 已经把中断处理分成了 top half 和 bottom half,看起来已经不错了,那为何还要提供 softirq、tasklet 和 workqueue 这些 bottom half 机制。
workqueue 和 softirq、tasklet 有本质的区别:
workqueue 运行在 process context,而 softirq 和 tasklet 运行在 interrupt context。因此,出现 workqueue 是不奇怪的,在有 sleep 需求的场景中需要。
softirq 更倾向于性能。软中断的种类是编译时静态定义的,在运行时不能添加或删除,同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区。
tasklet 更倾向于易用性。Tasklet 可以在运行时添加或删除,一个 Tasklet 同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。
数据结构
Tasklet 的数据结构如下:
12345678910111213<includ ...
Linux 中断子系统(五)SoftIRQ
原图
软中断的定义
软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个 softirq_actior 实例,softirq_action 实例的成员 action 是处理函数。
123456789101112131415161718<kernel/softirq.c>static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;...enum{ HI_SOFTIRQ=0, TIMER_SOFTIRQ, NET_TX_SOFTIRQ, NET_RX_SOFTIRQ, BLOCK_SOFTIRQ, IRQ_POLL_SOFTIRQ, TASKLET_SOFTIRQ, SCHED_SOFTIRQ, HRTIMER_SOFTIRQ, RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SO ...
Linux 中断子系统(四)中断驱动实现
原图
数据结构
理解一个软件架构最重要的是要理清楚里面的数据结构的内容以及数据结构之间的关系,在本文中列出数据结构之前先来说明几个问题。首先是中断控制器 irq controller 这个在 arm 上一般是 gic,有可能会出现 irq controller 集联的情况,但是一般情况下是一个 controller,一个 controller 上有很多中断线,irq line 一般就是连接到 gpio 控制器上的,在一个中断线上可能有多个设备(共享中断)action,那么就涉及到这几种数据结构,描述中断控制器的数据结构可以组成链表,描述中断线 irq line 的数据结构可以组成链表,挂在中断线上的中断设备可以组成链表关系。 除此之外硬件中断号于 linux 中断号之间有一个映射关系,也需要抽象出数据结构来描述。下面看下 linux 内核下对中断的抽象出的数据结构,如下: 原图
irq_desc(描述中断线连接中断设备和中断控制器)
irq_desc 是中断描述符也就是用于描述硬件中断线的数据结构。他一方面通过 irq_data 连接中断控制器,一边连接中断设备,中断 ...
Linux 中断子系统(三)Linux 中断处理过程
原图
中断控制器
ARM 公司提供了一种标准的中断控制器,称为通用中断控制器(Generic IntermurController,GIC)。目前 GIC 架构规范有 4 个版本:v1~v4。GICv2 最多支持 8 个处理器。GIC v3 最多支持 128 个处理器,GICv3 和 GICv4 只支持 ARM64 处理器。
GICv2 控制器的两个主要功能
分发器(Distributor):系统中所有的中断源连接到分发器,分发器的寄存器用来控制单个中断的属性:优先级、状态、安全、转发信息(可以被发送到哪些处理器)和使能状态。分发器决定哪个中断应该通过处理器接口转发到哪个处理器
处理器接口(CPU Interface):处理器通过处理器接口接收中断。处理器接口提供的寄存器用来屏蔽和识别中断,控制中断的状态。每个处理器有一个单独的处理器接口。软件通过中断号识别中断,每个中断号唯一对应一个中断源
中断有以下 4 种类型
软件生成的中断(Software Generated Interrupt,SGI):中断号 0~15,通常用来实现处理器间中断(Inter-Processor I ...
WordPress搭建博客
准备 LAMP 环境
安装wordpress
12wget https://cn.wordpress.org/latest-zh_CN.zipunzip latest-zh_CN.zip
安装Mysql
123sudo apt install mysql-server -ysudo systemctl start mysqlsudo systemctl enable mysql
修改密码权限
12345678910111213141516171819202122232425262728293031cat /etc/mysql/debian.cnf[client]host = localhostuser = debian-sys-maintpassword = ROmgNW5hP8tsSwrBsocket = /var/run/mysqld/mysqld.sock[mysql_upgrade]host = localhostuser = debian-sys-maintpassword = ROmgNW5hP8tsSwrBsocket = /va ...
Linux 中断子系统(二)ARM64 的异常处理过程
原图
异常级别
通常 ARM64 的进程执行在 EL0 级别,内核执行在 EL1 级别。
虚拟机是现在流行的虚拟化技术,在计算机上创建一个虚拟机,虚拟机里可以运行一个操作系统。常用的开源虚拟机管理软件是 QEMU,QEMU 支持基于内核的虚拟机 KVM,KVM 的特点是直接在处理器上执行客户机的操作系统,所以虚拟机的执行速度很快。
ARM64 架构的安全扩展定义了两种安全状态,正常世界和安全世界,两个世界只能通过异常级别 3 的安全监视器切换。
异常类型
中断
在 ARM 处理器中,FIQ(Fast Interruptre Quest)的优先级要高于 IRQ(Interrupt ReQuest)。在芯片内部,分别由 IRQ 和 FIQ 两根中断线连接到中断控制器再连接到处理器内部,发送中断信号给处理器。
中止
中止(abort)主要有指令中止(instruction abort)和数据中止(data abort)两种,通常是因为访问外部存储单元时发生了错误,处理器内部的 MMU(Memory Management Unit)能捕获这些错误并且报告给处理器。指令中止是指当处理器尝试 ...
Linux 中断子系统(一)综述
原图
硬件链接相关描述
在上图中主要分为三部分,产生中断的外部设备(中断源)、用于管理中断的中断控制器以及处理中断信号的 cpu。
中断处理流程
在 ARM 处理器上会有一个中断向量的连续地址,一般是零地址开始,之后地址每增加 1 的地址上存放一条跳转指令,用于处理不同的中断信号,当有不同的中断发生时就到对应的地址执行跳转指令,而具体不同的中断信号就在不同中断标号位置进行处理。
保存现场(当前线程环境)— 跳转执行中断服务程序 — 返回恢复现场。
Linux 系统对中断处理的方式
首先需要先明确几个问题:
中断处理过程中是关全局中断的,也就是中断程序处理期间不能响应新的中断。
基于第一点,Linux 内核不允许中断嵌套,其实第一点就已经决定了中断不能嵌套。
基于以上两点,当 Linux 系统的中断任务比较多的时候系统响应就会有很大延迟,为此 Linux 系统将中断设计为上半部和下半部,上半部处理紧急的必须要处理的任务而耗时的不紧急的任务放到中断下半部来处理,中断下半部就是普通的软件程序(但是有一点区别就是 softirq 和 tasklet 运行在中断上下文,而 workqu ...
工具推荐
效率类
Notion
Notion 是一款提供笔记、任务、数据库、看板、维基、日历和提醒等组件的应用程序。用户可以将这些组件连接起来,来创建自己的系统,用于知识管理、笔记记录、数据管理、项目管理等。这些组件和系统可以单独使用,也可以与他人进行跨平台协作。Notion
Page
Notion 的 Page(Page 无处不在)可以创建各种 Block,可以创建链接到其他文章,可以创建链接到 Database,因此 Page 可以用于管理一切想要管理的东西。实际上 Page 是 Notion 的页面基本组成元素与层级关系,作为文件夹,作为文章皆可。
Block
notion 中最基本的数据单位被称为“块”(block),所有的数据都是一个又一个的块结构,可以对这些块结构进行任意的排列组合,按照自己的工作需要进行设计布局,并且可以同步到所有的设备端。notion 提供了超过 40 种块数据类型以供选择,从最基本的文字,到图片、文件、视频、网页、等媒体 ,更有表格、数据库、任务追踪等复杂结构等等。 下面是一些基本的 Block 介绍:
列表 notion 提供了几种基本的列表可以进行使用, ...