Распределение памяти в x86 или аналогичной сборке - PullRequest
0 голосов
/ 13 апреля 2020

Контекст: я создаю свой собственный процессор и набор инструкций в качестве учебного упражнения.

Я пытаюсь понять, как низкоуровневая программа сборки знает, к каким адресам памяти она может получить доступ. Даже если мы предполагаем, что мы работаем без виртуальной памяти или защиты ОС, а вся оперативная память свободно записывается, мы должны быть уверены, что случайно не перезаписали наши собственные инструкции, поскольку программа, которой она манипулирует, хранится по одному адресу. пробел.

На мой взгляд, у нас есть три типа памяти на этом уровне.

  • Stati c memory: это будет объявлено символически в разделе DATA сборки программа. Каким-то образом это волшебным образом преобразуется в пригодные для использования адреса.
  • Память стека: Как только регистры стека установлены, мы можем с радостью выложить pu sh и pop. Но как мы узнаем, куда изначально положить основание стека?
  • Куча памяти: программы пользовательского режима будут запрашивать это через системный вызов, и ОС будет обрабатывать все сложные вещи. Мы просто получаем адрес в возвращаемом значении и используем его. Однако если мы пишем ядро, а не программу пользовательского режима, такой концепции не существует.

Мои вопросы сводятся к следующему:

  1. Как и когда stati c объявления данных переводятся в реальные адреса?
  2. Для программы пользовательского режима, которая будет загружаться операционной системой, как он узнает, куда поместить стек?
  3. Для программы в режиме ядра, которая является ОС, как она узнает, какую память она может использовать для структур данных ядра, выделяя процессам et c? Должно ли все быть объявлено заранее?

Не стесняйтесь приводить примеры из любой архитектуры / реализации ОС, я просто пытаюсь понять, как это вообще возможно.

...