Рассмотрим пользовательскую структуру данных, которая представляет собой 3-байтовое целое число без знака. В ассемблере с прямым порядком байтов можно просто загрузить 4 байта в регистр с помощью указателя на двойное слово и, например, выполнить сложение 3-байтовых целых чисел, сохранить младшее слово по адресу памяти «x», сдвинуть результат вправо на 16 и сохранить младший байт по адресу памяти x + 2. Более медленная версия загрузки с неопределенным поведением будет состоять в том, чтобы сначала обнулить регистр «a», загрузить младшее слово в регистр «a», загрузить третий байт в регистр «b». , сдвиньте «b» влево на 16 и ИЛИ зарегистрируйте «a» и «b» в другой регистр.
Итак, теперь давайте предположим, что заданное 3-байтовое целое число находится прямо на краю программного пространства или сегмента данных; интуитивно вы получили бы незаконный доступ к памяти, разыменовав адрес целого числа как двойное слово, не так ли? Или в более общем виде: когда происходит нарушение доступа к памяти при чтении памяти; рассматривается только базовый адрес или это (baseAddress + lengthInBytes)? Я искал ответ в течение нескольких недель, но пока не нашел ответа, поэтому я спрашиваю сообщество...
mmap
загрузить страницу, а затем выполнить загрузку 4 байтов из 3 байтов до конца страницы, например*(volatile int32_t*)(page+4093)
. Если вы сообщите компилятору, что у вас есть 3-байтовый объект битового поля, он всегда безопасно загрузит его. - person Peter Cordes   schedule 22.03.2021section .bss
/align 4096
/buf: resb 4096
и написать нагрузку типаmov eax, [buf + 4093]
/mov eax, [buf+4096]
и посмотреть, достигнута ли 2-я нагрузка. (Если это тоже не сбой, после этого есть еще одна страница BSS, возможно, из кода libc или CRT, если вы скомпоновали их вместо простого статического исполняемого файла; в этом случае, возможно, уменьшите доbuf: resb 100
, чтобы другие материалы BSS могли поместиться в та же страница) - person Peter Cordes   schedule 22.03.2021psadbw
против0
расширить до двух 64-битных элементов, затемpaddq
или простоpaddd
быстрее на некоторых процессорах, и их можно использовать, если вам не нужны 64-битные суммы. - person Peter Cordes   schedule 22.03.2021