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

strace在不同的缓冲区上对Linux写系统调用有不同的结果,c,linux,linux-kernel,operating-system,embedded-linux,C,Linux,Linux Kernel,Operating System,Embedded Linux,我尝试在Linux上使用write()system调用将数据缓冲区写入文件,下面是我编写的用户空间代码 memset (dataBuffer, 'F', FILESIZE); fp = open(fileName, O_WRONLY | O_CREAT, 0644); write (fp, dataBuffer, FILESIZE); 我尝试了两种类型的数据缓冲,一种来自malloc(),另一种来自mmap() 我使用strace来观察内核在这两种缓冲区上会做什么。它们大多数都是相

我尝试在Linux上使用
write()
system调用将数据缓冲区写入文件,下面是我编写的用户空间代码

memset (dataBuffer, 'F', FILESIZE);
fp = open(fileName, O_WRONLY | O_CREAT, 0644);      
write (fp, dataBuffer, FILESIZE);
我尝试了两种类型的数据缓冲,一种来自
malloc()
,另一种来自
mmap()

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

来自malloc()的缓冲区

来自mmap()的缓冲区

正如您在上面看到的,
write()
的参数是不同的,一个是“FFFFF…”,就像我之前的memset一样,但另一个是内存地址

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

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

他们怎么会不一样呢?谁让这不一样

谢谢

更新:如何衡量
malloc()
更快

我深入内核中的
write()
,发现
write()
的最后一步是
iov\u iter\u copy\u from\u user\u atomic()
,我认为这是实际的内存复制操作


然后我使用
gettimeofday()
来测量malloc/mmap缓冲区中
iov\u iter\u copy\u from\u user\u atomic()
的开销。我想它是在检查缓冲区末尾是否有一个尾随的
0
字节。如果有,则假定数据是字符串,并用引号显示。如果没有,它只显示地址


我想不出为什么来自
malloc()
的缓冲区会比
mmap()
快。调用
memset()更快?@FrankMeerkötter我更新了我测量时间的方式是否有一个
strace
选项可以显示时间戳,以便您可以查看系统调用所花费的时间?@Barmar是的,有,但在一开始,我没有计划使用strace来查看时间成本,我已经发现mmap()比较慢,然后我尝试使用strace来找出它慢的原因。使用strace输出来检查malloc实际使用哪个系统调用来进行分配。
[pid   258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3
[pid   258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200
[pid   262] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 4
[pid   262] write(4, 0x76557000, 691200) = 691200