Articles of 系统调用

如何禁止系统调用,GNU / Linux

我目前正在研究类ACM公共编程比赛系统的后端。 在这样的系统中,任何用户都可以提交一个代码源,这个代码源将被自动编译和运行(也就是说,不进行人眼预先调整),以解决一些计算问题。 后端是一个GNU / Linux专用机器,为每个参赛者创build一个用户,所有这些用户都是用户组的一部分。 由任何特定用户发送的信息源将被存储在用户的主目录中,然后被编译和执行以针对各种testing用例进行validation。 我想要的是禁止使用Linux系统调用来源。 这是因为问题需要独立于平台的解决scheme,而对不安全的源进行系统调用则是潜在的安全漏洞。 这样的来源可能会成功地放置在FS中,甚至编译,但从来没有运行。 我还希望在发送包含系统调用的源文件时收到通知。 到目前为止,我看到以下可能放置这样的检查器的地方: 前端/预编译分析 – 源已在系统中检查,但尚未编译。 系统调用名称的简单文本检查器。 独立于平台,独立于编译器,依赖于语言的解决scheme。 编译器补丁 – 遇到系统调用时,会崩溃GCC(或者包含在工具链中的任何其他编译器)。 依赖于平台的,依赖于编译器的,与语言无关的解决scheme(如果我们将检查器“足够的”)。 兼容性也可能会丢失。 其实我最不喜欢这个select。 运行时检查器 – 无论何时从进程调用系统调用,终止此进程并报告。 这个解决scheme是独立于编译器和语言的,但依赖于平台 – 我可以这么做,因为我将在类似的平台上以短期和中期部署后端。 所以问题是:GNU / Linux为pipe理员提供了一个禁止用户组,用户或特定进程的系统调用的机会吗? 这可能是一个安全策略或一个轻量级的GNU工具。 我试图Google,但Google今天不喜欢我。

为什么我们需要在poll中调用poll_wait?

