linux 中write下的原函数(基本原理)

来源:互联网 发布:java scanner读取char 编辑:程序博客网 时间:2024/06/06 21:00

和客户调用的write函数(是三个参数,加载驱动程序的时候是根据内核中的的文件图来进行加载的)

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 *); /* 指向

驱动程序中的wirte函数的指针*/

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; /* 得到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)) /* 将函数开始时声明的

write函数指针指向fops方法中对应的write函数 */
goto out;
down(&inode->i_sem);
ret = write(file, buf, count, &file->f_pos); /* 使用驱动程序中的write函数

将数据输入设备,注意看,这里就是四个参数了 */
up(&inode->i_sem);
out:
fput(file);
bad_file:
unlock_kernel();
return ret;

驱动程序

int short_write (struct inode *inode, struct file *filp, const char *buf,

      int count){

      int retval = count;

      extern unsigned char kbuf[10];

      if(count>10)

      count=10;

      copy_from_user(kbuf, buf, count);

      return retval;

      }/* short_write */

      设备short_t对应的fops方法是这样声明的:

      struct file_operations short_fops = {

      NULL, /* short_lseek */

      short_read,

      short_write,

      NULL, /* short_readdir */

      NULL, /* short_poll */

      NULL, /* short_ioctl */

      NULL, /* short_mmap */

      short_open,

      short_release,

      NULL, /* short_fsync */

      NULL, /* short_fasync */

      /* nothing more, fill with NULLs */

      };

  内核中的文件图


原创粉丝点击