Android 8.0 系统学习(6)---Linux内核接口要求

接口要求

本页介绍了 Android 正常运行所需的一系列 Linux 内核接口。供应商测试套件 (VTS) 会测试这些接口是否存在以及是否正确无误。这些接口的数量将随时间的推移不断增加,包含越来越多的 Android 内核接口。

系统调用

系统调用提供的签名和语义应与上游 Linux 内核中的签名和语义相同。

根据 bionic/libc/SYSCALLS.txt,Bionic 所需的 ARM64 系统调用如下:

accept4、acct、adjtimex、bind、brk、capget、capset、chdir、chroot、clock_adjtime、clock_getres、clock_gettime、clock_nanosleep、clock_settime、close、connect、delete_module、dup3、dup、epoll_create1、epoll_ctl、epoll_pwait、eventfd2、execve、exit、exit_group、faccessat、fadvise64、fallocate、fchdir、fchmodat、fchmod、fchownat、fchown、fcntl、fdatasync、fgetxattr、flistxattr、flock、fremovexattr、fsetxattr、fstat、newfstatat、fstatfs、fsync、ftruncate、getcpu、getcwd、getdents64、getegid、geteuid、getgid、getgroups、getitimer、getpeername、getpgid、getpid、getppid、getpriority、getresgid、getresuid、getrlimit、getrusage、getsid、getsockname、getsockopt、gettimeofday、getuid、getxattr、init_module、inotify_add_watch、inotify_init1、inotify_rm_watch、ioctl、kill、syslog、lgetxattr、linkat、listen、listxattr、llistxattr、lremovexattr、lseek、lsetxattr、madvise、mincore、mkdirat、mknodat、mlockall、mlock、mmap、mount、mprotect、mremap、msync、munlockall、munlock、munmap、nanosleep、openat、personality、pipe2、ppoll、prctl、pread64、preadv、prlimit64、process_vm_readv、process_vm_writev、pselect6、ptrace、pwrite64、pwritev、quotactl、readahead、readlinkat、read、readv、reboot、recvfrom、recvmmsg、recvmsg、removexattr、renameat、rt_sigaction、rt_sigpending、rt_sigprocmask、rt_sigqueueinfo、rt_sigsuspend、rt_sigtimedwait、sched_getaffinity、sched_getparam、sched_get_priority_max、sched_get_priority_min、sched_getscheduler、sched_rr_get_interval、sched_setaffinity、sched_setparam、sched_setscheduler、sched_yield、sendfile、sendmmsg、sendmsg、sendto、setdomainname、setfsgid、setfsuid、setgid、setgroups、sethostname、setitimer、setns、setpgid、setpriority、setregid、setresgid、setresuid、setreuid、setrlimit、setsid、setsockopt、set_tid_address、settimeofday、setuid、setxattr、shutdown、sigaltstack、signalfd4、socketpair、socket、splice、statfs、swapoff、swapon、symlinkat、sync_file_range、sync、sysinfo、tee、tgkill、timer_create、timer_delete、timerfd_create、timerfd_gettime、timerfd_settime、timer_getoverrun、timer_gettime、timer_settime、times、truncate、umask、umount2、uname、unlinkat、unshare、utimensat、vmsplice、wait4、waitid、write、writev

根据 bionic/libc/SYSCALLS.txt,Bionic 所需的 ARM32 系统调用如下:

