3

正是我在这里关注的...

mmap(0x37aa74d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x37aa74d000

所有人都在说 strace 返回所有使用的系统调用,但我grep entry.S和那里只是sys_mmap不简单mmap,这意味着mmap不是系统调用,应该是sys_mmap

那么strace究竟输出了什么?

另一个问题是我认为= 0x37aa74d000意味着返回值,对吗?但是如果函数没有返回类型怎么办?(void)?

4

4 回答 4

3

strace从用户空间的角度生成系统调用的名称:so mmapopenreadwrite等。这将不同于 libc 包装器执行比仅仅陷入操作系统更复杂的事情时编码的函数调用。例如,如果您sigaction在代码中调用,strace将显示对 的调用rt_sigaction,因为多年来,rt_sigaction它一直是设置信号操作的最通用系统调用,因此 GNU libc 实现了所有的信号设置函数原始。(在这种情况下,您不能rt_sigaction直接调用,因为 glibc 没有为它公开包装器——我不知道为什么会这样。)

sys_mmap是 Linux 内核中一个函数的名称,它恰好mmap系统调用的入口点。Linus 可以为系统调用入口点选择任何他想要的命名约定—— mmap, mach_mmap, ZwMmap, 等等——这是一个实现细节,与用户空间无关。所以strace不会给你看那些名字。

唯一返回类型为的系统调用是终止进程的系统调用void,例如exit_group. (从编程语言设计的角度来看,说它们没有返回类型会更准确因为它们不返回。) strace像这样打印:

exit_group(0)                           = ?

所有其他系统调用都会返回something,因为它们都可能(至少在理论上)失败,如果它们失败了,它们必须告诉您。如果除了成功/失败指示之外它们没有返回值,那么它们返回一个表示成功或失败int为零的值,并逐字打印。[Soapbox:这是 Unix 中长期存在的设计错误,至少可以追溯到 NFS 的第一个实现。资源释放原语—— ,等——应该是不可能失败的,它们的返回类型应该表明这一点。我完全打算一拿到时间机器就解决这个问题。]-1straceclosemunmapvoid

于 2011-06-06T02:56:46.813 回答
2

mmap(2) 是系统调用的 libc 包装器sys_mmapltrace如果要分析库调用,请使用。

mmap的返回类型是void*,它是一个非类型指针,这是它在成功映射时返回的内容。

于 2011-04-01T06:08:45.393 回答
1

除了这里已经给出的优秀答案之外,值得强调的是,人们经常混淆系统调用(直接向内核发出的请求)和库调用(通常是指对 GlibC 函数的调用)。

许多 GlibC 调用与系统调用具有相同的名称(例如读取、写入、打开等),并且只是它们调用的系统调用的包装器。其他的则不是那么简单,例如 GlibC 函数的 exec 系列都使用“execve”系统调用来执行程序,因此它们都将在 strace 中显示为对 execve 的调用。

通常,当人们谈论系统调用时,他们实际上是指库调用,并且他们使用的函数在 strace 输出中会有所不同。

于 2013-04-25T13:53:58.100 回答
0

Strace 正在打印系统调用,并且mmap不在其中,请检查man mmap

将文件或设备映射或取消映射到内存中

这是它的定义:

void *mmap(void *addr, size_t lengthint " prot ", int " flags , int fd, off_t offset);int munmap(void *addr, size_t length);

最后一个数字是返回值:

成功时,mmap()返回一个指向映射区域的指针。出错时,返回值MAP_FAILED(即(void *) -1),并适当设置 errno。成功时munmap()返回 0,失败时返回 -1,并设置 errno(可能为EINVAL)。

对于每个系统调用,您可以检查它们的man页面。要了解有关strace输出本身的更多信息,请查看man strace.

于 2016-04-11T20:25:44.773 回答