strace在不同的缓冲区上有不同的Linux写入系统调用结果

时间:2016-08-16 02:39:28

标签: c linux linux-kernel operating-system embedded-linux

我尝试在Linux上使用write()系统调用将数据缓冲区写入文件,这是我写的用户空间代码。

memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);      
write (fp, dataBuffer, FILESIZE);

我尝试了两种类型的dataBuffer,一种来自malloc(),另一种来自mmap()

我使用strace来观察内核在这两种缓冲区上会做什么。其中大多数是相同的,但我在做write()时看到,它们看起来不一样。

来自malloc()

缓冲区

[pid   258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3
[pid   258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200
来自mmap()

缓冲区

[pid   262] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 4
[pid   262] write(4, 0x76557000, 691200) = 691200

就像你上面看到的那样,write()的参数是不同的,一个是“FFFFF ...”,就像我之前的memset,但是另一个就像一个内存地址。

第一个参数也不同,一个是3,另一个是4。

在我的系统上,来自malloc()的缓冲区比mmap()更快。

他们怎么会有所不同?谁让这与众不同?

感谢。

更新:如何衡量malloc()的速度更快?

我在内核write()深处追踪,找出write()的最后一步是iov_iter_copy_from_user_atomic(),我认为这是实际的内存复制操作。

然后我使用gettimeofday()来衡量malloc / mmap缓冲区中iov_iter_copy_from_user_atomic()成本的持续时间。

0 个答案:

没有答案