Como a interrupção do teclado acaba como sinal de processo

3

Estou estudando o kernel do Linux corretamente, com o Entendendo o Linux Kernel da O'Reilly, e ultimamente abordei o capítulo sobre manipulação de sinais e interrupções, aderindo a uma versão básica do linux 2.4 e mergulhando no código, tanto quanto posso entender.

No entanto, não consegui explicar para mim mesmo nem encontrar uma resposta em outro lugar, qual é o fluxo de instruções que ocorre quando, digamos, a ctrl + cé pressionado por um processo que é executado no shell.

o que eu descobri até agora:

  1. uma vez pressionado o teclado APIC, aumenta a linha de IRQ para a CPU
  2. se as interrupções não são mascaráveis, a CPU carrega o int correspondente. manipulador do IDT
  3. do que, algum int crítico. o código do manipulador é chamado, manipulando ainda mais o charpressionado do registro do dispositivo de teclado no APIC para outros registros

daqui é vago para mim.

No entanto, eu entendo que o tratamento de interrupções não está no contexto do processo enquanto a exceção está, por isso foi fácil descobrir como as exceções são atualizadas current->thread.error_codee, current->thread.trap_nofinalmente, invocadas force_sig. No entanto, uma vez que um manipulador de interrupção é executado, como no exemplo acima, como ele finalmente entra em contexto com o processo desejável e a geração do sinal?

Asher Yartsev
fonte

Respostas:

5

O pressionamento de tecla gera uma interrupção, como você descobriu. A interrupção é processada por um manipulador de interrupção; qual manipulador depende do tipo de hardware, por exemplo, teclado USB ou teclado PS / 2. O manipulador de interrupção lê o código da chave do hardware e o armazena em buffer. No buffer, o caractere é captado pelo driver tty, que, no caso de Ctrl-C, o reconhece como o caractere de interrupção e envia um SIGINTpara o grupo de processos em primeiro plano do terminal. Veja n_tty.c .

Observe que o driver tty está envolvido apenas nas interfaces do tipo "terminal" (linha de comando), como o console do Linux, os terminais seriais ( /dev/ttyS*) e os pseudo-ttys. Os sistemas GUI (implementações X11, Wayland) manipulam os dispositivos de entrada de maneira diferente.

Johan Myréen
fonte
Totalmente concluída a imagem! Obrigado!
Asher Yartsev