accept4、acct、adjtimex、arm_fadvise64_64、bind、brk、cacheflush、capget、capset、chdir、chroot、clock_adjtime、clock_getres、clock_gettime、clock_nanosleep、clock_settime、close、connect、delete_module、dup3、dup、epoll_create1、epoll_ctl、epoll_pwait、eventfd2、execve、exit、exit_group、faccessat、fallocate、fchdir、fchmodat、fchmod、fchownat、fchown32、fcntl64、fdatasync、fgetxattr、flistxattr、flock、fremovexattr、fsetxattr、fstat64、fstatat64、fstatfs64、fsync、ftruncate64、getcpu、getcwd、getdents64、getegid32、geteuid32、getgid32、getgroups32、getitimer、getpeername、getpgid、getpid、getppid、getpriority、getresgid32、getresuid32、ugetrlimit、getrusage、getsid、getsockname、getsockopt、gettimeofday、getuid32、getxattr、init_module、inotify_add_watch、inotify_init1、inotify_rm_watch、ioctl、kill、syslog、lgetxattr、linkat、listen、listxattr、llistxattr、_llseek、lremovexattr、lseek、lsetxattr、madvise、mincore、mkdirat、mknodat、mlockall、mlock、mmap2、mount、mprotect、mremap、msync、munlockall、munlock、munmap、nanosleep、openat、personality、pipe2、ppoll、prctl、pread64、preadv、prlimit64、process_vm_readv、process_vm_writev、pselect6、ptrace、pwrite64、pwritev、quotactl、readahead、readlinkat、read、readv、reboot、recvfrom、recvmmsg、recvmsg、removexattr、renameat、rt_sigaction、rt_sigpending、rt_sigprocmask、rt_sigqueueinfo、rt_sigsuspend、rt_sigtimedwait、sched_getaffinity、sched_getparam、sched_get_priority_max、sched_get_priority_min、sched_getscheduler、sched_rr_get_interval、sched_setaffinity、sched_setparam、sched_setscheduler、sched_yield、sendfile64、sendfile、sendmmsg、sendmsg、sendto、setdomainname、setfsgid、setfsuid、setgid32、setgroups32、sethostname、setitimer、setns、setpgid、setpriority、setregid32、setresgid32、setresuid32、setreuid32、setrlimit、setsid、setsockopt、set_tid_address、settimeofday、set_tls、setuid32、setxattr、shutdown、sigaction、sigaltstack、signalfd4、socketpair、socket、splice、statfs64、swapoff、swapon、symlinkat、sync_file_range2、sync、sysinfo、tee、tgkill、timer_create、timer_delete、timerfd_create、timerfd_gettime、timerfd_settime、timer_getoverrun、timer_gettime、timer_settime、times、truncate64、truncate、umask、umount2、uname、unlinkat、unshare、utimensat、vmsplice、wait4、waitid、write、writev

通过绕过 Bionic,可进行下列系统调用:

所有架构gettid、futex、clone、rt_sigreturn、rt_tgsigqueueinfo、restart_syscall、getrandom、perf_event_open、syncfs、tkill、seccomp
armvfork、sigreturn、pipe、access、stat64、lstat64、open、getdents、eventfd、epoll_wait、readlink、epoll_create、creat、unlink
arm64pivot_root、ioprio_get、ioprio_set
注意:未来的版本中将添加 x86 和 x86_64 系统调用。

prctl

除了用于受支持的内核版本的上游 prctl 指令外,Android 还依赖于其他 prctl 指令;这些指令的实现可以在 android-common 内核中找到。

PR_SET_TIMERSLACK_PID
PR_SET_VMA

文件系统

Linux 内核可通过多个文件系统导出接口。Android 要求这些接口以相同的格式传递相同的信息,并且提供的语义与上游 Linux 内核中的语义相同。对于上游中不存在的接口,相应的行为将由对应的 Android 通用内核分支决定。

procfs

路径说明
/proc/cmdline包含传递到内核的命令行参数的只读文件。
/proc/config.gz包含内核编译配置的只读文件。
/proc/cpuinfo包含架构对应的 CPU 详细信息的只读文件。
/proc/kmsg实时显示内核信息的只读文件。
/proc/meminfo显示内存子系统详细信息的只读文件。
/proc/modules包含已加载内核模块的相关信息的只读文件。
/proc/mounts指向 /proc/self/mounts(一个只读文件,列出了已装载的文件系统的相关信息)的符号链接。
/proc/net/xt_qtaguid/ctrl提供已标记的套接字相关信息的读写文件。
/proc/self/maps包含当前映射的内存区域和权限的只读文件。
/proc/stat包含各种内核和系统统计信息的只读文件。
/proc/sys/kernel/kptr_restrict决定内核指针是否印在 proc 文件和其他接口中的读写文件。
/proc/sys/kernel/randomize_va_space决定系统的地址布局随机化政策的读写文件。
/proc/sys/vm/mmap_min_addr读写文件,用于确定可进行 mmap 调用的最小地址。
/proc/sys/vm/mmap_rnd_bits读写文件,会指定 mmap 调用的地址中的随机性程度。
/proc/sys/vm/mmap_rnd_compat_bits读写文件,会指定 mmap 调用的地址中的随机性程度。
/proc/sys/vm/overcommit_memory确定内核虚拟内存记录模式的读写文件。
/proc/uid_cputime/remove_uid_range只写文件,向其中写入数据时,会移除 /proc/uid_cputime/show_uid_stat 中显示的 UID。
/proc/uid_cputime/show_uid_stat只读文件,包含 UID 进程在用户空间和内核空间中花费的时间。
/proc/version只读文件,包含描述内核版本的字符串。
/proc/vmallocinfo只读文件,包含 vmalloc 进行分配的范围。
/proc/zoneinfo包含内存区域相关信息的只读文件。

