c++ - 我自己的操作系统内核上的 C++ 静态构造函数

标签 c++ operating-system kernel osdev

我正在尝试用 C++ 编写内核,我是操作系统开发的初学者。现在我正在实现 cout 以在监视器上显示,但我遇到了一些问题。我知道我问的问题很愚蠢,但我也是 C++ 的新手。

我写了一个 OStream 类,它调用系统函数 write 来显示在屏幕上。它的基类是我的视频类。此类包含在命名空间 std 中。所以主要的问题是,当我创建一个 OStream 对象时,它没有调用它的构造函数,因此也没有调用它的基类的构造函数,所以视频内存没有初始化,因此屏幕上不会显示任何内容。

这是我的代码:

/*OStream.h*/
namespace std{
class OStream:public Video{
    public:
    OStream();
    OStream& operator<<(int);
    OStream& operator<<(String);
    OStream& operator<<(char *cp);
    OStream& operator<<(char c);
    OStream& operator<<(unsigned char *cq);
    OStream& operator<<(unsigned char c1);
};
extern OStream cout;
}

/*OStream.cpp*/
namespace std{
    OStream cout;
    OStream::OStream(){}
    OStream& OStream::operator<<(char *cp){
        write(cp);
    }
    .
    . 
    .
    .
}

在上面的代码中,我在 OStream.cpp 文件本身中创建了一个 OStream 类的对象。 但是,如果我在我的主模块中创建一个对象,那么它会成功调用其构造函数,但 cout 将无法正常工作。

这意味着如果我显式创建一个对象,它会完美地工作,但我如何隐式创建一个对象。

我的 Interrupt.cpp 模块也发生了同样的事情。

所以请帮我解决这类问题。 请帮我。 任何帮助将不胜感激。 谢谢。

最佳答案

首先,您的 cout 实现不符合规范。如果您要编写 C++ 标准库,则必须将其编写为符合所述标准(而不是您认为标准是什么)。

其次,您需要实现静态构造函数支持。您没有指定您的编译器,所以我只能说找出您的编译器将其静态构造函数初始化代码放在哪里,并确保在程序启动时调用它。

将现有的 C++ 库(GCC 的 libstdc++ 或 clang 的 libc++)改编为您的新操作系统可能比从头开始编写一个库更幸运。编写 C++ stdlib 不适合初学者;您很快就会深入了解模板元编程。

关于c++ - 我自己的操作系统内核上的 C++ 静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216676/

相关文章:

c++ - 是否可以访问物理地址0?

linux - 为什么在Linux内核中close函数在 `struct file_operations`调用release?

c++ - 默认情况下,Windows 内存映射文件内容是否始终清零?

c++ - 伯恩斯坦多项式插值

c++ - 为什么没有提供 std::regex_traits<char32_t> 的定义(因此没有提供 std::basic_regex<char32_t>)?

c++ - 如何分离 `QObject` 的父子关系的关注点,例如与其他所有者互操作?

c++ - 你能解释一下这个 C++ 删除问题吗?

c++ - C可以用来捕获机器上的系统调用吗?

operating-system - 操作系统 : Peterson's solution

linux - 用户模式和内核驱动程序通信