操作系统体系结构:内核和标准库的互操作性



一如既往,我感谢您为我的旅程付出的时间和精力:)

因此,作为一个书呆子,我已经开始揭开操作系统的工作原理。我有一个问题是关于内核和标准库,比如glibc for Linux,它充当函数包装器。

为什么操作系统需要一个用C编写的标准库?OR问了另一种方法。你能用C语言以外的另一种语言为Linux内核编写一个标准库吗?

我认为STD库的语言可能取决于为内核选择的语言。因此,在我们用C编写的Linux示例中,包装器STD库也需要是C.

我理解为什么内核通常需要STD库,所以这并不是我在JIC想要得到的——我不清楚。

再次感谢!

让我们深入了解操作系统用户空间通信的更多细节。你知道进展如何吗?基本上,每个平台都使用自己的方法进行所谓的syscall->控制从用户空间到内核空间的转移。例如x86使用int指令,x86-64使用syscall指令,arm使用swi指令等等。此外,每个平台都有自己的理解,即在调用syscall指令之前应该如何建立参数和syscall编号。让我们关注x86-64:例如,对于调用execve(系统调用编号0x3b),此代码就足够了。你可以试试。

section .text
global _start
_start:                
mov rax, 0x3b             
mov rdi, cmd             
mov rsi, 0
mov rdx, 0
syscall
section .data
cmd: db '/bin/sh'
.end:

现在让我们了解什么是execve-libc函数。基本上,如果您深入研究libc代码,您会发现它是导致syscall函数的包装器(请参阅syscall.S中的arch)。这个系统调用。S看起来与我们上面的例子非常相似:

.text
ENTRY (syscall)
movq %rdi, %rax     /* Syscall number -> rax.  */
movq %rsi, %rdi     /* shift arg1 - arg5.  */
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9    /* arg6 is on the stack.  */
syscall         /* Do the system call.  */

因此,基本上,正如user4098326rcgldr所提到的那样,uspace和内核之间的互连是汇编代码,以及它上面的所有东西——只是包装器。因此,据我所知,所有这些包装器都可以编写,而不仅仅是用C编写。

通用内核驱动程序通过文件操作工作,如打开、关闭、读取和;写

同样,由于内核也是完全用C.编写的

因此,由于这两个原因,我认为,我们不能用其他语言编写较低级别的库调用。

最新更新