Продолжая мои усилия по исследованию развития ОС, я сконструировал почти полную картину в моей голове. Меня все еще ускользает.
Вот основной процесс загрузки, исходя из моего понимания:
1) BIOS/Bootloader выполняет необходимые проверки, инициализирует все.
2) Ядро загружается в ОЗУ.
3) Ядро выполняет инициализацию и запускает задачи планирования.
4) Когда задача загружается, ему предоставляется виртуальное адресное пространство, в котором оно находится. Включая .text,.data,.bss, кучу и стек. Эта задача "поддерживает" свой собственный указатель стека, указывая на свой "виртуальный" стек.
5) Контекстные коммутаторы просто вставляют файл регистра (все регистры процессора), указатель стека и счетчик программ в некоторую структуру данных ядра и загружают другой набор, принадлежащий другому процессу.
В этой абстракции ядро является "материнским" процессом, внутри которого размещаются все остальные процессы. Я попытался выразить свое лучшее понимание на следующей диаграмме:
Вопрос в том, правильно ли эта простая модель?
Во-вторых, как исполняемая программа узнала о своем виртуальном стеке? Это задание ОС для вычисления указателя виртуального стека и размещения его в соответствующем регистре CPU? Остальная учетная запись стека выполняется с помощью команды pop и push команды?
Является ли в самом ядре свой собственный основной стек и куча?
Спасибо.