引流关键词: 中断、同步异常、异步异常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表…
快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
[专栏目录]-ATF/FF-A/specification学习
4.Debug FS
4.1。概述
DebugFS功能主要旨在将固件调试数据暴露给更高的软件层,例如非安全组件。这样的组件可以是 TFTF 测试负载或 Linux 内核模块。
4.2. 虚拟文件系统
核心功能在于基于 9p 文件服务器接口的虚拟文件系统(关于 Plan 9 内核源和 Linux 9p 远程文件系统协议的注释)。该实现允许公开虚拟文件、固件驱动程序和文件 blob。
4.2.1。命名空间
暴露了两个命名空间:
4.2.2. 9p interface
相关的原语是:
Unix-like:
- open():创建一个文件描述符,作为作为参数传递的文件的句柄。
- close():关闭由 open() 创建的文件描述符。
- read():从文件读取到缓冲区。
- write():从缓冲区写入文件。
- seek():将文件描述符的文件位置指示器设置为相对或绝对偏移量。
- stat():获取有关文件的信息(类型、模式、大小……)。
int open(const char *name, int flags);
int close(int fd);
int read(int fd, void *buf, int n);
int write(int fd, void *buf, int n);
int seek(int fd, long off, int whence);
int stat(char *path, dir_t *dir);
Specific primitives:
- mount():在驱动程序和规范之间创建链接。
- create():在特定位置创建文件。
- bind():将一个目录的内容暴露给另一个目录。
int mount(char *srv, char *mnt, char *spec);
int create(const char *name, int flags);
int bind(char *path, char *where);
当构建选项选择此接口时,该接口嵌入到 BL31 运行时有效负载中。接口多路复用驱动程序或模拟“文件”:
-
调试数据可以划分为不同的虚拟文件,例如通过一个文件公开 PMF 测量值,通过另一个文件公开内部固件状态计数器。
-
这允许直接访问固件驱动程序,主要用于测试目的(例如,非特权/非安全层可能无法访问的硬件设备,或者在 NS 端不存在支持)。
4.3. SMC接口
与 BL31 中的 9p 层的通信是通过 SMC 管道(SMC 调用约定)使用特定的 SiP 功能 ID 进行的。NS 共享缓冲区用于传递路径字符串参数,或者例如在读取操作上交换数据。有关 SMC 接口的说明,请参阅ARM SiP 服务 。
4.4. 安全注意事项
-
由于公开数据的性质,该功能被认为是实验性的,重要的是只能在调试版本中使用。
-
几个原语暗示了字符串操作和字符串格式的使用。
-
特别注意共享缓冲区以避免 TOCTOU 攻击。
4.5. 限制
- 为了设置共享缓冲区,使用接口的组件需要分配一个物理页框并传输其地址。
- 为了映射共享缓冲区,BL31 需要启用动态 xlat 表选项。
- 数据交换受共享缓冲区长度的限制。一个大的读取操作可能会被拆分成多个较小块的读取操作。
- 在并发访问时,在 BL31 服务中实现了一个自旋锁,以保护内部工作缓冲区和重新进入文件系统层。
- 请注意,如果固件公开的物理设备驱动程序可能与更高级别的操作系统发生冲突,如果后者为同一物理设备实现自己的驱动程序。
4.6. 应用
SMC 接口可从 NS 环境访问,即:
- 在 NS-EL2 上运行的测试负载、引导加载程序或管理程序
- 在 NS-EL1 上运行的 Linux 内核驱动程序
- 通过内核驱动程序的 Linux 用户空间应用程序