Как я могу определить, является ли данный адрес частью массива из трассировки? - PullRequest
0 голосов
/ 16 марта 2020

Этот вопрос касается программирования низкого уровня и решений для C, C ++ et c. здесь не применяется

Я знаю, что если вы go просматриваете файл ELF, вы можете видеть глобальные массивы в виде коротких символов. Как процессор узнает, что адрес является частью массива? Поскольку все это видит адреса без определенных метаданных c. Или каким-то образом эта информация передается на более низкие уровни?

Например:

55: 0000000000201078     0 NOTYPE  GLOBAL DEFAULT   24 _end
56: 0000000000000540    43 FUNC    GLOBAL DEFAULT   14 _start
57: 0000000000201070     0 NOTYPE  GLOBAL DEFAULT   24 __bss_start
58: 000000000000064a    49 FUNC    GLOBAL DEFAULT   14 main
59: 0000000000201020    80 OBJECT  GLOBAL DEFAULT   23 test_Var
60: 0000000000201070     0 OBJECT  GLOBAL HIDDEN    23 __TMC_END__

Вышеприведенный раздел представляет собой вывод readelf -s . Поскольку я написал код, я знаю, что строка 59 ссылается на глобальный массив test_Var. Но как я узнаю некоторые данные в инструкции, с которой я сталкиваюсь при моделировании этого кода, скажем, на Gem5 или при запуске инструмента PIN, является частью этого массива. Не говоря уже о том, что на этом этапе я даже не вижу локальных массивов. Итак, вопрос в том, есть ли у меня трассировка команд или даже трассировка данных этой программы, как я могу знать, что этот конкретный массив задействован в данном экземпляре?

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

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

Тип метаданных, которые нужны процессору: : насколько велик элемент (например, байт, половина, слово, четверка), является ли элемент подписанным или без знака, как далеко можно перейти вперед для каждой позиции индекса массива и т. д. c .. И вообще говоря, процессор требует последовательности команд для выполнения любого кода языка высокого уровня, поэтому некоторые метаданные эффективно кодируются в отдельных инструкциях, а также в последовательностях самих инструкций.

Примером здесь является массив, имеющий конкретный тип данных, и конечно, используется (например, индексируется) для чтения и записи в разных частях программы. Программа C кодирует информацию о типе (метаданные) в объявлении массива C, и этот тип хранится независимо от того, какая функция обращается к массиву. Однако процессор не читает декларации данных, только инструкции машинного кода! Таким образом, трансляция повторяет информацию о размере и шаблоне доступа с инструкциями машинного кода и последовательностями команд по мере необходимости, и, таким образом, компилятор обеспечивает согласованный доступ для процессора.

1 голос
/ 16 марта 2020

Это не так; это точка неопределенного поведения в C / C ++: компилятор предполагает, что программист прав и просто делает то, что говорит исходный код. Если это приводит к доступу к другому объекту, находящемуся поблизости в памяти, то это ошибка программиста, а не компилятора или процессоров.

Мы получаем эффективность, даже не пытаясь обнаружить это во время выполнения.

...