blog
blog copied to clipboard
My blog
--- description: Compiling a user uboot command --- # \[IMX6] Defining A U-Boot Command ## 1. Function Overview I wish to boot a partition that can be decided in the...
# 1. Overview 中断是一个典型的组件在一般的微控制器中。中断时间通常由硬件产生,例如外设和外部的引脚。中断会改变程序的执行路径。当一个中断产生的时候,通常会发生: 1. 外设assert中断请求到处理器; 2. 处理器会暂停当前的任务; 3. 处理器跳转到当前中断的服务程序中ISR; 4. 处理器恢复中断之前的任务。 在Cortex-M处理器中提供了一个Nested Vectored Interrupt Controller(NVIC)。除了中断,还有其他事件需要服务,我们称之为“异常”。在ARM的术语中,中断属于异常的一种,而在工程使用中有个比较习惯的表述,中断更侧重于由外设,外围器件这种角色产生的;而异常是由处理器本身产生的。无论是外设的中断还是处理器异常,在ARM中都通过异常处理机制来对这种信号进行管理。在典型的Cortex-M控制器中,NVIC接收各种各样的中断源: 有外设、有IO口、有处理器产生的异常、有定时器。在ARMv8里面和NVIC同等位置的IP是GIC,[12_ARMv8_异常处理(三)- GICv1/v2中断处理](https://github.com/carloscn/blog/issues/51)。而NVIC更像是ARMv8架构中的Legacy的中断。[11_ARMv8_异常处理(二)- Legacy 中断处理](https://github.com/carloscn/blog/issues/49)。 Cortex-M3 and Cortex-M4的NVIC支持240IRQs,和Non-Makable Interrupt(NMI),和System Tick定时器中断,还有数个系统异常。注意,NMI是无法屏蔽的中断,像是watchdog或者Brown-Out Detector (BOD)。 为了能够从中断程序中恢复中断现场。ARM处理器需要保存中断之前的状态,在中断结束之后,从保存的区域中恢复。这个功能的实现可以通过硬件,也可以软硬结合。在Cortex-M中,一些寄存器的值会被保存到栈上,等中断结束之后会从栈上恢复状态。 # 2....
# 09_ARMv8_内嵌汇编(内联汇编)Inline assembly 内联汇编并非ARCH64专门的使用方法,而是GNU编译器通用的做法。目的有二,其一,对于时间敏感的函数使用内联汇编减少执行开销;其二,C语言无法访问架构级的特殊指令,比如内存屏障功能。 ## 1. 基本用法 ### 1.1 基础内联汇编格式 Define:`asm ("asm instruction")` 【示例】: `asm(icicalluis)` 调用一条高速缓存维护指令。 ### 1.2 扩展内联汇编代码 * Define:`asm qualifier-asm (AssemblerInstruction)` * Instruction: * 格式:指令部分:输出部分:输入部分:损坏部分 * 编译器不会解析,按照字符串处理 *...
# [Embedded] enabling the cryptsetup on ramdisk _**Linux Unified Key Setup**_ (LUKS) is a specification for block device encryption. It establishes an on-disk format for the data, as well as...
声明:本文知识树和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进行了完整的实现。 ## 签名格式...