C ++问题中的OS开发


9

作为硕士项目,我正在设计一个简单的操作系统。它被设计为在x86体系结构上以16位实模式运行。理想情况下,我想使用C ++开发此OS,并且仅在必要时使用汇编。到目前为止,我有一个用汇编语言编写的引导加载程序,用于加载由C ++和asm混合而成的内核。我的问题是关于使用C ++的问题。到目前为止,它已经编译并可以运行,但是我还没有使用任何动态内存分配。

如果我使用的是C,则编写用于处理内存分配的malloc函数是有意义的,但是在C ++中,将使用new关键字。所以...

“ new”在后台如何工作以分配内存,我将如何处理呢?

必然地...

尝试使用C ++来利用其更高级别的摘要是否有意义?还是使用它会更让人头疼,我应该坚持使用C吗?

如果您认为C ++不是一个好的选择,请提供理由。

Answers:


9

new关键字的手离开实际分配operator new,其行为相当类似malloc:它从什么地方得到的内存。然后,编译器将完成所有构造函数魔术。因此,C ++编译器将期望C ++运行时库(或您的代码)提供的实现operator new

使用C ++进行某些抽象当然很有意义。没有理由操作系统应该自行运行std::list<>。异常要麻烦得多。介于两者之间的是从有用到无用的渐变。std::complex?它运行完美,但是为什么需要它?


5

C ++相对于C的许多优点与运行时支持无关,在那种情况下,用C编写的代码和用C ++编写的代码之间实际上没有区别。例如,模板在运行时不执行任何操作。他们没有做很多额外的输入,您做不到的。C ++是用操作系统编写的一种非常合理的语言,因为它在需要时提供了低级访问,并且在您不需要关注比特混乱的情况下可以提供比C高级别的抽象。

new有两件事:它从某个地方获取内存,并运行任何必要的构造函数。在获取内存方面,它与没什么不同malloc


3

大概地为new表达式生成的代码大概是合理的。它是由编译器生成的,但是如果您将其实现为函数,它将看起来像这样:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

如果您关心new工作原理,那么(几乎)不可避免的后续工作就是delete工作原理:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

正如其他人已经指出,::operator new并且::operator delete是非常基本的内存分配。例如,在类似Unix的系统上,它们可能会调用brksbrk分配大块的内存,然后从这些大块中分发较小的块。在您自己的OS中,您可能仍然想要某种类似的sbrk东西-某些东西实际上以所有“空闲”内存开始,然后根据需要分配内存。假设您在实模式下工作,那可能会相当简单-鉴于可用的内存量很少,实际设计几乎需要在精致的算法上强调小尺寸。


-4

大多数操作系统都是用CI思想编写的。另一方面,这是一个硕士项目,所以要做一些不同而有趣的事情。


1
大多数大型操作系统最初都是在C ++可用之前编写的。那限制了选择。:-)
Bo Persson

1
有时我认为选票具有传染性。
凯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.