轉自:http://blog.sina.com.cn/s/blog_6405313801012p9r.html
應用程序執行open、ioctl等系統調用,它們的參數和驅動程序中相應函數的參數不是一一對應的,其中經過了內核文件系統層的轉換。
int
open(const
char
*pathname,int
flags)
int
ioctl(int
d,int
request,....)
ssize_t read(int
fd,void
*buf,size_t
count)
ssize_t write(int
fd,const
void
*buf,size_t
count);
|
file_operations結構中的成員如下:
int
(*open)
(struct inode
*, struct
file *);
int
(*ioctl)
(struct inode
*, struct
file *,
unsigned int,
unsigned long);
ssize_t
(*read)
(struct
file *,
char __user *,
size_t, loff_t
*);
ssize_t (*write)
(struct
file *,
const char __user
*, size_t, loff_t
*);
|
short_write (struct inode *inode, struct file *filp, const char *buf, int count)
而用戶程序中的write函數只有三個參數,函數格式如下:
write(inf fd, char *buf, int count)
那他們兩個是怎麼聯繫在一起的呢?這就要靠操作系統核心中的函數sys_write了,下面
是Linux Kernel 2.2.14中sys_write中的源代碼:
asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
{
ssize_t ret;
struct file * file;
struct inode * inode;
ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
lock_kernel();
ret = -EBADF;
file = fget(fd);
if (!file)
goto bad_file;
if (!(file->f_mode & FMODE_WRITE))
goto out;
inode = file->f_dentry->d_inode;
ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file, file->f_pos,
count);
if (ret)
goto out;
ret = -EINVAL;
if (!file->f_op || !(write = file->f_op->write))
goto out;
down(&inode->i_sem);
ret = write(file, buf, count, &file->f_pos);
up(&inode->i_sem);
out:
fput(file);
bad_file:
unlock_kernel();
return ret;
}