userspace的一条指令实现,使用了ioctl(),但是从驱动层面来看,函数实现确是unlocked_ioctl()。
从userspace到kernel space之间,是通过系统调用实现的函数调用。
1.找ioctl的定义,Android c库在bionic文件夹下面
2.找ioctl实现,在bionic文件夹搜索ioctl
libc/bionic/ioctl.cpp
int ioctl(int fd, int request, …) {
va_list ap;
va_start(ap, request);
void* arg = va_arg(ap, void*);
va_end(ap);
return __ioctl(fd, request, arg);
}
3.继续寻找__ioctl
在系统调用libc/arch-arm64/syscalls/__ioctl.S
/* Generated by gensyscalls.py. Do not edit. */
#include <private/bionic_asm.h>
ENTRY(__ioctl)
mov x8, __NR_ioctl
svc #0
cmn x0, #(MAX_ERRNO + 1)
cneg x0, x0, hi
b.hi __set_errno_internal
ret
END(__ioctl)
.hidden __ioctl
其中,__NR_ioctl是ioctl的系统调用号
4.搜索sys_call_table
定义arch/arm64/kernel/sys.c
#undef __SYSCALL
#define __SYSCALL(nr, sym) [nr] = sym