В архитектуре ARM, к сожалению, я точно не знаю, что это за чип, это 32-битный int read/write atomic?
Есть ли какие-либо гарантии относительно чтения/записи основных типов?
В архитектуре ARM, к сожалению, я точно не знаю, что это за чип, это 32-битный int read/write atomic?
Есть ли какие-либо гарантии относительно чтения/записи основных типов?
Он должен быть атомарным, EXCEPT, если этот int хранится на не выровненном адресе.
Это задокументировано либо в TRM для ядра, либо в спецификации AMBA/AXI. Вам нужно найти основное ядро, которое будет использоваться оттуда, если вы сможете понять, какой вкус шины AMBA/AXI, и в этой спецификации он описывает атомную/неатомарную природу каждого из типов транзакций.
Например, swp и ldrex/strex являются атомарными. Строковые и 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 axi, это не означает, что он не атомный, он оставляет возможность для неатомного, уверенного, но вам нужно будет проверить документы ARM.