【问题标题】:How to use STLPort in my kernel?如何在我的内核中使用 STLPort?
【发布时间】:2011-11-20 04:26:12
【问题描述】:

我正在用 C++ 开发内核。但是我不想写stdlib;为此我下载了STLporthttp://www.stlport.org/,但我不知道如何安装和使用。

我正在使用 Linux 构建我的内核。

如何在我的内核中使用 c++ 标准库?

而且我不想从 STLport 移植所有库。如何排除选择的库?比如std::stringstd::vector等。

【问题讨论】:

  • 用 boost 扩展 2.6.35 怎么样?我认为它应该满足您的所有需求!
  • 感谢您的回复,但我并不是指 Linux Kernel 来开发我的内核。我正在开发与 Linux 和 Unix 完全不同的内核。
  • 我使用的是 Linux Fedora Core 15
  • 当我安装 stlport 时出现如下错误:/usr/bin/ld: cannot find -lsupc++
  • 提供有关您的环境(环境变量、编译器版本以及您如何调用它)、您如何安装 STLPort 等的更多详细信息

标签: c++ kernel osdev stlport


【解决方案1】:

为了让 STL 工作,你必须移植一些东西,比如静态初始化(例如 std::cin 和 std::cout)和堆栈展开......

您必须移植,即:libsupc++ 并将其包含在您的内核中。 基本上所有这些东西一开始就不应该在内核中。 不要使用 向量使用静态数组,因为向量可能会重新分配您的数据!

所有这些东西都会让你的内核膨胀!

你可以看看 L4 允许自己在内核中使用什么。他们不做内存分配,也不做异常(不可预测),尤其是不做 STL。

后面的链接将让您了解需要移植哪些内容才能获得 c++ 操作系统支持。 Libsupc++ 是 gcc 的一部分。它的目的是封装所有需要运行时代码的部分。

Useful information about libsupc++

Useful information about c++ operating system support

【讨论】:

  • 我该怎么做?我不知道程序。当我安装 STLport 时,它给了我/usr/bin/ld: cannot find -lsupc++ 的错误
【解决方案2】:

我可能会建议不要在内核开发中使用 STL。 STL 将假定某种形式的标准库支持,而您的内核中没有这种支持。此外,大多数内存分配操作都没有时间限制,因此不适合在中断处理程序中使用。异常是另一件可能在内核中引起严重头痛的事情

【讨论】:

  • 所以我不想使用 STL 中的所有函数,我只想使用不会影响内核的基本 STL,例如 std::string、std::vector、math.h。我想要标准 iostream lib,但它应该调用我自己的系统函数writeput_char。所以请帮助我,我该怎么做?
  • STL 本身不进行内存分配;这是标准库的另一部分。考虑到他是用 C++ 编写内核,想必他有一个合适的operator new 适合内核使用。
  • 是的,我有适当的operator new 用于内存分配。我只想使用非常基本的功能,例如IO operations, string operations, algebraic operations etc.。谢谢。
  • 不要使用字符串,使用静态数组,因为你永远不知道字符串何时分配内存。如果有的话,内核也会有自己的 IO 方式,所以请忘记标准库中的任何内容。
【解决方案3】:

我不确定内核中的 STL 是否真的很好,但如果你真的想尝试,它非常有趣。我已经编写了自己的操作系统,当我在内核中分配内存时,我做的第一件事就是移植 STLport (5.2.1)。到目前为止,它运行良好,尽管内核本身还太初级。

无论如何,我可以分享一些移植的经验。

  1. 移植 STLport 不需要构建和很少的先决条件,只需包含头文件并让编译器知道它的路径(gcc 的 -I 选项)。模板类将与您的 cpp 源文件一起编译。

  2. STLport 是可配置的,你可以禁用你买不起的,选择你想要的,比如iostream、debug、exception、RTTI和threading。只需查看文档,然后查看配置标题,它的注释非常好(例如 stlport/stl/config/user_config.h)

  3. 作为最基本的,您将需要mallocfree,或者可能需要newdelete 和变体。这对于移植标准字符串、容器和算法、IIRC 来说已经足够了。但它既不是线程安全的,也不是内存分配优化的,你在依赖它时需要非常小心。

  4. 您可以拥有自己的 iostream,它只是模板类和全局对象(顺便说一句,我破解了 ELF 部分并通过调用函数手动初始化了我的全局对象),但这需要更多工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2019-03-28
    • 2015-09-19
    • 1970-01-01
    • 2011-05-19
    • 2013-06-21
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多