Подтвердить что ты не робот

Что именно происходит, когда я нажимаю кнопку 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?

4b9b3361

Ответ 1

От ввода в приложение существует длинный путь:

  • Оборудование
  • Уровень драйвера
  • Консольный слой
  • функции чтения

Где-то там происходит обработка строк, я думаю, что это на консольном уровне. Там вы можете вводить данные, которые обрабатываются в строках.

Если приложение приходит и читает, оно получает столько символов, сколько требуется, остальные сохраняются для следующего чтения.

Если их не осталось, он будет ждать окончания следующей строки или если пользователь нажимает ^D, что означает прекращение текущего вызова read(). Если ранее данные не были введены, read() возвращает 0, обозначая EOF. Во всех остальных случаях read() возвращает количество прочитанных байтов.

Ответ 2

@glglgl имеет хороший ответ, но здесь более прямой ответ: остальные символы сидят в буфере чтения, ожидающем обработки.

Поскольку вы, кажется, говорите о Linux здесь, у ядра есть буфер, специально выделенный для этого, который создается, когда регистрируются символьные устройства. Если вы действительно захотите вникать в это глубоко, я настоятельно рекомендую эту статью. Когда вы доберетесь туда, найдите vfs_read и начните чтение. Это очень хорошая запись!

Ответ 3

Если вы попросили 1 байт, тогда функция ввода никогда не будет хранить лишние байты в памяти при баффе. Linux будет хранить только a, но не c

Ответ 4

Драйвер терминала linux считывает символы и буферизует их в своем собственном пространстве памяти. Поскольку ваш терминал находится в режиме "линии", эта буферизация продолжается до тех пор, пока клавиша ENTER не закончит линию. В этот момент данные могут быть переданы в буфер, который вы предоставили. Вы только просили 1 символ, так что то, что вы получаете, и остальные символы сидят в памяти драйвера терминала для вашего следующего запроса на чтение.