int scan_code = 0;
asm(
"push %%eax\n"
"xor %%eax, %%eax\n"
"in $0x60, %%al\n" // принимаю сканкод
"movl %%eax, -12(%%ebp)\n"
"pop %%eax\n"
:
:
:
);
unsigned char scan_code = 0;
asm(
"in $0x60, %0" // принимаю сканкод
: "=a"(scan_code)
:
:
);
После этого ядро стало выдавать ошибку
qemu-system-x86_64 -kernel kernel-10 -nographic -serial stdio -monitor none -append 'console=ttyS0'
но ты лучше напиши сам и подробно. какие вопросы можно было бы задать модели, что бы и ответ не подсказать и понять, на сколько глубоко она понимает это?
Я не могу увидеть что вызвало проблему.
sd_kcode:
dd 0x0000ffff
db 0x00
db 0x8a
db 0xcf
db 0x00
dd 0x0000ffff
db 0x00
db 0x9a
db 0xcf
db 0x00
состояние после выполнения
cr0
совсем не такой каким должен быть.-d in_asm,exec,cpu -D logfile
, результатом будет лог исполняемых команд процессора в интерпретации qemu и состояния регистров на момент начала выполнения блоков кода. Тебе останется найти в этом логе адрес 0x7c00
чтобы увидеть процесс выполнения своего кода. strace -e read cat /dev/input/mice
, там будет видно что из системного вызова read()
приходит 3 байта:read(3, "\10\1\0", 131072) = 3
read(3, "\10\1\0", 131072) = 3
read(3, "\10\4\0", 131072) = 3
read(3, "\10\3\1", 131072) = 3
read(3, "\10\1\0", 131072) = 3
read(3, "\10\1\0", 131072) = 3
Eugene Usachev, ок, давай попробуем ещё раз, сначала:
В такой постановке вопрос не имеет смысла, потому что для атомарного изменения одной переменной порядок не имеет значения. Порядок имеет значение, когда надо установить отношение между доступом к памяти и чем-то ещё и в зависимости от этого отношения он может быть разным.
Например, если этот once используется, чтобы гарантировать однократную запись в какой-нибудь регистр. Т.е. наблюдение once = 0 говорит о том, что никто не записал и пока не планирует записывать, а once = 1 говорит о том, что запись уже произошла или произойдёт в будущем. Это можно реализовать как CAS 0->1 для once + последующая запись в регистр, если CAS был успешен. Тогда нужно использовать как минимум release при записи в once и consume при чтении из него, чтобы эти две операции синхронизировались друг с другом при исполнении разными агентами. А так же гарантировать, что запись в регистр не будет переупорядочена с записью в once, например барьером между записью в once и записью в регистр.
Я уверен, что двумя значениями once (0 и 1) нельзя обеспечить одновременно единственность вызова и предоставить информацию о том, что вызов уже совершён. Для этого нужно как минимум три значения.