一、实现机制
(一)应用层
用户通过系统调用,比如open,read,write,close函数对文件进行相应操作时,实际是调用的syscall函数,syscall函数第一个参数(系统调用号)来确定实际调用的是哪个函数。
- 注:syscall提供了用户空间程序与内核进行交互的接口
#include <unistd.h>
#include <sys/syscall.h>
long syscall(long number, ...);
功能:
实现通过指定的编号和参数来执行系统调用,而不需要依赖C标准库或其他高级库提供的封装
参数:
@number :系统调用号(int),系统调用号是一个唯一标识符,用于指定要执行的系统调用。
@... :想要传递给系统调用的参数
返回值:
成功返回0;
失败返回-1,重置错误码.
- 注:不同的操作系统的系统调用号不同,可以查看
./arch/arm/include/generated/calls-eabi.S
文件
(二)内核层
字符设备按照字节流顺序访问,但是实际它提供了无序访问的功能
vi -t sys_open
内核中通过inode号可以唯一的找到一个inode结构体
只要一个文件在文件系统存在,在内核中就通过一个inode结构体去描述文件
类似于进程被一个task_struct结构体来描述
__VA_ARGS__
宏定义里面用来接可变参数列表的宏
/sys/class/mydev
二、字符设备驱动分布实现流程
三、添加自己的系统调用函数
1. 找到系统调用文件
./arch/arm//include/generated/calls-eabi.S
2. 找到
/fs/open.c