接口要求

本页介绍了 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
arm vfork、sigreturn、pipe、access、stat64、lstat64、open、getdents、eventfd、epoll_wait、readlink、epoll_create、creat、unlink
arm64 pivot_root、ioprio_get、ioprio_set

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/binder Binder 设备文件。
/dev/hwbinder 硬件 binder 设备文件。
/dev/tun 通用 TUN/TAP 设备文件。
/dev/xt_qtaguid QTAGUID 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 读/写文件,包含可用于确定如何在 mmapmprotect 调用中检查 SElinux 保护的二进制标记。
/sys/fs/selinux/null 供 SElinux 使用的读/写空设备。
/sys/fs/selinux/policy 只读文件,包含了二进制文件形式的 SElinux 政策。