У меня есть функция, которая выводит структурированные данные. Данные представляют собой структуры Vec4/Vec3/Vec2/float, поэтому максимальный размер составляет 16 байт на структуру. Теперь может случиться так, что поток читается, начиная с структуры. Простое решение: загрузите структуру, создайте маску хранилища, уменьшите указатель данных назначения на количество байтов в нашей структуре, которую вызов хочет начать читать.
Представьте, что текущий тип элемента — Vec2, у нас 4 байта в этой структуре:
xmm0 = 00000000-00000000-dadadada-dadadada
xmm1 = 00000000-00000000-ffffffff-00000000
result_data_ptr = 13450000
-> RDI = 1344fffc
maskmovdqu xmm0, xmm1
=> результат является исключением ошибки страницы.
Есть ли способ обнаружить, что эта ошибка страницы произойдет? Память о предыдущей странице даже не тронется...
maskmovdqu
(это странно и медленно), но то, что это повлечет за собой, зависит от того, как вы его использовали. - person harold   schedule 11.10.2019result_data_ptr
. Объект потока вычисляет, сколько байт внутри текущего элемента. Создает маску магазина в xmm1, хранит сам элемент в xmm0 иRDI:=result_data_ptr-bytes_inside
. Теперь, еслиresult_data_ptr
была границей страницы, а предыдущая страница не принадлежала моему пространству памяти приложения, я получаю ошибку этой страницы. - person St0fF   schedule 11.10.2019