+ -
当前位置:首页 → 问答吧 → 关于应用层和驱动层的write操作的问题

关于应用层和驱动层的write操作的问题

时间:2010-07-08

来源:互联网

写了一个应用程序来测试一个驱动,如下:
Size = write(SendPortHandle,
                                   &WriteData[WrittenSize],
                                   4096);
printf("Size=%d\n", Size);
write的返回值,也就是Size的值也是4096.
应用程序每次写入4096个字节,而且每次的返回值也是4096!
但是调用到驱动里边:
static int advtty_write(struct tty_struct * tty,
                        const unsigned char * buf, int count)
{
    ...
    printk(KERN_INFO count=%d\n", count);
    ...

此处count的值为2048
请问为什么传给驱动的count值是2048,而不是4096?

作者: jinxinxin163   发布时间: 2010-07-08

看一下底层的write被调用了几次

作者: Godbach   发布时间: 2010-07-08

回复 jinxinxin163


    http://lxr.linux.no/linux+v2.6.34.1/fs/read_write.c#L334
  1. 334ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
  2. 335{
  3. 336        ssize_t ret;
  4. 337
  5. 338        if (!(file->f_mode & FMODE_WRITE))
  6. 339                return -EBADF;
  7. 340        if (!file->f_op || (!file->f_op->write && !file->f_op->aio_write))
  8. 341                return -EINVAL;
  9. 342        if (unlikely(!access_ok(VERIFY_READ, buf, count)))
  10. 343                return -EFAULT;
  11. 344
  12. 345        ret = rw_verify_area(WRITE, file, pos, count);
  13. 346        if (ret >= 0) {
  14. 347                count = ret;
  15. 348                if (file->f_op->write)
  16. 349                        ret = file->f_op->write(file, buf, count, pos);
  17. 350                else
  18. 351                        ret = do_sync_write(file, buf, count, pos);
  19. 352                if (ret > 0) {
  20. 353                        fsnotify_modify(file->f_path.dentry);
  21. 354                        add_wchar(current, ret);
  22. 355                }
  23. 356                inc_syscw(current);
  24. 357        }
  25. 358
  26. 359        return ret;
  27. 360}
复制代码
这个里面打印一下,有几次调用?

作者: kgn28   发布时间: 2010-07-08

应该是多次调用的

作者: ljysyn   发布时间: 2010-07-08

下载 (16.3 KB)
2010-07-08 12:29

在发出系统调用之前,做了什么事情?还需要看看c库怎么做的。。。

作者: kgn28   发布时间: 2010-07-08

回复 ljysyn


    对,确实是多次调用,但是,处理多次调用的代码在哪里?sys_write里呢,还是在c库里?

作者: jinxinxin163   发布时间: 2010-07-08

回复 kgn28

    赞同

作者: jinxinxin163   发布时间: 2010-07-08



QUOTE:
在发出系统调用之前,做了什么事情?还需要看看c库怎么做的。。。
kgn28 发表于 2010-07-08 12:30




请教下,你这张调用顺序图是通过什么工具得到的?感觉好像是在windows中?

作者: new_learner   发布时间: 2010-07-18

回复 new_learner


    cygwin下的x的insight,调试vm7里面的2.30得到的。

作者: kgn28   发布时间: 2010-07-18



QUOTE:
回复  new_learner


    cygwin下的x的insight,调试vm7里面的2.30得到的。
kgn28 发表于 2010-07-18 18:13




    有没有相应的文档可以参考一下,怎么配置这些东东?  谢谢先;)

作者: new_learner   发布时间: 2010-07-18

热门下载

更多