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

2

Estou estudando o kernel do linux com o Understanding Linux Kernel da O'Reilly e ultimamente cobri o capítulo signal e interrupt handling lidando com alguma versão básica do 2.4 linux e mergulhando no código até onde eu pode entender.

Ainda assim, não consegui explicar nem encontrar uma resposta em outro lugar, qual é o fluxo de instrução que ocorre quando, digamos, um ctrl + c é pressionado para um processo que é executado no shell.

o que eu descobri até agora:

  1. uma vez pressionado o teclado, o APIC aumenta a linha de IRQ para a cpu
  2. se as interrupções não forem mascaráveis, a cpu carregará o int correspondente. manipulador de IDT
  3. que, algum int crítico. O código do manipulador é chamado, manipulando ainda mais o char pressionado do registrador do dispositivo de teclado no APIC para outros registradores

daqui é vago para mim.

Eu entendo, porém, que a manipulação de interrupções não está no contexto do processo enquanto a exceção está, então foi fácil descobrir como as atualizações de exceção current->thread.error_code e current->thread.trap_no finalmente invocam 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 gera o sinal?

    
por Asher Yartsev 28.07.2017 / 12:52

1 resposta

4

O pressionamento de tecla gera uma interrupção, assim 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 de chave do hardware e o armazena em buffer. Do buffer, o caractere é captado pelo driver tty, que, no caso de Ctrl-C, o reconhece como o caractere de interrupção e envia um SIGINT para o grupo de processos de primeiro plano do terminal. Veja n_tty.c .

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

    
por 28.07.2017 / 23:45