ARM: запись / чтение из int atomic?

В архитектуре ARM, к сожалению, я не знаю точно, что это за чип, является ли 32-битный тип int чтение / запись атомарным?

Есть ли какие-либо гарантии относительно чтения / записи для базовых типов?

2 ответа

Решение

Он должен быть атомарным, ЗА ИСКЛЮЧЕНИЕМ, если этот int хранится по невыровненному адресу.

Это задокументировано либо в TRM для ядра, либо в спецификации AMBA/AXI. Вам нужно посмотреть, какое ядро ​​используется оттуда, если вы можете выяснить, какой тип шины AMBA/AXI, и в этой спецификации она раскрывает атомарный / неатомарный характер каждого из типов транзакций.

Например, swp и ldrex/strex являются атомарными. Strd и stm также должны быть атомарными. Но на ARM11 Mpcore, который мне наиболее знаком, он разбивает записи на одиночные 64-битные циклы шины, выполняет stm с 8 регистрами. Я думаю, что это становится 4 отдельными длинами 1 шинных циклов, где ldm из 8 регистров, я думаю, является одним сделка длиной четыре.

Самое время отметить, что программисты часто не используют ldrex и strex должным образом. Linux имеет это неправильно, например. Они предназначены для блокировки при использовании многоядерного процессора в системе с общей памятью, а НЕ для блокировки потоков программного обеспечения на одном процессоре. Используйте SWP для этого. Вам повезет, если у вас есть кэш L1, поскольку ldrex/strex работает (в пределах одного процессора).

Обратите внимание, что ARM всегда разрешал доступ без выравнивания, иногда по умолчанию (ARM7TDMI), после этого по умолчанию было выброшено прерывание данных, но вы могли изменить настройку так, чтобы этого не было. Unaligned на ARM не делает, например, что хотят программисты x86. если вы читаете 32 бита по адресу 0x02, вы не обязательно получите набор байтов 0x02, 0x03, 0x04, 0x05, вы можете / получите 0x02, 0x03, 0x00, 0x01, используя 32-битную шину AMBA/AXI. Вы МОЖЕТЕ получить желаемый результат на 64-битной шине AMBA/AXI, но, возможно, нет, определенно на 32-битной и 64-битной шинах, если вы прочитаете 32-битные адреса 0x0E, вы получите 0x0E 0x0F и 0x08 0x09 или 0x0c 0x0D. Совсем не то, что ожидают программисты (обычно те, кто знает, как это работает, используют это как хороший байт-swapper), поэтому его часто оставляют как сброс данных и программист, исправляющий их код.

Компиляторы C очень часто создают доступ без выравнивания, поэтому программистам x86 сложно либо перенести свой код, либо перейти с этой платформы на любую другую систему. Они платят большой штраф за x86 (ужасная производительность), но не так сильно, как другие процессоры (сбой памяти). SO загружен вопросами по теме, как мне заставить мой код работать на процессоре xyz.

Я сойду с мыла. ARM отлично документирует все эти вещи (по сравнению с другими производителями чипов). TRM (техническое справочное руководство, у каждого ядра есть) описывает шину AMBA/AXI или выбор шины и будет входить в типы транзакций. Затем документы AMBA/AXI идут дальше, чтобы объяснить, что происходит. В дыре может быть карта между инструкциями и типами транзакций. Когда вы выполняете ldm из 6 слов по адресу 0x4 на 64-битной шине AXI, вы получаете одно 32-битное чтение по адресу 4 длиной 1. Затем вы получаете длину 2 64-битного чтения (четыре байта) по адресу 0x8 (охватывающие слова 0x8, 0xC, 0x10 и 0x14, затем отдельное 32-битное чтение по адресу 0x18. То, что он становится 3-осевым транзакциями, не означает, что он не является атомарным; он оставляет возможность для него быть неатомарным, конечно, но вы должны проверить документы ARM.

Другие вопросы по тегам