网上看到很多人参考
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) 在某些环境中,对某些指令或使用某些寄存器存在限制。例如,在 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 优化特别感兴趣。
我想直接从脚本语言调用 Linux 系统调用(或至少是 libc 包装器)。我不在乎什么脚本语言 - 重要的是它不被编译(原因基本上与不想要依赖路径中的编译器有关,但这既不存在也不存在)。是否有任何脚本语言(shell、Python、Ruby 等)允许这样做?
特别是,它是getrandom系统调用。
使用strace带有标志的命令时-T,我想知道用于显示系统调用时间的时间单位是什么?我认为它应该在几秒钟内,但我不太确定,手册中似乎省略了它。
考虑以下(含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: …
某些 Linux 系统调用(例如execve, openat)具有字符串类型参数。但是SCMP_CMPseccomp提供的比较函数好像是比较两个指针。那么如何使用 seccomp 将进程可以打开的文件限制到特定目录?有没有办法让用户提供一个通用的比较功能?
据我了解,time将记录在系统调用中花费的总时间。然后,我会期望SYS时间累计总量所报告的time和strace -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) strace在bash被指示运行的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) 我真的很想理解为什么我们的来宾 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,则应该使用系统调用?
我知道进程无法阻止 SIGKILL。
但是有没有一种外部方法可以暂时阻止 SIGKILL 到达(特定)进程?(类似于防火墙丢弃数据包)。