저는 Linux 커널 작업을 하고 있으며 O'Reilly의 커널에 대해 알고 있습니다.Linux 커널에 대해 알아보기최근에는 신호 및 인터럽트 처리 장을 다루고 일부 기본 2.4 Linux 버전을 사용하여 이해할 수 있는 지점까지 코드를 파헤쳤습니다.
ctrl + c
그러나 쉘에서 실행 중인 프로세스를 제어하기 위해 a를 눌렀을 때 명령 흐름에 어떤 일이 발생하는지 스스로 설명할 수도 없고 다른 곳에서 답을 찾을 수도 없습니다 .
지금까지 내가 한 일:
- 키보드를 누르면 APIC는 IRQ 라인을 CPU로 올립니다.
- 인터럽트를 마스크할 수 없는 경우 CPU는 해당 int를 로드합니다. IDT의 핸들러
- 비율, 일부 주요 정수.
char
키보드 장치의 레지스터에서 APIC의 다른 레지스터로의 누르기를 추가로 처리하기 위해 핸들러 코드를 호출합니다.
여기서부터는 모든 것이 흐릿합니다.
current->thread.error_code
그러나 인터럽트 처리가 프로세스 컨텍스트에 있지 않고 예외가 있다는 것을 이해하므로 예외가 어떻게 업데이트 되고 current->thread.trap_no
최종적으로 호출되는지 쉽게 알 수 있습니다 force_sig
. 그러나 일단 인터럽트 핸들러가 실행되면(위의 예에서와 같이) , 어떻게 끝나나요? 원하는 프로세스의 컨텍스트를 입력하고 신호를 생성합니까?
답변1
상상할 수 있듯이 키를 누르면 인터럽트가 발생합니다. 인터럽트는 USB 키보드 또는 PS/2 키보드와 같은 하드웨어 유형에 따라 달라지는 인터럽트 핸들러에 의해 처리됩니다. 인터럽트 핸들러는 하드웨어에서 중요한 코드를 읽고 이를 버퍼링합니다. tty 드라이버는 버퍼에서 문자를 선택하고 Ctrl-C의 경우 이를 인터럽트 문자로 인식하여 SIGINT
터미널의 전경 프로세스 그룹에 보냅니다. 바라보다n_tty.c.
tty 드라이버는 Linux 콘솔, 직렬 터미널( /dev/ttyS*
) 및 의사 tty와 같은 "터미널" 유형(명령줄) 인터페이스만 다룹니다. GUI 시스템(X11, Wayland 구현)은 입력 장치를 다르게 처리합니다.