我一如既往地感谢您花时间和精力协助我的旅程:)
因此,作为一名书呆子,我已经开始撤回操作系统的工作方式。我对内核和标准库有疑问,例如glibc for Linux,它充当函数包装器。
为什么操作系统需要一个用C语言编写的标准库?或者问另一种方法你能用C语言以外的其他语言编写Linux内核的标准库吗?
我认为STD库的语言可能依赖于为内核选择的语言。因此,在我们用C语言编写的Linux示例中,包装器STD库也需要是C。
我理解为什么内核需要一般的STD库,所以这不是我想要在JIC上得到的我不清楚。
再次感谢!
答案 0 :(得分:3)
让我们深入了解操作系统 - 用户空间通信。你知道怎么回事吗?基本上每个平台都使用自己的方法来制作所谓的系统调用 - >控制从用户空间到内核空间的转移。
例如,x86使用int
指令,x86-64使用syscall
指令,arm使用swi
等等。此外,每个平台都有自己对如何在调用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函数(请参阅libc中的archc的syscall.S)。这个系统调用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. */
基本上,正如 user4098326 和 rcgldr 所提到的那样 - 空间和内核之间的互连是汇编代码,以及它上面的所有东西 - 只是包装器。因此,据我所知,所有这些包装器都可以写成不仅仅在C 。
答案 1 :(得分:-1)
通用内核驱动程序通过文件操作来完成,例如open,close,read和&写。
同样,内核也完全用C语言编写。
因此有两个原因 我认为,我们不能用其他语言编写低级库调用。