在LDD3中,我看到了这样的代码 static unsigned int scull_p_poll(struct file *filp, poll_table *wait) { struct scull_pipe *dev = filp->private_data; unsigned int mask = 0; /* * The buffer is circular; it is considered full * if "wp" is right behind "rp" and empty if the * two are equal. */ down(&dev->sem); poll_wait(filp, &dev->inq, wait); poll_wait(filp, &dev->outq, wait); if (dev->rp […]

我们可以在内核空间中调用系统调用吗?

有时,当我们在内核系统中调用系统调用时,我们调用它的帮助程序或相关的内核函数,而不是“系统调用”。 我仍然想知道我们可以在内核空间中调用系统调用吗? 如果不是的话,什么阻止我们这样做。 我的问题有点奇怪

轮询系统调用超时

附加strace显示了很多这些消息: poll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLIN}, {fd=10, events=POLLIN}], 6, 0) = 0 (Timeout) poll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLIN}, {fd=10, events=POLLIN}], 6, 0) = 0 (Timeout) poll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLIN}, {fd=10, events=POLLIN}], 6, 0) = 0 (Timeout) poll([{fd=5, events=POLLIN}, {fd=6, […]

在Linux中使用signal.h编译错误

我正在编写一个必须处理信号的shell程序。 我的相关信号处理相关代码如下: #include <signal.h> … #include <sys/types.h> … void installSigactions( int, struct sigaction* ); void handler_function( int signal_id ); … /*define signal table*/ struct sigaction signal_action; /*insert handler function*/ signal_action.sa_handler = handler_function; /*init the flags field*/ signal_action.sa_flags = 0; /*are no masked interrupts*/ sigemptyset( &signal_action.sa_mask ); /*install the signal_actions*/ sigaction( SIGINT, &signal_action, NULL ); 编译给了我以下的警告和错误: […]

如何使用ptrace(2)来改变syscalls的行为?

有没有任何指南或例子(尤其是ARM的)或使用ptrace库来影响其他进程的执行? 例如,为了使它相信一些数据出现在文件描述符上(即释放select/轮询一些结果和“回答”下面的内核之前读取系统调用)。 期待涉及PTRACE_SYSEMU的事情。 可以用便携的方式来完成吗? 我想要像libc重写LD_PRELOAD技巧,但可以在运行时附加。 可以用一些gdb命令来完成吗? 理想的变种是,如果有一些库可以方便地挂载到系统调用中,并在实际调用(或模拟它们)之前进行编辑,就像使用LD_PRELOAD进行调用一样。 @link 使用PTRACE_SYSEMU的任何好的指南?

了解clock_gettime的问题

clock_gettime可以访问不同的时钟。 特别是我感兴趣的是: CLOCK_REALTIME CLOCK_PROCESS_CPUTIME_ID CLOCK_THREAD_COUTIME_ID 我阅读了这个手册,但是对我没有太大的帮助。 我使用clock_gettime来为我的分析器生成时间戳,当它通过套接字发送收集的数据时。 我注意到以下的不同: CLOCK_REALTIME 我用这个时钟从我的分析器收到的事件有时是错误的顺序。 时间戳以较高的值开始,但不是很高。 通常最后的消息(具有较高时间戳的消息)首先出现,而后面的消息则以较低的值出现。 CLOCK_PROCESS_CPUTIME_ID CLOCK_THREAD_COUTIME_ID 我发现两个时钟都没有什么区别,尽pipe它们的值较小,总是正确的。 我无法解释这种行为。

在c ++中使用ioprio_set

我正在尝试使用ioprio_set为IO调度程序提供调用线程更高的优先级。 这是在一个C ++程序中完成的。 我想要这个电话看起来像这样: ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,0)); 手册页说ioprio_set没有Glibc包装,所以他们应该使用系统调用。 我尝试了以下内容: syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,0)); 问题是无法findmacrosIOPRIO_WHO_PROCESS,IOPRIO_PRIO_VALUE和IO_PRIO_CLASS_BE,我不知道如何用int值replace它们。 感谢您的任何build议!

试图通过陷阱标记和陷阱信号处理程序单步执行程序,在vsyscall上崩溃

我想创build一个完整的程序执行指令跟踪,收集一些统计信息等。我首先尝试使用Linux的ptracefunction来逐步通过一个程序(使用这里的教程)。 这创build了两个进程,跟踪的和debugging器,并通过信号进行通信。 我只有每秒16K的指令(在1.6GHz Atom上),所以对于任何不重要的东西来说这太慢了。 我以为通过信号的进程间通信太慢了,所以我试着在执行过程中设置debugging:设置陷阱标志,并创build一个信号处理程序。 当一个软件中断被用来做一个系统调用时,陷阱标志应该被保存,内核将使用它自己的标志 – 所以我想。 但我的程序不知何故被信号SIGTRAP杀死。 这是我设置的: #include <stdio.h> #include <unistd.h> #include <signal.h> int cycle = 0; void trapHandler(int signum) { if (cycle % 262144 == 0) { write(STDOUT_FILENO," trap\n",6); } cycle += 1; } void startTrace() { // set up signal handler signal(SIGTRAP, trapHandler); // set trap flag asm volatile("pushfl\n" "orl […]

Linux – 为什么自定义系统调用不能正确使用负数?

我写了一个自定义的系统调用来比较两个整数并返回最大的赋值。 这是我的内核代码(max.c): #include <linux/kernel.h> #include <linux/syscalls.h> asmlinkage long sys_max(int num1, int num2) { if (num1 > num2) { return num1; } else { return num2; } } 这里是我的用户空间代码(max.h): #include <unistd.h> #define SYS_MAX 323 int max(int num1, int num2) { int maxnumber = syscall(SYS_MAX, num1, num2); return maxnumber; } 我正在使用这个小程序来testing系统调用: #include <stdio.h> #include <max.h> int main() […]