Можно ли безопасно протестировать линию A20 с помощью кода, который включает инструкцию ассемблера cli в системе Linux?Linux

Ответить
Anonymous
 Можно ли безопасно протестировать линию A20 с помощью кода, который включает инструкцию ассемблера cli в системе Linux?

Сообщение Anonymous »

Попытка протестировать линию A20 по этой ссылке: https://www.independent-software.com/op ... -line.html. Если прокрутить страницу до середины, появится надпись «Тестирование линии A20» (см. ниже).

В этом фрагменте отсутствует некоторый ассемблерный контекст, поэтому сначала я подумал, что это nasm, но потом, просматривая StackOverlow, я понял, что это газ с директивой .intel_syntax noprefix (например, комментарии к: intel_syntax noprefix, intel_syntax noprefix).

Я делал все это наивно, думая, что это будет «просто еще одна (безобидная) вещь helloworld, как обычно», но я думаю, что это не так.

После заполнения необходимых разделов программа заработала (как в nasm, так и в gas), но возникла ошибка сегментации, поэтому я решил отследить проблему (gdb, см. ниже), обнаружил, что все останавливается на этом неизвестном элементе cli, поэтому я написал минимальную ассемблерную программу для проверки этой инструкции. К счастью, я не проверял ничего из этого с помощью sudo (или, возможно, система тоже отклонила бы это, не знаю, я не хотел пробовать, прежде чем спрашивать), потому что, пытаясь найти ответы об этой ошибке сегментации, я нашел это:

почему очистка флага прерывания вызывает ошибку сегментации в C?

Это меня немного напугало, потому что, если я хорошо понял, может ли это привести к постоянному сбою состояния оборудования (по крайней мере, на CPU cli указывалось)? Этакий «обрыв ремня ГРМ в машине»? Серьезная потеря синхронизации в логике этого процессора? Необратима или, по крайней мере, кошмар с глубоким восстановлением?
Вопрос в том, если в контексте упомянутого кода («Тестирование строки A20», см. ниже) управление cli безопасно (например, «по крайней мере в этом фрагменте кода вы показываете, что все, что касается cli, правильно восстановлено...») и его можно без проблем запустить даже с помощью sudo, или ответ такой: не проводите неосведомленные привилегированные эксперименты с инструкцией cli. Хоть я и делаю все это внутри ВМ, но облажаться тоже не смешно.

Если ответ: это небезопасно. Есть ли альтернатива этому
в том же низкоуровневом духе?

Источник кода в вопросе:
.func CheckA20
CheckA20:
pushf # Save registers that
push ds # we are going to
push es # overwrite.
push di
push si

cli # No interrupts, please

xor ax, ax # Set es:di = 0000:0500
mov es, ax
mov di, 0x0500

mov ax, 0xffff # Set ds:si = ffff:0510
mov ds, ax
mov si, 0x0510

mov al, byte ptr es:[di] # Save byte at es:di on stack.
push ax # (we want to restore it later)

mov al, byte ptr ds:[si] # Save byte at ds:si on stack.
push ax # (we want to restore it later)

mov byte ptr es:[di], 0x00 # [es:di] = 0x00
mov byte ptr ds:[si], 0xFF # [ds:si] = 0xff

cmp byte ptr es:[di], 0xFF # Did memory wrap around?

pop ax
mov byte ptr ds:[si], al # Restore byte at ds:si

pop ax
mov byte ptr es:[di], al # Restore byte at es:di

mov ax, 0
je check_a20__exit # If memory wrapped around, return 0.

mov ax, 1 # else return 1.

check_a20__exit:
pop si # Restore saved registers.
pop di
pop es
pop ds
popf
ret
.endfunc

gdb:
(gdb) r
Starting program: /home/peter/Documents/.../hardware
_assembly/checkA20_gas  

(gdb) si  
16         cli                          # No interrupts, please
(gdb) si  

Program received signal SIGSEGV, Segmentation fault.
CheckA20 () at checkA20_gas.s:16
16         cli                          # No interrupts, please

Тесты:

nasm версия
$ ./checkA20
zsh: segmentation fault (core dumped)  ./checkA20


gas версия
$ ./checkA20_gas  
zsh: segmentation fault (core dumped)  ./checkA20_gas


Тестирование только инструкции cli:
$ ./poc_cli      
zsh: segmentation fault (core dumped)  ./poc_cli


$ cat poc_cli.s
.intel_syntax noprefix

.text
.global _start

_start:

cli

mov ebx, eax
mov eax, 1
int 0x80


Подробнее здесь: https://stackoverflow.com/questions/798 ... assembly-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»