использование файла отображения памяти в виртуальном адресном пространстве

Что ж. Я довольно сильно запутался с концепцией memory mapped file, используемой в virtual address spaces.

По следующей ссылке я погуглил.

http://en.wikipedia.org/wiki/Виртуальное_адресное_пространство

Я нашел раздел

           Then the application's executable file is mapped into the Virtual Address Space. 
           Addresses in the process VAS are mapped to bytes in the exe file. 
           The OS manages the mapping:

                   0                                            4GB
         VAS        |---vvvvvvv------------------------------------|
         mapping        |-----|
         file bytes     app.exe

        The v's are values from bytes in the mapped file.

Теперь, какое отношение этот файл с отображением памяти имеет к конкретному процессу в конкретном виртуальном адресном пространстве (запутанное в последнем утверждении в приведенном выше разделе)?

Почему существует явная необходимость включения кода для создания файла с отображением памяти, соответствующего конкретному процессу?


person Arjun K P    schedule 10.10.2013    source источник
comment
Он описывает, как код исполняемого файла, который вы запускаете, загружается в память с помощью отображения памяти.   -  person Barmar    schedule 10.10.2013


Ответы (1)


Первое, что вам нужно понять, это разница между физическим адресом и виртуальным адресом. Когда ваша программа записывает данные в определенный (виртуальный) адрес памяти, адрес вашей записи преобразуется в фактический адрес на микросхеме ОЗУ. Если физический адрес не запрограммирован для определенного виртуального адреса, вы обычно получите нарушение прав доступа или ошибку сегментации.

Это работает следующим образом: модуль управления памятью (MMU) генерирует исключение ЦП, из-за которого выполнение переходит к обработчику ошибок ядра. В случае нарушения доступа ваш процесс завершается.

Ядро может делать и другие умные вещи. Если ваш процесс бездействует, он может скопировать часть физической памяти, используемой вашим процессом, в файл подкачки (и удалить записи из mmu), когда вы получите доступ к указанным адресам, исключение ЦП не прервет вашу программу. Вместо этого ядро ​​сначала приостановит ваш процесс. Затем он скопирует данные из файла подкачки обратно в память, перепрограммирует MMU. Затем ядро ​​​​возобновит ваш процесс, и процесс получит доступ к памяти, как если бы она всегда была там. Что касается самого процесса, то ничего особенного не произошло. Этот процесс известен как пейджинг по требованию.

Когда вы mmap файл, ядро ​​эффективно выполняет пейджинг по требованию, но из указанного вами прочитанного файла, а не из файла подкачки. Процесс точно такой же. Исключение доступа к ЦП приведет к тому, что данные из файла будут считаны в ОЗУ, к которому вы обращаетесь как к обычной памяти. Когда вы закрываете файл, память записывается обратно в освобожденный файл. Большим преимуществом является то, что вы можете использовать данные в файле с указателями.

Надеюсь это поможет

person doron    schedule 10.10.2013