Я новичок в сборке и поэтому хочу больше узнать о концепции перемещения.
- Почему именно нам нужно перемещать программы, данные?
- Как именно это делается?
Было бы здорово, если бы кто-нибудь мог объяснить на примере начального уровня.
Я новичок в сборке и поэтому хочу больше узнать о концепции перемещения.
Было бы здорово, если бы кто-нибудь мог объяснить на примере начального уровня.
Ассемблер имеет один исходный файл для просмотра. Он должен создать образ памяти на основе этого исходного файла. Таким образом, он начинается с 0 для кода, а также с 0 для данных. Результаты попадают в объектный файл.
Теперь появляется компоновщик, которому нужно объединить множество объектных файлов в исполняемый файл (или образ ядра, или что-то еще). Это не может оставить всех на 0, они будут перекрываться. Таким образом, он должен переместить адреса, чтобы назначить ценность данных каждого объектного файла уникальному диапазону.
Затем, когда образ загружается в виртуальную память, у операционной системы могут быть веские причины использовать адрес, отличный от «0», в качестве базового виртуального адреса. Итак, во время выполнения он хочет снова все переместить.
Наконец, если задействованы разделяемые библиотеки, ни ассемблер, ни компоновщик не знают, где они будут находиться в работающей среде, и поэтому ссылки на них должны быть перемещены.