почему адрес должен быть указан при статической привязке? - PullRequest
2 голосов
/ 02 марта 2010

фон: флэш-память 0x02000000 / 2M, SDRAM в 0x10000 / 16M, процессор: ks8695.

Загрузчик и ОС записываются на флэш-память, при перезагрузке ОС копируется на SDRAM по адресу 0x10000, затем устанавливается ПК (программный счетчик) на 0x10000 (то есть запускается ОС).

поскольку для ПК задано значение 0x10000 (поскольку процессор может выполнить первую инструкцию ОС на данном этапе), зачем указывать абсолютный адрес текстового раздела ОС (через настройку -Ttext = 0x10000) при связывании это? (когда я устанавливаю -Ttext в 0x0, ОС не будет работать должным образом).

С уважением,

wenlujon

Ответы [ 3 ]

1 голос
/ 02 марта 2010

Я думаю, что вы как бы ответили на свой вопрос - ОЗУ в вашей системе расположено по адресу 0x10000. Два основных способа выполнения кода - хранение и загрузка (SnD) и eXecute-in-place (XIP). Кажется, вы храните код во флэш-памяти и копируете его в оперативную память. Таким образом, все адреса в вашем двоичном файле должны быть смещены с начальным адресом ОЗУ, иначе они будут неправильными в двоичном файле.

Если ваша флеш-память NOR, вы можете технически оставить ее в NOR и запустить код на месте (XIP), хотя он может не подходить для вашей платформы.

Это помогает?

0 голосов
/ 04 марта 2010

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

, учитывая, что первая инструкция ОС - 0xe1a00000, команда со смещением 0x10000 ОС - 0xe3a01303. если -Ttext установлен в 0x0, просмотрев файл карты, мы получим 0xe1a00000 по адресу 0x0, 0xe3a01303 по адресу 0x10000 (ЦП на целевой плате все еще не знает этого!).

Когда загрузчик копирует ОС на адрес 0x10000, он копирует 0xe1a00000 в 0x10000 и 0xe3a01303 в 0x20000 (это не что иное, как данные), я прав? затем установите для ПК значение 0x10000, ЦП должен выполнить 0xe1a00000, поскольку инструкция занимает адрес 0x10000, но ЦП фактически выполняет 0xe3a01303, который находится по адресу 0x20000.

  1. , поскольку 0xe1a00000 находится в 0x10000 SDRAM, когда ПК установлен в 0x10000, почему CPU не выполняет 0xe1a00000?
  2. как процессор узнает, что 0xe3a01303 назначен 0x10000, поскольку эта работа выполняется компоновщиком на моем персональном компьютере?
0 голосов
/ 04 марта 2010

Ваш компьютер имеет 0x10000, поэтому вы должны связать его с 0x10000, потому что ваш код выполняет абсолютную адресацию.

Загрузчик не выполняет связывание или разрешение символов, он просто копирует некоторый двоичный двоичный объект0x10000, а затем настройте ПК на 0x10000.Таким образом, ваш код должен быть готов к запуску в 0x10000, поэтому вам нужно указать это в компоновщике.

вызов функции обычно выполняется с использованием относительной адресации ПК, но это не обязательно в случае, когда вы хотитеиметь доступ к данным.Предположим, у вас есть таблица T. Если вы связаны 0x0, а ваша таблица 0x1234.У вас может быть какая-то инструкция, которая ссылается на этот адрес.

Теперь вы переместите свой код на 0x10000.Ваш адрес таблицы теперь 0x11234, но ваш код не перемещен, поэтому он пытается загрузить данные в 0x1234, где ничего нет, или хрень.

Теперь, когда вы связываете свой код со смещениемнабор команд, который использовался для доступа к T, изменяется соответствующим образом.Вот и все, для чего нужны ссылки, для преобразования символа в адреса!

...