Carlos Wei (Haochen)
Carlos Wei (Haochen)
声明:本文知识树和Linux的知识点来源于《Beginning Linux Programming 4th Edition, Neil Matthew/Richard Stones》。只是替换了其中C语言部分,对应到RUST上。RUST的知识点来源于RUST官方文档手册、《Programming Rust: Fast, Safe Systems Development》等。本文的目的是让Linux的C语言选手快速转向Linux的Rust语言。 * Linux文件结构: * 目录 * 文件和设备 * 系统调用和驱动 * 库函数 * 底层文件访问 * write系统调用 * read系统调用 *...
# 07_ELF文件_堆和栈调用惯例以ARMv8为例 ## 1 栈与调用惯例 ### 1.1 栈的概念 栈和堆的概念非常重要,程序员的修养是以x86架构讲的堆栈的概念,我们以ARMv8 AArch64为主来研究一下堆栈。 栈的概念我们可以重力翻转之后的桌子上的一摞书为例子,栈顶就是最下面眼镜的位置,栈底就是桌子。栈的顺序就是我们最后放的眼镜,是先被拿出来的。栈(stack)是一种数据结构,计算机里面的栈使用栈数据结构管理内存。为什么要将“重力翻转”?因为栈是一种从高地址向低地址生长的存储结构,栈底对应高地址,栈顶对应低地址。 这里的SP被称为“堆栈帧(Stack Frame)”或者“活动记录(Activate Record)”。堆栈帧会保存以下记录: * 函数返回地址和参数,如果传递参数≤8个,那么使用X0~X7通用寄存器来传递,当参数多于8个,需要使用栈来传递参数。 * 临时变量,例如局部变量 * 保存上下文 ### 1.2 不同架构出栈和入栈 **入栈过程:** A32指令集提供了PUSH和POP指令来实现入栈和出栈[^1],但是A64指令集已经去掉了PUSH和POP指令,只需要复用stp和ldp指令就可以实现入栈和出栈[^2]。 For example: ```assembly // Broken...
# 02_ARMv7-M_编程模型与模式 ARM有个专业术语叫做Programmer's model,可能对这个概念很陌生,也无法解释,那么我们把它视为一个词根。一个model中包含: * 寄存器有哪些(通用的+特殊的) * ARM的执行状态有哪些 我们对于ARM的控制,抛开C语言,最终都转换成汇编语言,汇编是ARM的指令,指令操作需要依赖寄存器,ARM从寄存器中得知需要有什么行为,例如我们的运算,拷贝。因此编程者模型更多的是站在汇编的层面来讲故事。而我们需要关注的是,我们直接操作的寄存器,会对ARM产生什么行为。ARM设计了什么寄存器?这些寄存器的使用条件是什么? 以下编程模型来自于arm的白皮书: M系列的CPU的P model设计上都保持了一致性。例如,在寄存器方面`R0-R15`,`PSR`,`CONTROL`和`PRIMASK`都保持了一样的设计。但是也有一些不同的地方,例如,两个特殊寄存器,`FAULTMASK`和`BASEPRI`只在M3/M4/M7/M33存在,floating point bank寄存器和`FPSCR`(Floating Point Status and Control Register)只在Cortex-M4/M7/M33上存在。 在ARMv7-M架构中,中断非常多,通常都有相应的优先级配置,`BASEPRI`寄存器主要用于阻塞某些特定优先级或者低优先级的中断和异常。而在ARMv6-M或者ARMv8-M中,中断的优先级被限制到了4个可配置的等级中。`FAULTMASK`用于处理复杂的handler。 非特权模式这个概念在ARMv6-M架构上是可以存在或者不存在的,而在v7-m和v8-m上是一定会有这个概念。这种差异意味着CONTROL寄存器在不同的Cortex-M处理器之间可能有微小的差异。FPU的配置选项也影响CONTROL寄存器。 CONTROL寄存器如下: 可以看出,关于M核心的执行状态问题,都是使用CONTROL寄存器来进行配置的。 PSR(Program Status Register) 在M核之间也有不同。在所有的Cortex-M中,PSR能被分为: * Application PSR...
在NXP High Assurance Booting (HAB)中,整体的RSA认证体系全部使用的PKCS7中CMS签名[Cryptographic Message Syntax (CMS)](https://www.ietf.org/rfc/rfc5652.txt),借此机会,对CMS签名认证相关的专业知识进行整理。PKCS#7是一个复杂的格式,也叫做CMS。 * [PKCS #7: Cryptographic Message Syntax Standard](https://ipsec.pl/files/ipsec/Archiwum/pkcs-7.pdf) * [Blog: PKCS7: Cryptographic Message Syntax Standard](https://docs.deistercloud.com/content/Axional%20development%20libraries.20/Server%20side%20javascript.50/AX%20Library.10/crypt/PKCS.10/PKCS7.xml?embedded=true) Cryptographic Message Syntax ([CMS](https://tools.ietf.org/html/rfc5126))是IETF密码学标准用于保护消息。用于数字签名、digest、认证或者加密。CMS基于PKCS#7的原语,基于Privacy-Enhanced Mail standard,最新的CMS版本是2009。CMS架构的建立是**基于certificate-based证书的key的管理**,其中也使用[S/MIME](https://zh.wikipedia.org/zh-hk/S/MIME)、PKCS#12、还有RFC3161时间戳协议。OpenSSL对于CMS进行了完整的实现。 ## 签名格式...
# 1. Overview Cortex-M3(2006年)和Cortex-M4(2010)都是32位架构,寄存器和数据通路、总线接口都是32位。M系列使用指令集架构(ISA,Instruction Set Architecture)叫做Thumb ISA,它是基于Thumb-2 Technology(支持16位/32位指令)。  M系列的处理器从**架构层面**有以下特点: * 三级流水线设计; * **哈佛总线架构**,且具有统一的存储器空间:指令和地址总线使用相同的地址空间; * 32位寻址,支持4GB存储空间; * 基于ARM **AMBA**(Advanced Microcontroller Bus Architecture)支持高吞吐的流水线操作。 关于流水线操作,可以参考:https://github.com/carloscn/blog/issues/62 * 名为**NVIC**(Nested Vectored Interrupt Controller,嵌套向量中断控制器)的中断控制器,支持最多240 个中断请求和8 ~256...
# 10_ELF文件_ARM的镜像文件(.bin-.hex-.s19) ARM的编译器直接编译出文件应该是elf格式的,类似于Linux,它是有elf解析器可以对elf进行解析和提取的,而baremental环境是鲜有elf解析器,因为它对于baremental的环境实在是太大了。因此这里就需要我们自己去handle二进制文件,把他们放在一个正确的内存里面。 每个厂家的bootROM不一样,所以**对于二进制文件的存储要求也不一样**。这个规则也是看二级厂家是怎么定义,但是这里还是能抽象出一些比较通用的规则。image文件主要是用来做大规模量产的。既要做大规模量产,由于各芯片厂家制定的标准不一,所以实际上image文件有很多种格式。本文包含其中最具有代表性也应用最广泛的3种image文件格式: * 通用的bin * intel的hex * S-Record 本文以NXP rt1176 Cortex-M7的处理器为demo,来研究一下 * image文件的种类 * image文件与代码段的管理 生成的二进制文件列表如图所示:  本文的顺序及内容参考[^5],并对[^5]进行扩展和扩充。软件参考[^4] 。 # 1. image文件种类 ## 1.1 Binary 第一种格式叫binary,以.bin为文件后缀,这种格式是一种通用image格式,其完全是机器码裸数据的集合,没有其他任何多余信息,这个数据可以直接被编程器/下载器下载到芯片内部非易失性存储器里,不需要任何额外的数据转换。由于是纯二进制编码的文件,所以普通text编辑器无法正确查看这个文件,需要用专用的十六进制编辑器(比如Hex Editor)才能正常打开。 ...