Android TTY设备调用流程和简单分析
Linux TTY系统中ioctl的调用流程详解:从应用层到MSM GENI Serial驱动
本文档详细分析Linux系统中从用户空间应用程序发起TTY ioctl请求到特定驱动(例如msm_geni_serial_ioctl)的完整调用流程,包括32位应用与64位内核之间的兼容性问题分析。
1. 总体调用路径概览
以下是完整的调用流程图,从用户空间到内核驱动:
用户空间应用程序 ioctl()
↓
系统调用层 sys_ioctl() → compat_sys_ioctl() (32位应用访问64位内核时)
↓
VFS层 vfs_ioctl() → do_vfs_ioctl()
↓
TTY核心层 tty_ioctl() → tty_mode_ioctl()
↓
TTY驱动层 tty->driver->ops->ioctl() 或 tty->driver->ops->compat_ioctl()
↓
具体驱动实现 msm_geni_serial_ioctl()
2. 详细调用流程分析
2.1 用户空间应用程序
// 用户空间代码示例
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>// 自定义的ioctl命令
#define MSM_GENI_SERIAL_TIOCPMGET 0x54EDint main() {int fd, ret;struct some_data data;// 打开TTY设备fd = open("/dev/ttyMSM0", O_RDWR | O_NOCTTY);if (fd < 0) {perror("open failed");return -1;}// 调用ioctl命令ret = ioctl(fd, MSM_GENI_SERIAL_TIOCPMGET, &data);if (ret < 0) {perror("ioctl failed");return -1;}close(fd);return 0;
}2.2 系统调用层
当用户空间应用调用ioctl()函数时,控制权转移到内核的系统调用处理程序:```bash
// 内核中的系统调用处理 (fs/ioctl.c)
SYSCALL_DEFINE3