Я работаю над проектированием ядра (которое я собираюсь назвать «ядром», просто чтобы оно было другим, но оно в основном то же самое) для ОС, над которой я работаю. Специфика самой ОС не имеет значения, если я не могу запустить многозадачность, управление памятью и другие базовые вещи, поэтому мне нужно сначала поработать над этим. У меня есть некоторые квесты о разработке подпрограммы malloc.
Я полагаю, что malloc () будет либо частью самого ядра (я склоняюсь к этому), либо частью программы, но мне придется написать собственную реализацию C стандартная библиотека в любом случае, поэтому я могу написать malloc. Мой вопрос на самом деле довольно прост в этом отношении, как C (или C ++) управляет своей кучей?
То, чему меня всегда учили в теоретических классах, - это то, что куча - это постоянно расширяющийся кусок памяти, начинающийся с определенного адреса и во многих отношениях ведущий себя как стек. Таким образом, я знаю, что переменные, объявленные в глобальной области видимости, находятся в начале, и больше переменных «помещаются» в кучу, поскольку они объявлены в соответствующих областях, а переменные, которые выходят из области видимости, просто остаются в пространстве памяти, но это пространство помечается как свободное, поэтому куча может расширяться больше, если это необходимо.
Что мне нужно знать, так это то, как C фактически справляется с динамически расширяющейся кучей таким образом? Создает ли скомпилированная программа C свои собственные вызовы подпрограммы malloc и обрабатывает свою собственную кучу, или мне нужно предоставить ей автоматически расширяющееся пространство? Кроме того, как программа C знает, где начинается куча?
О, и я знаю, что те же понятия применимы и к другим языкам, но я хотел бы, чтобы любые примеры были на C / C ++, потому что мне больше всего нравится этот язык. Я также хотел бы не беспокоиться о других вещах, таких как стек, так как я думаю, что могу справиться с такими вещами самостоятельно.
Итак, я полагаю, что мой реальный вопрос, кроме malloc / free (который обрабатывает получение и освобождение страниц для себя и т. Д.), Нужна ли программе ОС для предоставления чего-либо еще?
Спасибо!
РЕДАКТИРОВАТЬ Меня больше интересует то, как С использует malloc в связи с кучей, чем фактические действия самой процедуры malloc. Если это помогает, я делаю это на x86, но C - кросс-компилятор, так что это не должно иметь значения. ^ _ ^
РЕДАКТИРОВАТЬ ДАЛЬШЕ: Я понимаю, что я могу запутаться в терминах. Меня учили, что в «куче» программа хранит такие вещи, как глобальные / локальные переменные. Я привык иметь дело со "стеком" в программировании на ассемблере, и я только что понял, что, скорее всего, имею в виду это. Небольшое исследование с моей стороны показывает, что «куча» чаще используется для обозначения общего объема памяти, который программа выделила для себя, или общего количества (и порядка) страниц памяти, предоставленных ОС.
Итак, с учетом этого, как мне справиться с постоянно расширяющимся стеком ? (кажется, что мой класс теории Си был слегка ... ущербным.)