Попытка протестировать линию 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
Можно ли безопасно протестировать линию A20 с помощью кода, который включает инструкцию ассемблера cli в системе Linux? ⇐ Linux
1764867933
Anonymous
Попытка протестировать [b]линию A20[/b] по этой ссылке: https://www.independent-software.com/operating-system-development-enabling-a20-line.html. Если прокрутить страницу до середины, появится надпись «Тестирование линии A20» (см. ниже).
В этом фрагменте отсутствует некоторый ассемблерный контекст, поэтому сначала я подумал, что это nasm, но потом, просматривая StackOverlow, я понял, что это газ с директивой .intel_syntax noprefix (например, комментарии к: intel_syntax noprefix, intel_syntax noprefix).
Я делал все это наивно, думая, что это будет «просто еще одна (безобидная) вещь helloworld, как обычно», но я думаю, что это не так.
После заполнения необходимых разделов программа заработала (как в nasm, так и в gas), но возникла ошибка сегментации, поэтому я решил отследить проблему (gdb, см. ниже), обнаружил, что все останавливается на этом неизвестном элементе cli, поэтому я написал минимальную ассемблерную программу для проверки этой инструкции. К счастью, я не проверял ничего из этого с помощью sudo (или, возможно, система тоже отклонила бы это, не знаю, я не хотел пробовать, прежде чем спрашивать), потому что, пытаясь найти ответы об этой ошибке сегментации, я нашел это:
почему очистка флага прерывания вызывает ошибку сегментации в C?
Это меня немного напугало, потому что, если я хорошо понял, может ли это привести к постоянному сбою состояния оборудования (по крайней мере, на CPU cli указывалось)? Этакий «обрыв ремня ГРМ в машине»? Серьезная потеря синхронизации в логике этого процессора? Необратима или, по крайней мере, кошмар с глубоким восстановлением?
[b]Вопрос в том[/b], если в контексте упомянутого кода («Тестирование строки 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79838159/is-it-possible-to-test-a20-line-safely-through-code-that-includes-the-assembly-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия