系统中一切的读写都是站在用户空间的角度来考虑(把你自己当做用户空间)
什么是输入/读?数据从内核空间流向用户空间
什么是输出/写?数据从用户空间流向内核空间
read:
应用层:
ssize_t read(int fd, void *buf, size_t count);
参数1:文件描述符
参数2:存放读取到的数据的空间首地址
参数3:空间大小(不是读到的数据大小)
返回值:成功读取到的字节数
驱动层:
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
参数1:
参数2:应用层read函数的参数2
参数3:应用层read函数的参数3
参数4:文件指针偏移量
返回值:正确读取的字节数
驱动层中实现读功能:
static inline long copy_to_user(void __user *to,const void *from, unsigned long n);
参数1:用户空间缓存区首地址
参数2:内核空间的缓存区首地址
参数3:实际拷贝的字节数
返回值:0成功,非0出错
write:
应用层:
ssize_t write(int fd, const void *buf, size_t count);
参数1:
参数2:存放数据的空间首地址
参数3:实际写的字节数
驱动层:
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
参数1:
参数2:应用层write函数的参数2
参数3:应用层write函数的参数3
参数4:文件指针偏移量
返回值:正确写入的字节数
驱动层中实现写功能:
static inline long copy_from_user(void *to,const void __user * from, unsigned long n)
参数1:内核空间的缓存区首地址
参数2:用户空间缓存区首地址
参数3:实际拷贝的字节数
返回值:0成功,非0出错
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 6 int main(int argc, const char *argv[]) 7 { 8 int fd; 9 10 fd = open("/dev/demo",O_RDWR); 11 if(fd == -1) 12 { 13 perror("open"); 14 return -1; 15 } 16 17 char buf[64]; 18 read(fd,buf,sizeof(buf)); 19 printf("%s\n",buf); 20 21 write(fd,"I am from user",15); 22 close(fd); 23 return 0; 24 }