完全是我在这里关注的......
mmap(0x37aa74d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x37aa74d000
所有人都说strace会返回所有使用过的系统调用,但我grep entry.S
并且只有sys_mmap
而不仅仅是mmap
,这意味着mmap
不是系统调用,应该是{ {1}}。
那么完全是strace输出??
另一个问题是我认为sys_mmap
表示返回值,对吧?但是如果函数没有返回类型怎么办?(= 0x37aa74d000
)?
答案 0 :(得分:3)
strace
从用户空间的角度生成系统调用的名称:mmap
,open
,read
,{{这将与libc包装器执行比仅陷入操作系统更复杂的函数调用时的函数调用不同。例如,如果您在代码中致电write
,sigaction
会向您显示对strace
的来电,因为多年来,rt_sigaction
一直是最常见的系统调用用于设置信号动作,因此GNU libc根据该原语实现所有信号设置功能。 (在这种情况下,你不能直接调用rt_sigaction
,因为glibc没有公开它的包装 - 我不知道为什么会这样。)
rt_sigaction
是Linux内核中发生的函数的名称,它是sys_mmap
系统调用的入口点。 Linus可以为系统调用入口点选择他想要的任何命名约定 - mmap
,mmap
,mach_mmap
,无论如何 - 这是一个与用户空间无关的实现细节。因此ZwMmap
不会向您显示这些名称。
返回类型为strace
的仅系统调用是终止进程的系统调用,例如void
。 (从编程语言设计的角度来看,更准确地说它们没有返回类型,因为它们不返回。)exit_group
打印出类似的这样:
strace
所有其他系统调用都会返回某些内容,因为所有这些调用至少在理论上都会失败,并且他们必须告诉您它们是否存在。如果除了成功/失败指示之外没有值返回它们,那么它们返回exit_group(0) = ?
,其成功为零或失败为int
,-1
逐字打印。 [Soapbox:这是Unix中一个长期存在的设计错误,至少可以追溯到第一次实现NFS。资源释放原语 - strace
,close
等 - 应该是不可能的,并且它们的返回类型应该是munmap
来表示。我有一个时间机器,我完全打算解决这个问题。]
答案 1 :(得分:2)
mmap
(2)是系统调用sys_mmap
周围的libc包装器。如果要分析库调用,请使用ltrace
。
mmap
的返回类型是void*
,这是一个非类型指针,它是成功映射后返回的内容。
答案 2 :(得分:1)
除了这里给出的优秀答案之外,值得强调的是人们常常混淆系统调用(直接向内核发出请求)和库调用(通常是指对GlibC函数的调用)。
许多GlibC调用与系统调用具有相同的名称(例如,读取,写入,打开等),并且只是它们调用的系统调用的包装器。其他的并不是那么简单,例如exec系列的GlibC函数都使用'execve'系统调用来执行一个程序,所以它们都会显示为对strace执行的调用。
通常当人们谈论系统调用时,他们实际上意味着库调用,他们使用的函数在strace输出中会有所不同。
答案 3 :(得分: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
。