file_operation结构题里面_user追踪

刚学习写驱动,以前有看过一些内核的东西,只记得些大概的工作机制,细节东西一点不记得了。

今天仔细了解了下file_operation数据结构,据说这个数据结构可以看做是一个驱动的核心框架,所以下了点功夫认真读了下。

在这个数据结构里发现一个不知道是什么东西,在csdn上发帖求助得到了下面一些回复。

不懂的是下面的定义里面的_user数据类型,前面加了一个下划线,很奇怪的东西,不知道这个参数怎么回事:

 

复制代码
struct file_operations {

      struct module 
*owner;

      loff_t (
*llseek) (struct file *, loff_t, int);

      ssize_t (
*read) (struct file *, char __user *, size_t, loff_t *);

      ssize_t (
*aio_read) (struct kiocb *, char __user *, size_t, loff_t);

      ssize_t (
*write) (struct file *, const char __user *, size_t, loff_t *);

      ssize_t (
*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);

      int (
*readdir) (struct file *, void *, filldir_t);

      unsigned int (
*poll) (struct file *, struct poll_table_struct *);

      int (
*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

      long (
*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

      long (
*compat_ioctl) (struct file *, unsigned int, unsigned long);

      int (
*mmap) (struct file *, struct vm_area_struct *);

      int (
*open) (struct inode *, struct file *);

      int (
*flush) (struct file *, fl_owner_t id);

      int (
*release) (struct inode *, struct file *);

      int (
*fsync) (struct file *, struct dentry *, int datasync);

      int (
*aio_fsync) (struct kiocb *, int datasync);

      int (
*fasync) (int, struct file *, int);

      int (
*lock) (struct file *, int, struct file_lock *);

      ssize_t (
*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);

      ssize_t (
*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);

      ssize_t (
*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);

      ssize_t (
*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

      unsigned long (
*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

      int (
*check_flags)(int);

      int (
*dir_notify)(struct file *filp, unsigned long arg);

      int (
*flock) (struct file *, int, struct file_lock *);

      ssize_t (
*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

      ssize_t (
*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

};
复制代码

 

发帖后,得到以下回复:

回复一

read的原型如下:
ssize_t read(struct file *filp,char __user *buff,size_t count,loff_t *offp);
第二个参数是指向用户空间的缓冲区,是一个存放新读入数据的空缓冲区。

回复二

# define __user __attribute__((noderef, address_space(1)))
__user是用于check这个地址的合法性的,__user表示指向用户地址空间,小短线是使用习惯,没有特殊意义.

在内核中
address_space(0)是内核空间
address_space(1)是用户空间
address_space(2)是设备空间

 

看来学驱动还是得要去翻内核代码的啊~~~


posted @   Biiigfish  阅读(557)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示