所以我试图通过以下“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) 我的代码正在分叉一个进程并打印每个进程的 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) 当 C 程序被 kernel\xe2\x80\x94by 执行时execve(),
在哪里调用在调用 main 函数之前调用的execve()特殊启动例程?crt0
execve()main函数在哪里调用?
我在https://elixir.bootlin.com/linux/latest/source/fs/exec.c中找不到它们。
\n\n从理解Linux内核开始,execve()内部寻找一个可以加载可执行文件的linux_binfmt对象并调用其方法来加载,同时还加载动态链接器来加载和链接可执行文件所使用的共享库。但书中没有说明如何从可执行文件中调用启动例程和程序的 then 。load_binary()load_binary()execve()crt0main()
谢谢。
\n我进行了系统调用并重新编译了内核,但是在运行系统调用时它返回了 Killed。因此,为了跟踪它,我使用了 strace,它显示了以下消息:
syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?
这是什么意思(不是十六进制,问号)?
我在理解这个程序的原因时遇到问题
#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");语句如何工作的帮助都会非常有帮助。
我认为用户程序可以通过多种方式有意影响 Linux 内核的状态。
我想不出任何其他方式。不考虑硬件中断,因为它们不是由用户程序启动的。我认为mmap()和insmod都在使用系统调用,所以用户程序可能不得不依赖系统调用来影响内核的状态。我对么?
如果我是对的,假设内核中存在一些漏洞,恶意用户程序想要利用它们来攻击内核。考虑到我们的验证总能说出真相,是否有可能验证每个系统调用来防御此类攻击?
假设我编写了一个无意义的程序,其特征是单个系统调用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链接,但不识别其他链接。
这些其他库之一是否包含内核系统调用?或者系统调用函数有可能是静态链接的吗?(似乎不太可能)。
我试图了解使用中断的“旧”系统调用机制与当前依赖特定处理器指令的系统调用机制之间的区别。
AFAIK 在 C 程序方面的工作方式相同:即调用内核 C 函数,然后分派到正确的系统调用处理程序。那么,是什么让“新的”系统调用系统更加高效?
仅仅是因为更高效的处理器指令使调用“系统调用”比“中断”更快吗?与系统调用本身必须执行的工作量(即写入文件)相比,这种时间差异是否足够显着?