标签: syscalls

你在哪里可以找到 Linux 的系统调用表?

网上看到很多人参考

arch/x86/entry/syscalls/syscall_64.tbl
Run Code Online (Sandbox Code Playgroud)

对于系统调用表,工作正常。但很多其他人参考

/include/uapi/asm-generic/unistd.h
Run Code Online (Sandbox Code Playgroud)

这通常在 headers 包中找到。怎么syscall_64.tbl显示,

0 common  read      sys_read
Run Code Online (Sandbox Code Playgroud)

正确答案,并unistd.h显示,

#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Run Code Online (Sandbox Code Playgroud)

然后它显示__NR_read

#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Run Code Online (Sandbox Code Playgroud)

为什么是 63 而不是 1?我如何理解 out /include/uapi/asm-generic/unistd.h?还在/usr/include/asm/里面

/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)

/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat …
Run Code Online (Sandbox Code Playgroud)

syscalls

26
推荐指数
4
解决办法
4万
查看次数

为什么内核不能使用 SSE/AVX 寄存器和指令?

StackOverflow 的这篇文章有这个

在某些环境中,对某些指令或使用某些寄存器存在限制。例如,在 Linux 内核中,通常不允许使用 SSE/AVX 或 FP 寄存器。因此,大多数优化的 memcpy 变体无法使用,因为它们依赖于 SSE 或 AVX 寄存器,并且在 x86 上使用了基于 mov 的纯 64 位副本。对于这些平台,使用 rep movsb 可以在不破坏 SIMD 代码限制的情况下获得优化的 memcpy 的大部分性能。

为什么 x86_64 内核不能使用 SSE/AVX?如果它会使memcopy()速度更快,似乎应该允许它。我只是在学习 Intel Assembly,当我看到这个评论时,我特别想学习 SEE/AVX。

对 Linux 内核中的 SSE/MME 和 AVX 优化特别感兴趣。

kernel intel optimization syscalls assembly

17
推荐指数
1
解决办法
6282
查看次数

从脚本语言调用 Linux 系统调用

我想直接从脚本语言调用 Linux 系统调用(或至少是 libc 包装器)。我不在乎什么脚本语言 - 重要的是它不被编译(原因基本上与不想要依赖路径中的编译器有关,但这既不存在也不存在)。是否有任何脚本语言(shell、Python、Ruby 等)允许这样做?

特别是,它是getrandom系统调用。

linux scripting syscalls

15
推荐指数
3
解决办法
2794
查看次数

在显示系统调用中花费的时间时,strace 使用的时间单位是什么?

使用strace带有标志的命令时-T,我想知道用于显示系统调用时间的时间单位是什么?我认为它应该在几秒钟内,但我不太确定,手册中似乎省略了它。

linux process system-calls strace syscalls

10
推荐指数
3
解决办法
4363
查看次数

为什么在简单的 bash 命令中没有明显的 clone 或 fork 以及它是如何完成的?

考虑以下(含sh/bin/dash):

$ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcc8b661810) = 24865
wait4(-1, /proc/self/status:Pid:    24865
/proc/24864/status:Pid: 24864
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24865
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24865, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)

没有什么不寻常的,从主 shell 进程中grep替换了一个分叉进程(这里是通过 完成的clone())。到现在为止还挺好。

现在使用 bash 4.4: …

shell strace syscalls

8
推荐指数
2
解决办法
2182
查看次数

如何将字符串值与 seccomp 进行比较?

某些 Linux 系统调用(例如execve, openat)具有字符串类型参数。但是SCMP_CMPseccomp提供的比较函数好像是比较两个指针。那么如何使用 seccomp 将进程可以打开的文件限制到特定目录?有没有办法让用户提供一个通用的比较功能?

linux syscalls

8
推荐指数
0
解决办法
280
查看次数

为什么`time` 和`strace -c` 不同?

据我了解,time将记录在系统调用中花费的总时间。然后,我会期望SYS时间累计总量所报告的timestrace -fc是相同的。但它们大不相同(13.5 vs 0.005)。怎么了?

# time php index.php >/dev/null

real  0m16.292s
user  0m2.728s
sys   0m13.548s

# strace -fc php index.php >/dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 83.72    0.000365           0     54845           munmap
 10.09    0.000044           0     36705           mmap
  6.19    0.000027           0     18249           madvise
  0.00    0.000000           0       289           read
  0.00    0.000000           0       119           write
  0.00    0.000000           0       118         3 open
  0.00    0.000000           0       118           close
  0.00    0.000000           0        23 …
Run Code Online (Sandbox Code Playgroud)

linux time strace syscalls

6
推荐指数
1
解决办法
762
查看次数

在命令之前 bash stat() 和 access() 很多正常吗?

stracebash被指示运行的shell 上运行mkdir提供了此输出,该输出显示了执行实际mkdir二进制文件之前的大量统计信息:

BASH$> strace -f sh -c "bash -c \"mkdir /tmp\" 2>&1 | nl | grep -e "execve\|stat\|access" 
[.....]
  2766  [pid 17371] stat(".", {st_mode=S_IFDIR|0750, st_size=17262, ...}) = 0
  2767  [pid 17371] stat("/usr/local/sbin/mkdir", 0x7ffd87aad0a0) = -1 ENOENT      2767 (No such file or directory)
  2768  [pid 17371] stat("/usr/local/bin/mkdir", 0x7ffd87aad0a0) = -1 ENOENT (No such file or directory)
  2769  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2770  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0 …
Run Code Online (Sandbox Code Playgroud)

bash dash stat syscalls

6
推荐指数
1
解决办法
198
查看次数

为什么 Linux 工具不使用系统调用来获取当前时间?

我真的很想理解为什么我们的来宾 VM 没有“像他们应该那样”使用 kvm-clock 驱动程序。他们正在运行 RHEL 7.2、glibc-2.17、kern 3.10.0。诸如date和 之类的程序perl -e 'print time'获取当前时间,但无需进行系统调用即可。这证实使用Strace和ltrace和通过用gdb和组件跟踪通过该旁路进一步证实syscall和转而执行一些指令来调用rtdscp

这是 glibc 作者的优化尝试吗?有什么方法可以禁用它并强制 glibc 调用进行系统调用(缺少 LD_PRELOAD hacks)?

更新2016-10-14:

在查看了最新的POSIX 草案后,部分答案很清楚:有一种方法可以从 CPU 请求时钟,但是 GNU glibc 错误地将这种实现强加给了它的用户。解决方法是直接调用系统调用。(嘘)

如果定义了 _POSIX_CPUTIME,则实现应支持通过调用 clock_getcpuclockid() 获得的时钟 ID 值,它表示给定进程的 CPU 时间时钟。实现还应支持特殊的clockid_t 值CLOCK_PROCESS_CPUTIME_ID,它表示调用clock_ () 或timer_ () 函数之一时调用进程的CPU 时间时钟。

鉴于用户可以 是否有任何真正的论据反对将 ifclock_id设置为CLOCK_REALTIME,则应该使用系统调用?

linux clock syscalls

5
推荐指数
1
解决办法
5511
查看次数

有没有办法防止 sigkill 到达进程?

我知道进程无法阻止 SIGKILL。

但是有没有一种外部方法可以暂时阻止 SIGKILL 到达(特定)进程?(类似于防火墙丢弃数据包)。

linux process-management syscalls sigkill

2
推荐指数
1
解决办法
3457
查看次数