Я пытаюсь писать напрямую в физическую ячейку памяти, поэтому я использую функцию сборки, чтобы сначала отключить разбиение на страницы, записать значение, а затем повторно включить разбиение на страницы, но по какой-то причине ошибка страницы все еще запускается при попытке записать ценность.
Насколько я понимаю, в x86-32bit разбиение по страницам включается и выключается переключением бита 32 в cr0, так что вот моя функция сборки:
mov 4(%esp), %ecx //address
mov 8(%esp), %edx //value
mov %cr0, %eax
and $0x7fffffff, %eax
mov %eax, %cr0
mov %edx, (%ecx) //this line still triggers a page fault somehow
or $0x80000000, %eax
mov %eax, %cr0
ret
Это правильный способ достичь того, что я хочу делать? Если да, то почему ошибка страницы все еще запускается с перевернутым битом в cr0?
/dev/mem
илиDevice\PhysicalMemory
), или функцию, предоставляемую ядром. BTW, кажется (я не привык к синтаксису AT&T), что вы инвертировали значение адреса в своем коде . - person Neitsa   schedule 21.11.2015EIP
является физическим адресом. Вы пошагово выполняли это вbochs
или что-то еще, чтобы точно увидеть, что происходит, когда вы получаете ошибку? - person Peter Cordes   schedule 21.11.2015