2012-01-06 6 views
3

У меня есть этот тонкий вопрос о виртуальной памяти. В одной книге я прочитал эту цитатуоб виртуальной памяти

Когда файл ELF выполняются, текст и два сегмента данных загружаются на отдельную области виртуальной памяти

Но если мы, например, компилировать C программа, состоящая из двух исходных файлов без связывания, создаст два объектных файла. И в обоих объектных файлах адресация начинается с нуля. Затем, если мы свяжем оба объектных файла с одним исполняемым и проверим его, мы заметим, что адресация больше не начинается с нуля, а некоторый адрес уже назначается каждому из сегментов. И, как я понимаю, этот назначенный адрес является адресом виртуальной памяти. Поэтому у меня есть два вопроса:

  1. Я исправлю, что это компоновщик, который запрашивает некоторый диапазон виртуальной памяти от ОС и назначает его сегментам программ?
  2. Что означает автор цитаты, когда он сказал, что виртуальный адрес назначается при выполнении процесса?

ответ

3

Линкером будет присвоен виртуальный адрес, который может использоваться как «базовый» для загруженных сегментов. Итак, да, компоновщик назначает базу виртуальных адресов. ОС просто сопоставляет эту память с физическим адресом. Назначение - это ОС, назначающая физический адрес виртуальному.

+0

Спасибо за ответ, может быть, вы знаете, какие системные вызовы используются компоновщиком для запроса этого виртуального адреса, который служит базой? –

+0

Я не на 100% компетентен в этой области, но, насколько я понимаю, компоновщик назначает собственный произвольный виртуальный адрес без необходимости запрашивать его у операционной системы. – ExtremeCoder

Смежные вопросы