系统调用如何工作?
系统调用期间会发生什么操作?
有各种各样的系统调用open , read, write, socket等我想知道他们一般如何工作?
根据此页面,gettimeofday是一个x86-86的系统调用(只需gettimeofday在框中搜索):
int gettimeofday(struct timeval *tv, struct timezone *tz);
Run Code Online (Sandbox Code Playgroud)
我认为迪斯应该很容易,只需准备两个指针并调用相关的syscall.
但它的disas做得更多:
(gdb) disas gettimeofday
Dump of assembler code for function gettimeofday:
0x00000034f408c2d0 <gettimeofday+0>: sub $0x8,%rsp
0x00000034f408c2d4 <gettimeofday+4>: mov $0xffffffffff600000,%rax
0x00000034f408c2db <gettimeofday+11>: callq *%rax
0x00000034f408c2dd <gettimeofday+13>: cmp $0xfffff001,%eax
0x00000034f408c2e2 <gettimeofday+18>: jae 0x34f408c2e9 <gettimeofday+25>
0x00000034f408c2e4 <gettimeofday+20>: add $0x8,%rsp
0x00000034f408c2e8 <gettimeofday+24>: retq
0x00000034f408c2e9 <gettimeofday+25>: mov 0x2c4cb8(%rip),%rcx # 0x34f4350fa8 <free+3356736>
0x00000034f408c2f0 <gettimeofday+32>: xor %edx,%edx
0x00000034f408c2f2 <gettimeofday+34>: sub %rax,%rdx
0x00000034f408c2f5 <gettimeofday+37>: mov %edx,%fs:(%rcx)
0x00000034f408c2f8 <gettimeofday+40>: or $0xffffffffffffffff,%rax
0x00000034f408c2fc <gettimeofday+44>: jmp …Run Code Online (Sandbox Code Playgroud) 据我所知,用户级线程是在用户空间中实现的,而内核级线程是在内核空间中实现的。我还读到用户级线程被映射到内核级线程以实际运行用户级线程。
“实施”到底是什么意思?这是否意味着线程控制块分别定义在用户空间和内核空间中?
当进行系统调用时会发生什么?该系统调用在哪个内核线程(或用户线程 IDK)上运行?每个内核级堆栈都有自己的堆栈吗?
我知道线程只是进程的一部分。当我们处理内核线程时,这里对应的进程是什么呢?内核进程是什么,你能举个例子吗?
我也参考了其他答案,但没有得到满意的结果。
system-calls ×4
process ×2
assembly ×1
c ×1
internals ×1
kernel ×1
linux ×1
linux-kernel ×1
x86-64 ×1