gpt4 book ai didi

c++ - libc 是如何工作的?

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:34 27 4
gpt4 key购买 nike

我正在编写一个 MIPS32 仿真器,并希望在使用 gcc 编译 C 程序时能够使用整个标准 C 库(可能带有 GNU 扩展)。

据我所知,I/O 由 MIPS32 架构上的系统调用处理。要使用 libc/glibc 成功运行程序,我如何知道我需要模拟哪些系统调用?(无需反复试验)

编辑:参见 this举例说明我所说的系统调用是什么意思。

(您可以查看项目 here 如果您有兴趣,欢迎任何反馈。请记住,它处于非常的早期阶段)

最佳答案

非常简短的回答

阅读更长的答案。

简答题

如果您打算提供一个自定义 libc,它使用您的模拟器的某些功能让主机操作系统执行您的系统调用,您必须实现所有这些。

更长的答案

退后一步,看看事物在真实(非模拟)系统中的典型分层方式:

  1. 外围设备有一些 I/O 接口(interface)(例如,带编号的端口或内存映射),CPU 可以通过这些接口(interface)让它们做任何事情。
  2. CPU 运行了解如何操作硬件的软件。这可以是单一用途的程序或运行其他程序的操作系统。由于 libc 在图片中,我们假设有一个操作系统,并且它是 Unix-y。
  3. 由操作系统运行的用户空间程序在它们自己和操作系统之间使用定义的接口(interface)来请求执行某些“系统”功能。

您要完成的工作发生在第 3 层和第 2 层之间,其中 libc 或用户代码中的函数执行操作系统定义为触发系统调用的任何操作。这打开了许多蠕虫 jar 头:

  • 操作系统定义为触发系统调用的内容因操作系统而异,并且(很少)在同一操作系统的不同版本之间也不同。通过提供负责隐藏这些细节的可动态链接的 libc,这个问题在“真实”系统上得到了缓解。除此之外,如果您有要运行的 MIPS32 二进制文件,它是否使用您的模拟器支持的系统调用约定?

  • 您需要提供一个自定义 libc,它可以执行您的模拟器可以识别为进行特定系统调用并执行的操作。您希望运行的任何程序都必须交叉编译为 MIPS32 并与其静态链接,程序需要的任何其他库也是如此(我想到了 libm)。或者,您的模拟器包将需要提供动态链接器的模拟以及所有必需库的可动态链接的拷贝,因为在主机上打开它们将不起作用。如果您有足够的源代码从头开始重新编译程序,移植可能比模拟更好。

  • 任何对特定系统上的文件路径做出假设或对它们将在某些设备(它们本身就是文件)中找到的内容做出其他假设的代码都不会正确运行。

  • 如果您提供第 2 层,那么您就是在注册自己,以提供对整个操作系统的一个特定版本的行为的完整、正确的模拟。像 read()write() 这样的调用很容易处理;其他如 fork()uselib()ioctl() 会困难得多。您的程序使用的调用和行为与您的主机操作系统提供的调用和行为也不一定是一对一的映射。所有这些都假设主机是 Unix,目标程序也是。如果目标是为其他一些环境编译的,那么所有的赌注都没有了。

最后一点是为什么大多数仿真器只提供 CPU 和某些目标系统的硬件行为(即第 1 层中的所有内容)。有了这些,您就可以运行原始系统的引导 ROM、操作系统和用户程序,全部保持不变。有许多 existing MIPS32 emulators这样做并且可以运行在他们模拟的硬件上运行的操作系统的未更改版本。

HTH,祝你的项目好运。

关于c++ - libc 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5882324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com