技术类
SoC (System on Chip)
通常指系统级芯片,是一种集成电路(IC),将多个电子元件的功能集成到一个单个芯片上,SoC通常包括以下几个主要的组件:
- 中央处理器(CPU)
- 图形处理器(GPU)
- 内存控制器
- 输入/输出(I/O)接口
- 专用硬件加速器
- 电源管理单元(PMU)
- 其他模块
QCS(Quality Control System)
QCS是一种系统或者框架,用于确保产品或者服务在开发和交付过程中满足设定的质量标准。
Quality Control System(质量制系统)的关键要素
- 标准和规范:设定明确的质量标准和规范,作为质量控制的基准。
- 过程控制:通过对生产或服务过程的监控和管理,确保各个环节都符合质量要求。
- 检测和监测:在各个关键阶段进行质量检测和监测。
- 统计过程控制(SPC):使用统计方法来分析和控制生产过程的质量。
- 文档和记录:保存详细的质量记录,以便追溯和审核。
- 质量手册:描述质量控制系统的总体框架和操作指南。
- 检查报告:记录具体的检查和测试结果。
- 纠正和预防措施:针对发现的问题采取纠正措施,并实施预防措施防止问题再次发生。
- 持续改进:通过不断的评估和改进,提高质量控制系统的效率和效果。
QCS的主要工具和方法
- 检查表和审核清单:用于系统性地检查各个环节是否符合质量标准。
- 流程图和控制图:用于可视化过程并识别潜在的质量问题。
- 六西格玛:通过减少缺陷和变异来提高过程的效率和质量。
- ISO 9001认证:一种国际公认的质量管理体系标准,企业通过认证可以证明其质量管理系统符合国际标准。
QCS的应用领域
- 制造业:用于确保产品从原材料到最终成品的整个生产过程中都符合质量标准。
- 服务业:确保提供的服务符合客户的期望和行业标准。
- 医疗行业:用于监控和提升医疗设备和服务的质量,保障病人的安全。
- 软件开发:用于监控软件开发过程,确保交付的软件没有重大缺陷和漏洞。
- 食品和饮料:确保食品和饮料的生产符合安全和卫生标准。
实施QCS的好处
- 提高产品和服务质量:通过系统化的控制和管理,确保产品和服务的一致性和高质量。
- 降低成本:减少因质量问题引起的返工、废品和客户投诉,从而降低成本。
- 增强客户满意度:提供高质量的产品和服务,提高客户满意度和忠诚度。
- 竞争优势:通过持续的质量改进,增强企业在市场中的竞争力。
- 合规性:确保企业符合相关的法律法规和行业标准。
ISA (Instruction Set Architecture)
ISA是指指令集架构,定义了处理器可以执行的所有指令,以及这些指令的格式、操作和效果。ISA是硬件和软件之间的接口,为编译器和程序提供了一个抽象层,使他们能够在特定处理器上运行。
主要组成部分
- 指令集:一组机器语言指令,包括算术运算、数据传输、控制流等操作。
- 寄存器集:处理器中用于临时存储数据的高速存储单元。
- 寻址模式:指令如何指定操作数的位置,包括直接、间接、寄存器、立即数等方式。
- 数据类型:处理器支持的数据类型,例如整数、浮点数、向量等。
- 存储器架构:包括内存的组织和访问方式。
- 中断和异常处理:处理器响应和处理中断和异常的机制。
ISA 的作用
- 硬件设计:为处理器的设计和实现提供规范。
- 软件开发:为编译器和操作系统等软件提供基础,使得程序能够在不同的处理器上运行。
- 性能优化:通过特定的指令和优化技术,提高程序的执行效率。
例子
常见的ISA包括:
- x86:由英特尔和AMD等公司使用,广泛应用于PC和服务器。
- ARM:由ARM公司设计,广泛应用于移动设备和嵌入式系统。
- MIPS:由MIPS Technologies设计,主要用于嵌入式系统和网络设备。
- RISC-V:一种开源的指令集架构,受到广泛关注和应用。
IPC(Interprocessor Communication)
IPC指跨核心数据交换。
RPC(Remote Procedure Call)
RPC指远程过程调用,是一种通信协议,允许一个程序调用另一个地址空间(通常是网络上的另一台计算机上)的过程或者函数,就像调用本地过程一样,而不需要显示地处理网络细节。
远程过程调用(RPC)的工作原理:
- 客户端调用:客户端程序发起一个远程过程调用,就像调用本地过程一样。
- 传输过程:客户端将调用的信息(如参数)封装成网络消息,并发送给服务端。
- 服务端处理:服务端接收到消息后,解析调用信息,并执行相应的过程或函数。
- 结果返回:服务端将执行结果封装成响应消息,发送回客户端。
- 客户端接收:客户端接收到响应消息,提取执行结果,继续执行后续逻辑。
RPC 的实现可以基于不同的协议和技术,如基于HTTP的RESTful API、基于TCP的自定义协议,或者更高级的RPC框架如gRPC、Apache Thrift等。
PD(protection domain)
高通Hexagon SDK(DSP)中的一个定义。因为DSP是一种实时处理器,所以在DSP软件架构种存在不同的PDs(projection domain)。这些PD确保了内核软件的稳定性和高通专有硬件信息的安全性。DSP种有多种PD:
- Kernel: 可以访问所有PD的内存。
- Guest OS:可以访问他自己PD的内存,用户PD的内存,和一些系统寄存器。
- User:只能访问他自己PD的内存。 DSP系统库根据需要向客户操作系统或内核进行系统调用,以访问操作系统服务。FastRPC客户端程序在用户保护域(PDs)中运行。
VTCM(Vector Tightly Coupled Memory)
VCTM(向量紧耦合内存)是一种位于处理器核心附近、访问速度非常快的内存。通常用于存储对于性能要求高的数据和指令,用于降低存储器访问延迟。
相比较于L2缓存,它提供了大约两倍的带宽,并且能够显著减少存储-加载延迟。这使得处理器能够更有效的处理需要大量数据传输和快速访问的操作。
功能和需求:
- Scatter-Gather Lookup Operations:VTCM对于执行分散-聚集查找操作至关重要。这些操作通常涉及从不同位置收集或分散数据,要求存储器能够快速访问多个非连续的内存位置。
- HMX Engine使用:HMX引擎通常需要快速访问大量数据和矩阵操作,因此也需要VTCM提供的高带宽和低延迟。
ALU(Arithmetic Logic Unit)
算数逻辑单元,计算机中的关键部件,用于执行各种算数运算(加法、减法、乘法、除法)和逻辑运算(如与、或、非),是CPU中的核心部件,通常和寄存器、控制单元共同工作。
- 算术运算
- 加法/减法:ALU可以执行整数和浮点数的加法和减法运算。
- 乘法/除法:某些处理器中,ALU也能执行乘法和除法,但是在某些情况下,这些操作可能由专门的乘法器和除法器完成。
- 逻辑运算
- 与、或、非:ALU可以执行逻辑运算,用于处理二进制数据的位操作。
- 位移操作
- ALU可以执行位移操作,如左移、右移,用于对数据进行位级别的操作和控制。
- 比较操作
- ALU还可以执行比较操作,比如等于、不等于、大于、小于等,用于判断数据之间的关系。
Write-through(写直通)
例如L1 is write-through:表示L1缓存是一种写直通的缓存结构,意味着每次对缓存的写操作都会直接传递到主存,而不是首先写入缓存再根据策略同步到主存。这种色痕迹简化了一致性的维护,因为主存中总是包含了最新的数据。
HLOS(High-Level Operating System)
HLOS 指高级操作系统。
NPU(Neural Processing Unit)
NPU是一种专门用于加速深度学习和人工智能任务的处理器,设计用于高效执行神经网络计算。
主要有以下一些特点:
- 高效:向量运算、矩阵运算的硬件优化使得其能够高效运行神经网络和高并行度的运算。
- 低功耗:通常以低频率运行,功耗较低,一般处于常唤醒状态,有及时性。
DSP(Digital Signal Processor)
数字信号处理器。
QRD(Qualcomm Reference Design)
QRD表示高通参考设计。是高通公司为设备制造商提供的一套完整的硬件和软件解决方案,用于加速新设备的开发和上市过程。
IoT(Internet of Things)
物联网
DMA(Direct Memory Access)
DMA是一种“直接内存访问技术”,允许外部设备直接与系统内存交换数据,无需经过CPU干预。
关于DMA Memory共享内存的理解:因为可以绕过CPU直接访问内存,所以当创建了DMA buffer之后,从本质上,这块内存从各种设备上都可以直接访问,也就间接实现了内存共享。
FARF(FastRPC Asynchronous Remote Function)
FARF是一套开发工具,主要用于在其Hexagon DSP上开发和优化应用程序。
IDL(Interface Description Language)
IDL是指一种通用语言,用来描述两个processor之间的接口。具体到高通Hexagon SDK中,就是描述了应用处理器(CPU)和Hexagon DSP之间通过FastRPC交流的接口。
MMU(Memory Management Unit)
MMU是指芯片中的内存管理单元,主要负责以下任务:
- 地址转换:MMU将虚拟地址转换为物理地址。现代计算机系统通常使用虚拟内存管理,允许程序使用虚拟地址空间,而不是直接操作物理内存地址。MMU通过页表等数据结构将虚拟地址映射到物理地址。
- 内存保护:MMU提供内存保护机制,防止一个程序访问另一个程序的内存。这包括设置不同权限(只读、读写、执行)以防止非法内存访问,从而提高系统的稳定性和安全性。
- 分页和分段:MMU支持内存分页和分段管理。分页将内存划分为固定大小的页,分段将内存划分为大小可变的段。分页和分段都用于简化内存分配和管理,提高内存利用率。
- 缓存管理:MMU在某些系统种也负责缓存管理,决定哪些内存应该被缓存。提高系统性能,减少内存访问延迟。
- 地址空间隔离:MMU帮助实现进程之间的地址空间隔离,每个进程都有独立的地址空间防止进程之间的相互干扰。
VA(Virtual Address space)
VA表示虚拟地址空间
PMU(Performance Monitoring Unit)
profile相关的,性能监控单元。
QuRT(Qualcomm Hexagon RTOS)
内容见Hexagon SDK 5.0 docs/software/os/os_support_dsp.html
简介
QuRT是一个简单的运行在DSP上的实时操作系统,支持多线程、线程间沟通、同步、中断处理和内存管理。
DSP芯片可以同时执行固定个数个线程,这些线程被称为硬件线程(hardware threads)。例如SM8150和SM8250的cDSP包含了4个硬件线程,而Lahaina的cDSP包含了6个硬件线程,这些硬件线程是共享资源的,例如Lahaina共享了4个HVX context,1个HMX context,和内存子系统。QuRT提供了使大量软件线程共享使用这些硬件资源的能力。
线程调度
和通常的操作系统一样,QuRT也使用了一个scheduler来决定一时刻那个线程运行。
线程优先级
QuRT使用0-255表示线程优先级,越小的值表示优先级越高。这个数值主要用在线程调度和资源管理(使用Compute Resource Manager)
context switch
所有线程以状态Ready初始化,系统启动时,scheduler选择优先级最高的线程运行,并将其状态置为Running。将一个线程暂停(suspend)并恢复(resume)另一个线程的操作被称为context switch。通常以下几种情况会导致context switch:
- 创建或退出一个线程
- 改变线程优先级
- 等待或释放一个mutex/semaphore
- waiting on/resuming from 信号(signal)、屏障(barrier)、条件变量(condition variable)
- 管道读写
- 处理(servicing)一个中断
调度策略
QuRT:1)没有时间分片(time-slice)的方式执行同优先级线程的机制。2)不会尝试让低优先级的线程运行(在高优先级线程存在的情况下)。3)只有当发生context switch的时候才会让处在Ready状态下的X个(X表示硬件线程个数)最高优先级的线程运行。
线程同步策略
TODO:
MUTEX
SIGNALS
SEMAPHORES
BARRIERS
CONDITION VARIABLES
内存管理
见文档 docs/doxygen/HAP_mem/index.html
缓存机制
DSP有两层缓存,对于有HVX的cDSP,L1 cache只供标量单元(scalar unit) 使用,L2 cache作为标量单元的第二层缓存和HVX的第一层缓存。
PMU 管理
性能监控单元,和profile相关。
LE(Linux Embedded)
根据上下文语境,比如出现了"Android target",那么LE的含义通常是指Linux Embedded,表示嵌入式Linux。
DCVS(Dynamic Clock Voltage Scaling)
DCVS是高通的动态时钟电压调节服务,主要是通过动态调整DSP时钟频率和工作电压来优化能耗和性能。
HAP(TOGET)
HAP主要是在Hexagon SDK中incs/HAP_*.h的一些函数,似乎是用于进行DSP相关配置的接口。
HTA
支持量化8-bit,16-bit执行,在SM7150/SM7250/SM8150/SM8250以及之前的设备上有,后续设备为HTP。
HTP
SM8350(888)之后的,HMX,HVX,VTCM,V68,V69,V73,V75,V79是HTP version。 8-bit(8w8a), 16-bit(8w16a) fix-point,16w16a在部分设备上可以。 unsignedPD只能够访问有限的资源。 SM8750 有一个systemPD,有着unsignedPD的属性,并且可以访问几乎所有的资源。
HAL(Hardware Abstraction Layer)
HAL是一种软件层,他为硬件提供了一个抽象接口。
ION buffers(估计是IO No)
Zero-Copy
Android上,为了降低FastRPC的开销,需要减少内存的拷贝。ION buffers(Android targets)的作用是实现CPU和DSP之间的内存共享,使得不需要进行额外的内存拷贝。
对于传入DSP的non-ION buffer,FastRPC框架会自动进行拷贝。对于没有注册到FastRPC的ION buffer,会被视作non-ION buffer并且进行额外的一次拷贝。RPCMEM库提供了创建并自动注册到FastRPC的共享内存方法。提前申请的ION buffer可以通过调用FastRPC库中提供的remote_register_buf()方法,注册内存到FastRPC库。
DMA-BUF
Android上共享内存的抽象。
ABI(Application Binary Interface)
ABI是应用程序二进制接口,它定义了应用程序和操作系统之间的低级接口,特别是应用程序的编译器和处理器架构之间的接口。ABI包含了以下几方面的内容:
- 数据类型的大小和对齐:不同数据类型(如整形、浮点型)在内存中的大小和对齐方式。
- 函数调用约定:函数的参数如何传递(通过寄存器还是堆栈)、返回值如何传递、函数调用过程中的堆栈管理等。
- 系统调用接口:操作系统提供的系统调用(如文件操作、内存管理等)的具体实现细节。
- 库文件格式:静态库和动态库的文件格式以及它们如何被链接和加载。
Android中,ABI也有类似的含义,但是它通常是指平台支持的不同架构。Android支持多种处理器架构,每种架构都有自己的ABI。例如:
- armeabi:针对ARMv5TE以及更早的架构。
- armeabi-v7a:针对ARMv7-A架构,支持硬件浮点运算。
- arm64-v8a:针对64位的ARMv8-A架构。
API(Application Programming Interface)
API是指应用程序编程接口,它是一组定义和协议,用于构建和集成软件应用程序。
TUN(Network TUNnel)
虚拟网络设备,工作在网络层(IP层),TUN设备的主要作用是将IP数据包从用户空间传递到内核空间,或者反过来。
工作原理:
- TUN模式通过创建一个虚拟的TUN网络设备,系统的网络流量会被重定向到这个虚拟设备上。
- Clash监听TUN设备,并根据配置的规则决定如何处理这些流量(如直接通过、通过代理服务转发等)。
- 处理后的流量在返回到系统的网络栈,最终发往目标地址。
ASM(Assembly language)
ASM通常指汇编语言(Assembly language)。是一种低级语言,用于编写与计算机硬件直接交互的程序。
BLAS(Basic Linear Algebra Subprograms)
一个用于执行基本线性代数操作的库。这些操作包括向量和矩阵的加法、标量乘法、向量点积、矩阵乘积等。 主要有三个层次的实现:
- Level 1: 基本向量操作,例如向量加法、标量乘法和点积。
- Level 2: 矩阵-向量操作,例如矩阵-向量乘积。
- Level 3: 矩阵-矩阵操作,例如矩阵乘积。
DSL(Domain Specific Programing Language)
DSL是指领域专用语言,是一种编程语言,专门设计用于特定领域或应用程序的特定任务。与通用编程语言(Python、Java、C++)不同,DSL是为了解决特定领域中的问题而量身定制的,因此在该领域中更加高效和易用。
Intrinsics
Intrinsics在Hexagon SDK中是指,DSP ASM编程的简化,可以直接在C中使用,而不用回去写汇编了,方便编程。
立即数(Immediate Value)
是计算机程序中直接嵌入指令中的常数值。与寄存器或内存地址不同,立即数不需要额外的内存访问,他们直接包含在指令本身,这使得立即数在执行的时候更加高效,因为处理器可以直接使用这些值而不需要额外的访存操作。
立即数的特点:
- 直接嵌入指令:例如
ADD R1, R2, #5中,#5就是一个立即数。 - 快速访问:由于立即数是指令的一部分,处理器可以立即使用它们,无需访问寄存器或内存。
- 有限位:立即数的大小通常受到指令格式的限制。例如许多32位架构中,立即数可能限制在16位或12位。
Gainmap
Gainmap是一种用于高动态范围(HDR)图像处理的技术。它旨在通过调整图像的亮度和对比度来优化图像的视觉效果,特别是将HDR图像转换为标准动态范围(SDR)图像的时候。Gainmap可以帮助在不同的显示设备上呈现最佳的的图像质量。以下是对Gainmap的详细介绍:
Gainmap是一张与原始图像对应的辅助图像,包含了调整图像亮度和对比度所需的信息。它通常用于以下场景:
- HDR到SDR转换:在将HDR图像转换为SDR图像时,Gainmap提供了必要的信息以保持图像的细节和视觉质量。
- 图像增强:通过使用Gainmap,可以提高图像的对比度和亮度,从而改善视觉体验。
TA(Trusted Application)
受信任的应用程序,这个概念通常是在OEMs的手机中的应用来讲的。Qualcomm的Secure DSP中涉及到了这个概念。
SSR(Subsystem Restart)
高通DSP相关的一个概念,指子系统的重启(通常是指QuRT)。
ROI(Region of interest)
ROI表示感兴趣的区域。
UBWC(Universal Bandwidth Compression)
UBWC是指通用带宽压缩,是一种用于图像或者视频处理的技术,主要用于提高带宽效率和降低功耗,通常在移动设备的图形处理单元(GPU)和显示控制器中使用,以减少数据传输所需要的带宽,从而提高系统性能和电池寿命。
UBWC使用的是无损压缩技术,这种压缩方案确保压缩和解压过程中,图像或视频数据不会失真,保留了原始数据的完整性,详细信息自行了解。
ISP(Image Signal Processor)
ISP是指图像信号处理器,是处理和优化图像数据的专用硬件组件,通常嵌入在相机传感器模块或独立的图像处理芯片中。
ISP从图像传感器捕获的原始数据,执行去马赛克、白平衡、去噪、色彩校正、自动曝光、自动对焦等操作。专注于将原始图像数据转换为高质量的数字图像和视频。
RDP(Remote Desktop Protocol)
是windows远程桌面协议,允许用户通过远程桌面协议连接到远程计算机或虚拟机。
Unrolling Loop(循环展开)
循环展开是一种优化技术,旨在减少循环控制的开销,增加程序的并行性,进而提高程序的执行效率。通过展开循环,可以减少循环中的分支跳转、提高流水线效率,并减少循环体中的指令依赖。 举个例子:
// 原始循环
for (int i = 0; i < 10; ++i) {
a[i] = a[i] * 2;
}
// 展开之后的循环,主要是降低循环的次数。
for (int i = 0; i < 10; i += 2) {
a[i] = a[i] * 2;
a[i + 1] = a[i + 1] * 2;
}FTTR(Fiber to the Room)
光纤入户,意思是用光纤替换网线铺设到全屋。
SSE(Streaming SIMD Extensions)
SSE是指流式单指令多数据扩展,由英特尔(Intel)引入的的一组指令集扩展,用于x86架构的处理器。
- SIMD(Single Instruction, Multiple Data):SIMD是一种并行计算的方法,在一个指令周期内对多个元素进行相同的操作。SSE使用SIMD来加速数据并行任务,例如向量和矩阵操作、图像处理和音频处理。
- 寄存器:SSE引入了一组新的128位寄存器(XMM寄存器),每个寄存器可以存储多个数据元素(如4个32位浮点数或16个8位整数)。
- 指令集:SSE指令集包含用于浮点和整数运算的指令,可以对寄存器中的数据进行并行计算。常见的指令包括加法、减法、乘法、除法、平方根、逻辑运算和数据搬移等。
AVX(Advanced Vector Extensions)
AVX也是英特尔(Intel)引入的用于x86架构处理器的指令集扩展,旨在提高并行计算的性能。AVX增加了更多的浮点和整数指令运算,以及大位宽的寄存器。
TUN(隧道)
计算机网络中,隧道(tunnel)是一种技术,用于通过另一种网络协议在两个或多个网络之间传输数据。隧道的基本思想是将一种协议的数据封装在另一种协议的数据包中进行传输,从而实现跨域不同网络环境的通信。
隧道的基本概念:
- 封装(Encapsulation):隧道通过将数据包封装在另一种协议的数据包中来进行传输。例如,VPN 隧道可以将 IP 数据包封装在加密的隧道协议中,如 IPsec 或 OpenVPN。
- 终端点(Endpoints):隧道有两个端点,一个在发送数据的一端,另一个在接收数据的一端。数据从一个端点进入隧道,并在另一个端点解封装。
- 透明传输:隧道可以使数据在传输过程中保持透明,接收方能够如同直接从发送方接收数据一样,不需要知道隧道的存在。
隧道的类型
VPN 隧道:
- OpenVPN:使用 SSL/TLS 协议进行加密和认证,广泛用于创建安全的远程访问和站点间 VPN 连接。
- IPsec:在 IP 层上提供安全性,常用于站点到站点 VPN。
- L2TP(Layer 2 Tunneling Protocol):通常与 IPsec 结合使用,以提供加密和数据完整性。
SSH 隧道:
- 使用 SSH 协议创建加密通道,通过 SSH 服务器传输数据,实现安全的远程访问。
GRE 隧道(Generic Routing Encapsulation):
- 一种通用的隧道协议,用于在不同网络协议之间进行封装。
隧道的用途
- 安全通信:通过隧道传输的数据通常是加密的,确保数据的机密性和完整性,保护数据免受窃听和篡改。
- 远程访问:通过 VPN 隧道,远程用户可以安全地访问公司内网资源,就像直接连接到公司网络一样。
- 网络扩展:隧道可以用于连接不同地理位置的网络,使它们看起来像是一个统一的网络。
- 跨越防火墙和 NAT:隧道可以帮助数据跨越防火墙和网络地址转换(NAT)设备,确保通信的顺畅。
工作原理
- 建立隧道:隧道的两个端点协商并建立连接,通常会进行身份验证和加密协商。
- 数据封装:发送端将原始数据包封装在隧道协议的数据包中。
- 数据传输:封装后的数据包通过网络传输到接收端。
- 数据解封装:接收端将数据包解封装,提取原始数据并进行处理。
通过这些步骤,隧道技术确保了数据在不同网络环境中的安全和透明传输。
Nat loopback(环回)
当通过内部网络访问公网IP映射到的服务时,连接无法成功,是由于路由器不支持Nat loopback,通常需要在路由器中找到对应功能并且开启。或者手动改host或者DNS服务,在内部网络将域名改成内部IP。
SCGI(Simple Common Gateway Interface)
SCGI是一种网络协议,用于将客户端的请求从Web服务器传递给后台应用程序并返回结果。SCGI是一种简单的替代CGI和FastCGI的协议。
请求处理流程
- 当一个客户端发出请求时,Web 服务器接收请求并将其转发给 SCGI 应用程序服务器。
- Web 服务器和 SCGI 应用程序服务器通过一个持久的 TCP 连接或 UNIX 套接字通信。
- 请求数据以一种特定的格式(键值对)被传送到 SCGI 应用程序服务器,应用程序处理请求并生成响应。
- 响应被返回给 Web 服务器,然后 Web 服务器将结果发送回客户端。
Android API Level
在Android开发中,API Level是指Android SDK提供的编程接口版本号,每个Android系统版本都有一个对应的API Level,用来标识该版本的功能和特性。常见的API Level对应的Android版本。
- API Level 33: Android 13
- API Level 32: Android 12L
- API Level 31: Android 12
- API Level 30: Android 11
- API Level 29: Android 10
- API Level 28: Android 9 (Pie)
- API Level 27: Android 8.1 (Oreo)
- API Level 26: Android 8.0 (Oreo)
- API Level 25: Android 7.1 (Nougat)
- API Level 24: Android 7.0 (Nougat)
- API Level 23: Android 6.0 (Marshmallow)
- API Level 22: Android 5.1 (Lollipop)
- API Level 21: Android 5.0 (Lollipop)
- API Level 19: Android 4.4 (KitKat)
Fence
Fence作为一种同步机制,主要用于解决多个设备(如 CPU 和 GPU)之间并发操作时的数据一致性问题。在使用 DMA-buf 进行设备间共享内存时,fence 能确保操作顺序正确,避免数据读取错误或缓存未同步等问题,从而保证数据的一致性。
关于缓存一致性的问题: 因为CPU和GPU设备使用的缓存系统是独立的,各自有各自的缓存机制,为了使得写入到CPU的数据,GPU在读取的时候,数据已经正常写入到物理内存了,需要刷新缓存。GPU -> CPU同样。而Fence的作用就是如此。
AOSP(Android Open Source Project)
AOSP是由谷歌主导的Android开源项目,AOSP包括Android操作系统的所有源码、文档、开发工具和相关资源,允许开发者和设备制造商自由的下载、修改、构建和分发Android系统。
AOSP的目标是为设备制造商、开发者和社区提供一个开源的Android基础,便于他们根据自己的需求定制和优化操作系统。
自行编译的方式:AOSP
DISPLAY
是Linux下的一个环境变量,通常指向了显示服务器,格式一般是格式通常是hostname:display_number.screen_number比如DISPLAY=:1.0
hostname:要连接的主机名,如果是本地主机可以省略。display_number:指的是显示服务器的实例编号(例如,:1表示第二个显示服务器)。screen_number:指的是显示服务器的屏幕编号,默认是0,但有时一个显示服务器可能管理多个屏幕。
ICD(Installable Client Driver)
ICD机制是一种允许操作系统在同一操作系统中动态加载不同厂商驱动的机制,它提供了一个通用接口,应用程序通过这个接口可以调用各个厂商的硬件驱动,而无需关心具体的硬件细节。
在ICD机制下,多个厂商的驱动可以共存,系统会根据当前使用的硬件选择合适的驱动来加载。典型应用包括OpenCL、Vulkan、OpenGL,它们使用ICD机制支持不同类型的计算设备(如CPU、GPU)或图形处理器。
例如Linux下,OpenCL的ICD配置文件就在/etc/OpenCL/vendors/下,N卡驱动安装了的情况下就会有/etc/OpenCL/vendors/nvidia.icd文件存在,文件内容是: libnvidia-opencl.so.1。
GLX(OpenGL Extension to the X Window System)
是一个用在X Windows System(常见于Linux和类Unix系统)上运行OpenGL程序的扩展。他的主要作用是提供OpenGL和X Window System之间的接口,是的应用程序可以在X窗口环境中利用OpenGL进行硬件加速的2D和3D渲染。
CISC、RISC
CISC(complex instruction set computer) :复杂指令集计算机,比如Intel x86、AMD64 RISC(reduced instruction set computer):精简指令集计算机,比如ARM
Android JNI
Android JNI(Java Native Interface)是一个用于在Java代码和本地(native)代码之间进行交互的框架。它允许你在Android应用中调用C或C++编写的native代码。
MB&Mb
- MiB(mebibyte):通常指兆二进制字节,为计算机中的单位,且单位之间进位为$2^{10} = 1024$,所以$1MB=2^{10}KB=2^{20}B=8\times2^{20}bit$
- MB(megabyte):通常指兆字节,进位是$1000$,也就是$1MB=10^{3}KB=8 \times 10^{6}bit$
- Mb(megabit):通常指兆bit,进位是$1000$,也就是$1Mb=10^{3}Kb=10^{6}bit$
GLAD
GLAD是一个OpenGL、OpenGL ES、Vulkan等图形API的加载器生成器,它的主要目的是帮助开发者加载并使用这些图形API的函数指针,从而在应用程序中使用图形功能。
必要性:现代OpenGL中,图形API的函数(例如glDrawArrays、glGenBuffers等)并不是像标准库函数那样直接可用。原因是OpenGL的许多扩展和特性是由显卡驱动支持的,而这些函数的地址需要在程序运行时根据驱动和平台获取。这就是加载器的作用,它负责查询并加载OpenGL函数的入口地址。
ELF(Executable and linkable Format)
ELF是指可执行文件。
GOT(Global Offset Table)
GOT表是一个存储函数实际地址的表。GOT表中的条目最初指向动态链接器的符号解析函数(即便如此,PLT表初跳也不会直接跳过来,细节看下面例子),当解析完成之后,GOT表会更新为动态链接库函数的真实地址,之后程序通过PLT直接使用GOT中的地址来调用目标函数。
PLT(Procedure Linkage Table)
PLT是指过程链接表,是ELF或共享库中用于动态链接函数调用的机制。他的主要功能是程序运行时处理延迟绑定(Lazy binding),帮助程序调用动态链接库中的函数。
PLT是一个跳转表,程序在调用动态库函数的时候,最初通过PLT表进行跳转。PLT负责调用动态链接器来解析函数地址,并保存到GOT表中。
工作原理
初始调用
- 程序第一次调用动态库中的函数的时候,它并不知道函数的实际地址。
- 调用的函数首先会跳转到PLT表中的对应条目,而这个条目会指向动态链接器(dynamic linker)的某个入口的函数。
- 动态链接器负责查找该函数的实际地址,并且将这个地址保存在对应的GOT(Global Offset Table,全局偏移表) 中。
后续调用
- 一旦GOT表中的地址被更新,PLT表的跳转条目就会直接跳转到GOT中存储的真实函数地址
- 因此,第二次及以后调用该函数时,PLT直接通过GOT进行跳转,无需再进行动态符号解析,提升了执行效率。
举个例子
以printf函数为例
- 程序调用动态库函数
printf:- 当程序第一次调用的时候,程序并不知道
printf的真实地址,此时程序跳转到PLT表的printf条目。
- 当程序第一次调用的时候,程序并不知道
- PLT表的首次跳转:
- 每个函数在PLT表中都有一个条目,这个条目会先跳转到PLT表的入口,也叫做第一个PLT段,这个入口用于调用动态链接器的符号解析功能。具体做法是,他调用一个固定的trampoline(跳板)代码段。
- 这个跳板代码会访问GOT表中的一个特殊条目,而这个条目在程序启动时被初始化为指向动态链接器的符号解析函数。因此,PLT表不会直接跳转到GOT表的函数地址,而是通过PLT表中的跳板代码,借助GOT表间接跳转到动态链接器。
- 调用动态链接器:
- 动态链接器(ld-linux.so或其他)接收到这个调用请求之后,会查找
printf函数的真实地址,并将其写入GOT表的相应位置(也就是更新GOT中存储的printf的地址)。
- 动态链接器(ld-linux.so或其他)接收到这个调用请求之后,会查找
- 更新GOT表:
- 在动态链接器找到
printf的地址后,它将该地址写入GOT表中printf对应的条目,之后当程序再次调用printf时,PLT表会直接从GOT表中读取已解析的真实函数地址,而不会再调用动态链接器。
- 在动态链接器找到
- 后续调用:
- 后续对
printf的调用将通过PLT表直接跳转到GOT表,GOT表此时已经存储了printf的真实地址,因此程序会直接跳转到该地址,执行printf函数。
- 后续对
TTL(Time To Live)
TTL是Time To Live的缩写,通常用于计算机网络和其他技术领域。根据上下文,TTL可以有不同的含义:
- 网络中的TTL:IP包中,TTL是一个字段,表示网络数据包在网络中传输时的生存时间,通常以跳数来表示。每经过一个路由器,TTL就会减1,当TTL值减为0时,数据包会被丢弃。这种机制防止数据包在网络中无限循环。
- 缓存中的TTL:在缓存系统中,TTL表示缓存数据的有效期。它规定了数据可以在缓存中存留的时间,当时间到了之后,缓存数据就会被更新或者移除。
- DNS中的TTL:在DNS中,TTL用于指定域名解析记录的有效期。DNS服务器和客户端会在该时间内缓存该记录,过期之后会再次查询以获取最新的解析结果。
ECMA
ECMA script syntax 指的是 ECMAScript 编程语言的语法,ECMAScript 是一种标准化的脚本语言规范。它定义了脚本语言的基本结构和功能,是 JavaScript 的基础。ECMAScript 由欧洲计算机制造商协会(ECMA)发布,最早的版本是 ECMA-262。
HTTP状态码
| 状态码 | 描述 | 含义 |
|---|---|---|
| 1xx | 信息性状态码 | |
| 100 | Continue | 表示客户端应继续发送请求的剩余部分。 |
| 101 | Switching Protocols | 表示服务器同意切换协议。 |
| 2xx | 成功状态码 | |
| 200 | OK | 请求成功,通常是 GET 或 POST 请求的结果。 |
| 201 | Created | 请求成功并创建了新资源,通常在 POST 请求后返回。 |
| 202 | Accepted | 请求已被接受,但尚未处理完成。 |
| 204 | No Content | 请求成功,但没有返回内容。 |
| 205 | Reset Content | 请求成功,但要求客户端重置视图。 |
| 206 | Partial Content | 服务器成功处理了部分 GET 请求。 |
| 3xx | 重定向状态码 | |
| 300 | Multiple Choices | 请求有多个可用的响应,客户端可以选择。 |
| 301 | Moved Permanently | 请求的资源已被永久移动到新位置。 |
| 302 | Found | 请求的资源临时移动到新位置(常用于 URL 重定向)。 |
| 303 | See Other | 建议客户端使用 GET 方法访问另一个 URI。 |
| 304 | Not Modified | 资源未修改,可以使用缓存的版本。 |
| 305 | Use Proxy | 请求的资源必须通过代理访问(不常用)。 |
| 307 | Temporary Redirect | 请求的资源临时转移到另一个 URI,但客户端应继续使用原始请求方法。 |
| 308 | Permanent Redirect | 请求的资源永久转移到另一个 URI,且客户端应继续使用原始请求方法。 |
| 4xx | 客户端错误状态码 | |
| 400 | Bad Request | 服务器无法理解请求,通常因为语法错误。 |
| 401 | Unauthorized | 请求需要用户身份验证。 |
| 403 | Forbidden | 服务器理解请求,但拒绝执行。 |
| 404 | Not Found | 请求的资源未找到。 |
| 405 | Method Not Allowed | 请求方法不被允许。 |
| 406 | Not Acceptable | 请求的资源无法满足客户端的 Accept 头。 |
| 408 | Request Timeout | 请求超时,服务器没有在规定时间内接收到请求。 |
| 409 | Conflict | 请求与服务器当前状态冲突(如版本冲突)。 |
| 410 | Gone | 请求的资源已被永久删除,且没有可用的转发地址。 |
| 415 | Unsupported Media Type | 请求的媒体类型不受支持。 |
| 429 | Too Many Requests | 客户端发送的请求过多,超出了服务器的限制。 |
| 5xx | 服务器错误状态码 | |
| 500 | Internal Server Error | 服务器内部错误,无法完成请求。 |
| 501 | Not Implemented | 服务器不支持请求的功能。 |
| 502 | Bad Gateway | 服务器作为网关或代理时,从上游服务器接收到无效响应。 |
| 503 | Service Unavailable | 服务器暂时无法处理请求,通常因为过载或维护。 |
| 504 | Gateway Timeout | 服务器作为网关或代理时,未能在规定时间内获得上游服务器的响应。 |
时间 ISO 8601 标准
它是一种国际标准的日期和时间表示方式。这种格式广泛应用于网络数据、API 和编程语言中,以确保时间的表示统一且不受时区影响,例如:2024-11-01T06:43:35.398Z
- 2024-11-01: 年-月-日格式,表示2024年11月1日。
- T: 时间的分隔符,表示日期和时间的开始。
- 06:43:35.398: 时:分:秒.毫秒(小数部分表示毫秒数)。
- Z: 表示时间为 UTC 时间(协调世界时,零时区)。这个 Z 是 “Zulu” 时间的缩写,表示 UTC 时间不带时区偏移。
REST API
REST API是基于REST原则设计的API,它允许客户端通过HTTP请求来访问服务端的资源,REST API通常用于Web服务,
相关概念
- 资源(Resources):在REST中,资源是系统中有独立标识的实体。每个资源都有一个唯一的URI(统一资源标识符),例如一个用户、订单、文章等。REST API的作用就是让客户端通过URI访问和操作这些资源。
- 无状态性(Statelessness):REST要求客户端和服务器之间的通信是无状态的。这意味着每个请求都包含所有的必要信息,服务器不需要保存客户端的状态,客户端的每个请求都是独立的。
- 标准的 HTTP 方法(GET、POST、PUT、DELETE等)。
- 表现层(Representation):资源通常以 JSON、XML 等格式返回给客户端。这种表现层是资源的具体表述,客户端可以根据需求选择不同的表现层。
- 统一接口(Uniform Interface):REST API 具有一致的接口设计,遵循简单、可读的规则,以便不同的客户端可以轻松地理解和使用。统一接口的设计简化了客户端与服务器之间的交互。
- 基于超媒体(Hypermedia as the Engine of Application State, HATEOAS):在 REST 的理想实现中,响应中可以包含超链接,以指导客户端进行进一步的操作。这使得客户端在与服务器交互时,可以根据超链接动态发现 API 的能力和结构,而不是通过文档或硬编码 URL。
OpenAPI
OpenAPI: OpenAPI是最常用的HTTP API标准。
CI/CD
CI/CD是持续集成(Continuous Intergration)和持续交付(Continuous Delivery)或持续部署(Continuous Deployment)的简称。
OSI七层协议
从下到上,OSI 七层模型的结构如下:
- 物理层(Physical Layer,第 1 层):
- 负责数据的物理传输(例如电信号、光信号)。
- 硬件层次,如网线、光纤、集线器等。
- 数据链路层(Data Link Layer,第 2 层):
- 负责节点之间的数据帧传输。
- 例如:MAC 地址、交换机。
- 网络层(Network Layer,第 3 层):
- 负责数据的路由和转发。
- 例如:IP 地址、路由器。
- 传输层(Transport Layer,第 4 层):
- 提供端到端的可靠数据传输服务。
- 例如:TCP、UDP。
- 会话层(Session Layer,第 5 层):
- 负责建立、管理和终止应用程序之间的会话。
- 用于数据同步、检查点恢复。
- 表示层(Presentation Layer,第 6 层):
- 负责数据的格式化、加密、解密、压缩等。
- 例如:JSON 转换为二进制、TLS/SSL 加密。
- 应用层(Application Layer,第 7 层):
- 面向用户,直接提供应用服务。
- 例如:HTTP、FTP、SMTP、DNS、WebSocket。
MiB、MB、Mbps
这是三种不同的单位体系:
- MiB(MebiByte):是二进制单位体系,$1MiB=1024 \times 1024bytes$
- MB(MegaByte):是十进制单位体系,$1MB=1000 \times 1000 bytes$
- Mbps(Megabit per second):是网络传输速率的常用单位,$1Mpbs=1000\times1000bits/s$
SOP(Standard Operating Proceduer)
SOP就是一份官方说明书或操作手册,它是一份详细的书面指南,用来描述如何一步一步地、以统一和标准的方式完成某项常规任务。
SOP 的核心特点和目的
- 标准化 (Standardization):确保每个人都用同样的方法做同样的事,消除因个人习惯或理解不同而导致的差异。
- 一致性 (Consistency):保证每次任务的产出结果(无论是产品还是服务)质量稳定、可预测。
- 效率 (Efficiency):将最佳、最快、最安全的操作方法固化下来,避免员工重复摸索或走弯路,提高整体工作效率。
- 培训 (Training):是新员工上岗培训的“教科书”,让他们能快速、准确地掌握工作流程和要求。
- 安全与合规 (Safety & Compliance):在医疗、航空、化工等高风险行业,SOP 是保障生命安全和符合法规的基石。
SOP 的主要构成要素
一份完整的 SOP 通常会包含以下部分:
- 目的 (Purpose): 为什么要有这个SOP?要解决什么问题?
- 范围 (Scope): 这个SOP适用于哪些人、哪些场景?
- 职责 (Responsibilities): 谁负责执行?谁负责监督?
- 所需材料/设备 (Materials/Equipment): 完成任务需要准备什么?
- 详细步骤 (Step-by-Step Instructions): 这是SOP的核心,描述从开始到结束的每一个具体操作,清晰、明确,没有歧义。
- 质量检查点 (Quality Checkpoints): 在关键步骤如何检查是否合格?
- 异常处理 (Exception Handling): 如果出现意外情况该怎么办?