Что именно происходит, когда я нажимаю кнопку Enter с точки зрения прерывания system_read, сборка?
У меня есть этот код:
section .bss
buff resb 1
readfromkeyboard:
mov eax,3 ;specify system read
mov ebx,0 ;specify standard in -> keyboard
mov ecx,buff ;where to store what is read
mov edx,1 ;read 1 byte
int 0x80 ;tell linux to do everything above
mov eax,4 ;sys_write
mov ebx,1 ;Standard output
mov ecx,buff ;what to print
mov edx,1 ;how long to print
int 0x80 ;tell linux to do everything above
который отлично работает.
Когда я запустил процесс, курсор начнет мигать в терминале, и я могу свободно вводить символы. На этом этапе я могу ввести столько символов, сколько захочу, кроме случаев, когда я ударил "ENTER" 1 байт, будет прочитан, и он будет напечатан в терминале.
Мой вопрос в том, что происходит внутри, когда я ввожу символы, и когда я нажимаю Enter. Поэтому я нажимаю "a" на своей клавиатуре и говорю "c", где хранятся эти данные на данный момент? Являются ли они уже в памяти, адресованном "buff" в моем коде? Почему Linux читается, когда я нажимаю Enter?
Ответы
Ответ 1
От ввода в приложение существует длинный путь:
- Оборудование
- Уровень драйвера
- Консольный слой
- функции чтения
Где-то там происходит обработка строк, я думаю, что это на консольном уровне. Там вы можете вводить данные, которые обрабатываются в строках.
Если приложение приходит и читает, оно получает столько символов, сколько требуется, остальные сохраняются для следующего чтения.
Если их не осталось, он будет ждать окончания следующей строки или если пользователь нажимает ^D
, что означает прекращение текущего вызова read()
. Если ранее данные не были введены, read()
возвращает 0, обозначая EOF. Во всех остальных случаях read()
возвращает количество прочитанных байтов.
Ответ 2
@glglgl имеет хороший ответ, но здесь более прямой ответ: остальные символы сидят в буфере чтения, ожидающем обработки.
Поскольку вы, кажется, говорите о Linux здесь, у ядра есть буфер, специально выделенный для этого, который создается, когда регистрируются символьные устройства. Если вы действительно захотите вникать в это глубоко, я настоятельно рекомендую эту статью. Когда вы доберетесь туда, найдите vfs_read
и начните чтение. Это очень хорошая запись!
Ответ 3
Если вы попросили 1 байт, тогда функция ввода никогда не будет хранить лишние байты в памяти при баффе. Linux будет хранить только a, но не c
Ответ 4
Драйвер терминала linux считывает символы и буферизует их в своем собственном пространстве памяти. Поскольку ваш терминал находится в режиме "линии", эта буферизация продолжается до тех пор, пока клавиша ENTER не закончит линию. В этот момент данные могут быть переданы в буфер, который вы предоставили. Вы только просили 1 символ, так что то, что вы получаете, и остальные символы сидят в памяти драйвера терминала для вашего следующего запроса на чтение.