【发布时间】:2020-04-27 19:43:46
【问题描述】:
我的背景是 Windows,我是 Linux 菜鸟。仍在尝试围绕一些基本概念,特别是系统库:
- Windows 具有包装系统调用的 ntdll.dll 和 CRT dll
C 语法与 ntdll OS 公开的接口之间的哪个接口
服务。
(为简化起见,我忽略了中间层 user32、kernel32、kernalbase 等。我也意识到 CRT 是几个 dll,这不是重点)。 - 似乎 Unix/Linux 几乎只有 libc,它包装了系统调用和直接从您的应用程序代码调用。
这是正确的类比吗? (ntdll + CRT) libc ?
我意识到 C 和 Unix 是一起发展的,但我仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。是否有可能在 Linux 中没有 OS/C 运行时边界?
【问题讨论】:
-
libc 是的边界,是的。它将
open()之类的函数转换为适当的内核系统调用。 -
Windows C 运行时中的 POSIX 系统函数通常不适合并且过于局限。大多数本机程序直接使用 Windows API,例如
CreateFileW->NtCreateFile。或者他们使用 C++ 标准模板库和 Windows API。将 WINAPI DLL 称为“中间层”严重歪曲了典型用法。 -
此外,内核中的系统服务表由 Windows 子系统内核驱动程序 win32k.sys 扩展,这些系统调用在用户模式下由 win32u.dll 包装,而不是由基本系统 DLL 包装, ntdll.dll。在 Windows 10 之前,这些 win32k 系统调用是直接在 user32.dll 和 gdi32.dll 中进行的。
标签: linux windows shared-libraries