标签: system-calls

列出应用程序中使用的系统调用

有没有什么方法可以获取应用程序中使用的所有系统调用的列表,而无需运行应用程序中所有可能的场景?

system-calls

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

Strace Hello World 程序

所以我试图通过以下“Hello World!”来理解系统调用。程序:

#include <stdio.h>

int main(){

   printf("Hello World!\n");
   return 0;

}
Run Code Online (Sandbox Code Playgroud)

然后我在可执行文件上运行 strace 并得到以下信息:

execve("./hello", ["./hello"], [/* 62 vars */]) = 0
brk(0)                                  = 0x85a5000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb774f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/home/miguel/GNUstep/Library/Libraries/tls/i686/sse2/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/home/miguel/GNUstep/Library/Libraries/tls/i686/sse2", 0xbf8df160) = -1 ENOENT (No such file or directory)
open("/home/miguel/GNUstep/Library/Libraries/tls/i686/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/home/miguel/GNUstep/Library/Libraries/tls/i686", 0xbf8df160) = -1 ENOENT (No such …
Run Code Online (Sandbox Code Playgroud)

system-calls strace

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

输出中出现意外的父进程 ID

我的代码正在分叉一个进程并打印每个进程的 PID 和 PPID。我期待孩子的 PPID 与父母的 PID 相同,但事实并非如此。

我正在使用 Ubuntu 14.04。

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid==0){
        printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
    }
    else
        printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

I am the parent and my pid is 29229 and my parent id is 27087
I am the …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu system-calls fork

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

`execve()` 如何调用特殊的启动例程和 main() 函数?

当 C 程序被 kernel\xe2\x80\x94by 执行时execve()

\n\n
    \n
  • 在哪里调用在调用 main 函数之前调用的execve()特殊启动例程?crt0

  • \n
  • execve()main函数在哪里调用?

  • \n
\n\n

我在https://elixir.bootlin.com/linux/latest/source/fs/exec.c中找不到它们。

\n\n

从理解Linux内核开始,execve()内部寻找一个可以加载可执行文件的linux_binfmt对象并调用其方法来加载,同时还加载动态链接器来加载和链接可执行文件所使用的共享库。但书中没有说明如何从可执行文件中调用启动例程和程序的 then 。load_binary()load_binary()execve()crt0main()

\n\n

谢谢。

\n

linux system-calls exec

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

为什么 strace 显示 syscall =?

我进行了系统调用并重新编译了内核,但是在运行系统调用时它返回了 Killed。因此,为了跟踪它,我使用了 strace,它显示了以下消息: syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?

这是什么意思(不是十六进制,问号)?

linux c kernel system-calls strace

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

问题理解系统("/bin/sh")

我在理解这个程序的原因时遇到问题

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int iRetval = 0;
    unsigned int uiNum;

    printf("Enter number: ");
    fflush(stdout);
    iRetval = scanf("%u", &uiNum);
    printf("\nThe number is %u, Retval: %i\n", uiNum, iRetval);
    fflush(stdout);
    if( iRetval > 0)
        system("/bin/sh");
    else
        printf("Goodbye!\n");
}
Run Code Online (Sandbox Code Playgroud)

从我的 bash shell 调用时

echo -e "3\nls\n" | myprogram
Run Code Online (Sandbox Code Playgroud)

不打印 ls 的输出。就好像system("/bin/sh")调用没有从调用者的 stdin 中读取一样。我不是一个普通的 linux 用户,所以任何关于阅读内容或尝试尝试的实验或运行命令以更好地理解system("/bin/sh");语句如何工作的帮助都会非常有帮助。

c pipe system-calls stdin

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

关于流程生命周期的问题

我已经设法对流程生命周期中的系统调用wait(2)_exit(2)系统调用进行了质疑。

我关于wait(2)系统调用的问题是......父进程是否将它发布给内核?还是内核将其发布给父进程?并且是_exit(2)从子进程到父进程的 [ ] 系统调用问题吗?还是子进程_exit(2)向内核发出 [ ] ?

我尝试谷歌搜索并观看 youtube 视频以获得答案......但我从未看到任何特定于此的东西。

process system-calls exit wait

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

系统调用是用户程序有意影响 Linux 内核状态的唯一方式吗?

我认为用户程序可以通过多种方式有意影响 Linux 内核的状态。

  1. 通过调用系统调用;
  2. 通过调用mmap(),写入已经映射到内核的内存;
  3. 通过insmod加载内核模块。

我想不出任何其他方式。不考虑硬件中断,因为它们不是由用户程序启动的。我认为mmap()insmod都在使用系统调用,所以用户程序可能不得不依赖系统调用来影响内核的状态。我对么?

如果我是对的,假设内核中存在一些漏洞,恶意用户程序想要利用它们来攻击内核。考虑到我们的验证总能说出真相,是否有可能验证每个系统调用来防御此类攻击?

linux security kernel system-calls linux-kernel

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

系统调用函数如何链接到可执行文件?

假设我编写了一个无意义的程序,其特征是单个系统调用open

#include <fcntl.h> 

void main()
{
    int hi = open("does not exist", 0);
}
Run Code Online (Sandbox Code Playgroud)

当我编译程序并对ldd输出发出命令时,我得到以下信息:

linux-vdso.so.1 (0x00007ffddd741000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6835328000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6835584000)
Run Code Online (Sandbox Code Playgroud)

我只识别该libc.so.6链接,但不识别其他链接。

这些其他库之一是否包含内核系统调用?或者系统调用函数有可能是静态链接的吗?(似乎不太可能)。

gcc system-calls dynamic-linking

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

为什么“新”系统调用比“中断”系统调用快?

我试图了解使用中断的“旧”系统调用机制与当前依赖特定处理器指令的系统调用机制之间的区别。

AFAIK 在 C 程序方面的工作方式相同:即调用内核 C 函数,然后分派到正确的系统调用处理程序。那么,是什么让“新的”系统调用系统更加高效?

仅仅是因为更高效的处理器指令使调用“系统调用”比“中断”更快吗?与系统调用本身必须执行的工作量(即写入文件)相比,这种时间差异是否足够显着?

linux system-calls linux-kernel

0
推荐指数
1
解决办法
294
查看次数

标签 统计

system-calls ×10

linux ×5

c ×2

kernel ×2

linux-kernel ×2

strace ×2

dynamic-linking ×1

exec ×1

exit ×1

fork ×1

gcc ×1

pipe ×1

process ×1

security ×1

stdin ×1

ubuntu ×1

wait ×1