dev

路径说明
/dev/ashmem匿名的共享内存设备文件。
/dev/binderBinder 设备文件。
/dev/hwbinder硬件 binder 设备文件。
/dev/tun通用 TUN/TAP 设备文件。
/dev/xt_qtaguidQTAGUID netfilter 设备文件。

sysfs

路径说明
/sys/devices/system/cpu/online显示当前在线的 CPU 范围的只读文件。
/sys/kernel/wakeup_reasons/last_resume_reason只读文件,会显示系统为什么退出最后一个挂起实例的文字说明。
/sys/devices/system/cpu/kernel_max只读文件,会显示内核支持的最大 CPU 指标。

selinuxfs

该框架会将 selinuxfs 装载到 /sys/fs/selinux 中。

路径说明
/sys/fs/selinux/checkreqprot读/写文件,包含可用于确定如何在 mmap 和 mprotect 调用中检查 SElinux 保护的二进制标记。
/sys/fs/selinux/null供 SElinux 使用的读/写空设备。
/sys/fs/selinux/policy只读文件,包含了二进制文件形式的 SElinux 政策。

内核配置

您可以将以下配置设置用作 Android 内核配置的基础。设置会整理到 android-baseandroid-base-<arch> 和 android-recommended.cfg 文件中:

  • android-base。这些选项可实现核心 Android 功能,并且应配置为所有设备指定的选项。
  • android-base-<arch>。这些选项可实现核心 Android 功能,并且应配置为架构 <arch> 的所有设备指定的选项。并非所有架构都具有相应的特定于架构的必需选项文件。如果您的架构没有相应文件,则它没有任何额外特定于架构的 Android 内核配置要求。
  • android-recommended。这些选项可实现高级 Android 功能,设备可选择性启用。

这些配置文件位于 kernel/configs repo 中。使用一组对应您正在使用的内核版本的配置文件。

如需详细了解已用于加强设备内核的控件,请参阅系统和内核安全。如需详细了解必需的设置,请参阅 Android 兼容性定义文档 (CDD)

生成内核配置

对于具有极简 defconfig 的设备,您可以在内核树中使用 merge_config.sh 脚本来启用选项:

ARCH=<arch> scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-<arch>.cfg <...>/android-recommended.cfg

这会生成一个 .config 文件,您可以使用该文件来保存新的 defconfig 或编译一个启用 Android 功能的新内核。

启用 USB 主机模式选项

对于 USB 主机模式音频,请启用以下选项:

CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

对于 USB 主机模式 MIDI,请启用以下选项:

CONFIG_SND_USB_MIDI=y

Seccomp-BPF 与 TSYNC

Seccomp-BPF 是一种内核安全技术,支持创建沙盒来限制进程可以进行的系统调用。TSYNC 功能可以实现从多线程程序中使用 Seccomp-BPF。这种能力仅限具有 seccomp 支持上游的架构:ARM、ARM64、x86 和 x86_64。

用于 ARM-32、X86、X86_64 的内核 3.10 向后移植

确保已在 Kconfig 中启用 CONFIG_SECCOMP_FILTER=y(截至 Android 5.0 CTS 已验证),然后择优挑选来自 AOSP kernel/common:android-3.10 代码库的以下变更:9499cd23f9d05ba159fac6d55dc35a7f49f9ce76..a9ba4285aa5722a3b4d84888e78ba8adc0046b28

用于 ARM-64 的内核 3.10 向后移植

确保 Kconfig 中已启用 CONFIG_SECCOMP_FILTER=y(截至 Android 5.0 CTS 已验证),然后择优挑选来自 AOSP kernel/common:android-3.10 存储区的以下变更:


阅读更多

扫码向博主提问

zhangbijun1230

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Android系统
  • IOT
  • 大数据
  • AI
  • 手机功耗
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页