0%

1. CTS 测试使用方法

1.1. 下载cts测试包

可以在展讯内部自动测试地址进行下载cts或gts等相关的测试资源。

CTS 测试包分为x86arm系列,针对相应的芯片下载对应的系列。如intel系列的手机需要下载x86的(比如7.0_r10_x86)。

1.2. 进行cts测试

将资源包下载下来后解压,得到android-cts的文件夹。

执行./cts-tradefed 命令。

1
cts_7.0_r10_x86/android-cts/tools$ ./cts-tradefed

1.2.1. 单条测试case跑测

1
cts-tf > run cts -m CtsAppSecurityHostTestCases  -t android.appsecurity.cts.AdoptableHostTest#testApps  --abi arm64-v8a --skip-preconditions
阅读全文 »

1. 磁盘配额调研报告


1.1. 实际磁盘配额控制

1.1.1. 依赖项情况

  • Ext4文件系统默认开启了DQUOT_USAGE_ENABLED

Kernelfilesystem support中开启了quota support

1.1.2. 磁盘配额初始化

  • Installd开启data分区的磁盘配额 (/mnt/runtime/default

Sd卡格式化内部存储后,应该也可以支持

StorageStatesServiceinstalld的联动

阅读全文 »

Effective Modern C++ 11 笔记

1. 型别推导

1.1. 条款1 理解模型型别推导

理解 auto 和 decltype

伪代码:

1
2
3
template<typename T>
void f(ParamType param);
f(expr); //以表达式调用f

编译期间, 编译器通过expr推导两个型别: T 和 ParamType
T的型别推导结果, 不仅仅依赖表达式expr的型别, 还依赖ParamType的形式, 分下面三种情况:

  • ParamType具有指针或引用型别, 但不是万能引用(条款24)
  • ParmaType 是万能引用
  • ParamType 非指针也非引用

1.1.1. ParamType具有指针或引用型别

  1. expr 具有引用类型, 先将引用忽略
  2. 执行模式匹配, 决定T的型别
阅读全文 »

Android parcel 机制

1. Serialize 说起

Java中的Serialize机制, 串行化机制,效率较慢:

  • 使用的反射机制
  • 会生成很多临时文件,造成了垃圾回收

将数据对象存入字节流中,在需要时重新生成对象.应用外部存储器保存对象状态,以及通过网络传输对象等.

串行化: 将对象转化成字节流,保存在存储设备\内存或二进制方式通过网络传输. 之后通过反串行化从连续的字节数据重新构建一个原始对象状态相同的对象.

2. Parcel 简介

Android工程师新设计了Parcel机制, 定位于轻量级的高效串行化和反串行化. 字节流主要保存在内存中, 用于IPC通信.

3. Parcel 机制详解

3.1. 源码位置

阅读全文 »

1. 文件IO测试调研

1.1. 测试环境

直接创建物理分区的测试环境比较麻烦, 而且操作硬盘如果出现误操作可能会对硬盘上的数据产生损坏.
而创建虚拟分区的方法则比较安全, 还可以对其应用硬盘加密/启用多个文件系统等操作, 比较方便.
本篇先通过建立一个虚拟的分区来测试文件IO

1.1.1. 建立虚拟分区

执行歩骤:

1
2
3
4
5
6
7
# 建立20M的虚拟硬盘
dd if=/dev/zero of=~/test.img bs=1M count=20
#在虚拟设备上创建文件系统
mkfs.ext4 -q ~/test.img
e2label new.img rootfs
#挂载虚拟镜像到本地进行使用
sudo mount -t ext4 ~/test.img ~/test

为测试文件io权限等, 可以对文件系统添加quota支持

1
2
3
4
5
6
7
8
9
# 对虚拟映像添加quota支持
sudo mount -o rw,usrjquota=aquota.user,jqfmt=vfsv0 ~/test.img ~/test
sudo quotacheck -cugv ~/test
# 添加用户
sudo useradd quota1 -d ~/test/quota1
# 对用户添加quota限制
sudo edquota -u quota1
# 启用quota
quotaon ~/test

1.2. File io测试

挂载到本地目录test后, 可以对其进行文件io测试.
以创建目录为例

阅读全文 »

1. Android权限管理

原作者: xiaoguang.dong

1.1. 基本概念

1.1.1. AndroidManifest权限相关标签

permissionimage9

1.1.1.1. permission 标签

permissionimage10

  • permission标签用于声明一个权限
  • android:name 指定权限名称
  • android:protectionLevel指定权限的保护级别
  • android:protectionLevel指定权限的保护级别

permissionimage11

1.1.1.2. uses-permission标签

阅读全文 »

opensbi底层初始化

先进入_start函数, 将a0-a2 保存到 s0-s2, 启动 fw_boot_hart, a0-a2 是qemu传递给opensbi的参数.
在riscv模式中会将riscv的core称为hart(硬件线程)

代码重定位, 判断 _load_start_link_start 是否一致, 如不一致, 则需要重定位
清除寄存器值, 清除除 a0-a2 外的所有寄存器的值
清空bss, _bss_start_bss_end 范围设置为0
设置临时的 trap_hander 为 _start_hang
设置 sp, 紧挨 bss 段, 大小为 0x1000 * 2, 向上增长, 所以 sp top 为 bss_end + 0x2000位置
读取设备树中的信息:
fw_platform_init (opensbi/platform/generic/platform.c)
a1是设备树地址, 从设备树中解析qemu中设定相关的信息

1
qemu-system-riscv64 -m 2G -nographic -machine virt -bios /keystone/build/bootrom.build/bootrom.bin -kernel /keystone/build/sm.build/platform/generic/firmware/fw_payload.elf

fdt重定位

需要把设备树重定位,从而让 uboot 也知道
初始化scratch space, 紧挨着stack, 大小为0x1000

  • 存储 _fw_start_fw_end 到 scratch space
  • 存储 next arg1 (FW_JUMP_FDT_ADDR 0x82200000)
  • 存储 payload_bin, FW_PAYLOAD_PATH 被填充到 opensbi 预留的指令地址处, 0x80200000, 此处把 kernel 的 bin 填充到这个地方了
  • 存储 fw_next_mode, S 模式
  • warm_boot address
  • platform address
  • _hartid_to_scratch _trap_exit fw_options等
1
2
3
4
5
6
"-DFW_TEXT_START=0x80000000",
"-DFW_JUMP_ADDR=0x80200000",
"-DFW_JUMP_FDT_ADDR=0x82200000",
"-DFW_PAYLOAD_PATH=\"/keystone/build/linux.build/arch/riscv/boot/Image\"",
"-DFW_PAYLOAD_OFFSET=0x200000",
"-DFW_PAYLOAD_FDT_ADDR=0x82200000",

start_warm 除 a0-a2 外的所有寄存器重置, 禁用中断, 读取 hartid(CSR_MHARTID), 根据 hartid 查找对应的 scratch space, 设置对应的 sp, 设置_trap_handler 为最终的陷阱入口函数, 支持的 hardid count 数是通过 qemu-system-riscv64 命令行传入的, 定制到 fdt 中去的 platform.hart_count = hart_count;

进入c函数

阅读全文 »

opensbi 介绍

背景

RISC-V指令集的SBI标准规定了类Unix平台下,操作系统运行环境的规范。这个规范拥有多种实现,OpenSBI是它的一种实现.
这个运行环境不仅将引导启动RISC-V下的操作系统, 还将常驻后台,为操作系统提供一系列二进制接口,以便其获取和操作硬件信息。 RISC-V给出了此类环境和二进制接口的规范,称为“操作系统二进制接口”,即“SBI”。
SBI是在M模式下运行的特定于平台的固件,它将管理S、U等特权上的程序或通用的操作系统。

RISCV 模式

  • Machine-Level ISA

    • 处理器内核被复位后,默认处于 Machine Mode
    • machine mode读写的寄存器,如mhartid、mstatus、mtvec、mcause
    • machine特权指令,如ecall(所有模式)、mret、sret、wfi(所有模式、U模式可选)
    • 复位、NMI发生后hart状态
    • PMA物理内存属性,原子、order、一致性
    • PMP物理内存保护机制和寄存器
  • Supervisor-Level ISA

    • Supervisor mode读写的寄存器,如sstaus、stvec、scause、satp
    • Supervisor特权指令,如ecal、sret、sfence.vma
    • Page-Based 32/39/48/57-bit Virtual-Memory Systems
  • User-Level ISA

  • Hypervisor Extension (扩展 H-extension)

    • hypervisor 虚拟化读写的寄存器,如hstatus、vstvec、vepc
    • hypervisor特权指令,load/store、fence

RISV 特权模式演进

  • AEE: application execution environment
  • ABI: application binary interface
  • The ABI includes the supported user-level ISA plus a set of ABI calls to interact with the AEE. The ABI hides details of the AEE from the application to allow greater flexibility in implementing the AEE.
  • SEE: supervisor execution environment
  • SBI: supervisor binary interface
  • HEE: hypervisor execution environment
    • isolate the hypervisor from details of the hardware platform.
  • HBI: hypervisor binary interface

所有硬件必须提供M-mode,因为它拥有访问整个机器的能力,最简单的RISC-V实现只有M-mode,但是不能抑制恶意APP。

  • 未扩展前,不支持hypervisor模式
  • hypervisor扩展模式,V标识当前hart是否处于虚拟化模式
阅读全文 »