blog
blog copied to clipboard
My blog
# [Embedded] ZYNQ-Secure Boot Flow ZYNQ的secure boot方案提供了三大特性的验证: * 保密性 * 信息完整性(防篡改,防数据破坏) * 认证(防否认、中间人攻击) ZYNQ在secure boot的支持上提供了: * Hardware Root of Trust (HWRoT) 作为可选的 对于所有分区进行加密 * HWRoT 基于RSA-4096算法SHA384 * HWRoT 有引擎加速 *...
# 03_Embedded_ARMv8 BL33 Uboot Booting Flow ARM上电后会从BootROM(或XIP)启动第一段程序,BootROM/XIP固化着SoC厂商自己写的驱动程序,这部分代码除了一些ARM公司规定的必要启动流程,SoC厂商根据自己的SoC设计内置一些初始化的操作,我们把这一阶段称为`SoC BootROM booting`阶段。由于BootROM内部的程序没有办法重新烧写,因为在芯片的流片的之前,这部分程序必须要确定下来且经过质量测试,一旦流片这部分程序将无法重新烧写,因此是重中之重的一环。在一些Secure Boot设计中,这部分程序要固化初试的根信任信息。 SoC BootROM之后的阶段,有多种叫法,中文称作`第二级程序引导`,缩写为SPL,一些公司例如德州仪器也会将这个引导的名字称为MLO。引入SPL的原因是因为SRAM的空间比较小,我们需要在正式引导之前有一个加载的程序,可以将正式的引导导入到DDR中。在某些架构下从SPL延伸出TPL的概念,我们从整个boot的过程中也将其视为SPL阶段。SPL在uboot可以找到其身影,这部分代码SoC厂商会根据自己的平台编写好自己的程序,并合入到uboot的代码仓库中。对于OEM厂可以对这部分代码根据需求进行订制和修改。 ARMv8上提供了ATF固件,ATF固件可以cover整个boot流程。若我们在ARMv8上面使用安全feature,必然要使用ATF固件作为整个引导的主导程序。当然,强大uboot也会和ATF功能有所重叠,在不使用ATF情况下,uboot也可以挑起启动的重任,但是无法使用其安全feature。 SPL之后,将会引导OEM厂最熟悉的uboot或者其他品牌的引导程序。关于整个ARMv7/v8的非安全和安全启动,可以参考:#65[^2] 和 #61[^1] 本节的重点关注于ARMv8的BL33阶段的uboot booting过程: * uboot的初始化 * uboot的驱动模型 * uboot的board_init_x * uboot的内核映像的封装 # 1. uboot的初始化[^3] 在BL33阶段的uboot初始化部分很多功能化和SPL是共用的,如下图所示为uboot整体的流程,其中标注为绿色的是BL33...
# 0x32_LinuxKernel_内存管理(二)虚拟内存管理、缺页与调试工具 我们经常在Linux的应用程序中使用malloc()这个函数分配内存,而这部分我们从来没有探究过它里面到底如何实现的。理论上,64位的操作系统可以访问到256T的内存空间地址,可以远远大于物理内存,我们在这章就要去弄懂,Linux内核如何去管理这些内存?出了malloc()动态分配的函数,还有mmap()是用户空间中用于建立文件映射或匿名映射的函数,这部分本章也需要讲解一些原理性的内容。 # 0 内核内存分配 先来回顾一下内核地址空间: 在**内核态申请内存比在用户态申请内存要更为直接**,它没有采用用户态那种延迟分配(通过缺页机制来反馈)内存技术。一旦有内核函数申请内存,那么就必须立刻满足该申请内存的请求,并且这个请求一定是正确合理的。相反,对于用户态申请内存的请求,内核总是尽量延后分配物理内存,用户进程总是先获得一个虚拟内存区的使用权,最终通过缺页异常获得一块真正的物理内存。 内核虚拟地址空间只有 1GB 大小,因此可以直接将 1GB 大小的物理内存映射到内核地址空间,但超出 1GB 大小的物理内存(高端内存)就不能映射到内核空间。为此,内核采取了下面的方法使得内核可以使用所有的物理内存: * **高端内存不能全部映射到内核空间**,也就是说这些物理内存没有对应的线性地址。不过,内核为每个物理页都分配了对应的页描述符,所有的页框描述符都保存在 mem_map 数组中,因此每个页描述符的线性地址都是固定存在的。内核此时可以使用 alloc_pages() 和 alloc_page() 来分配高端内存,因为这些函数返回页框描述符的线性地址。 * **内核地址空间的后 128MB 专门用于映射高端内存,否则,没有线性地址的高端内存不能被内核所访问**。这些高端内存的内核映射显然是暂时映射的,否则也只能映射 128MB 的高端内存。当内核需要访问高端内存时就临时在这个区域进行地址映射,使用完毕之后再用来进行其他高端内存的映射。 由于要进行高端内存的内核映射,因此直接能够映射的物理内存大小只有...
# Linux System : Managing Linux Services - initramfs The NXP-IMX6ULL is the NXP cortex-A7 (Armv7 arch) and the Xilinx ZYNQ is the cortex-A53 (Armv8 arch). We will use the...
# (Embedded) NXP-imx6 initialization note: The original `README` has been changed to `README.old` # 1. 编译内核 ## 1.1 Compiling the Linux Kernel for IMX6 `[email protected]:carloscn/imx-linux-4.1.15.git` `make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean` `make...
# Linux System - Managing Linux Services - inittab + init.d ## 1. The /etc/inittab File When init starts up, it reads the **/etc/inittab** configuration file. While the system is...
# [Embedded] cross-compile the cryptsetup on Xilinx ZYNQ aarch64 platform ## 1.1 Dev Env This document is to describe how to transplant the `cryptsetup` (userspace) and `dm-crypt` (kernel space) to...
# Linux进程之间的通信-管道(上) * 标准输入、标准输出和标准错误 * 进程管道 * popen * pipe调用 * 父进程和子进程 * 命名管道:FIFO * 客户/服务器架构 ## 1. stdin, stdout, stderr 作为Linux进程之间通信的基础,标准输入、输出和标准错误是必须了解的概念。我们在Linux的userspace层面shell上的机制每天都要和这三个东西打交道。我直接抄文献[^1]了: >* stdin: Stands for standard input. It takes...