키보드 입력과 텍스트 출력은 어떻게 작동합니까?

키보드 입력과 텍스트 출력은 어떻게 작동합니까?

A텍스트 편집기에서 해당 키를 누르면 문서에 문자가 삽입되고 화면 a에 표시됩니다. 나는 편집기 응용 프로그램이 하드웨어와 직접 통신하지 않는다는 것을 알고 있습니다(그 사이에 커널과 다른 것들이 있습니다). 그러면 내 컴퓨터 내부에서는 무슨 일이 벌어지고 있는 걸까요?

답변1

여러 가지 시나리오가 있습니다. 가장 일반적인 시나리오를 설명하겠습니다. 연속적인 매크로 이벤트는 다음과 같습니다.

  1. 입력: 키 이벤트가 키보드 하드웨어에서 애플리케이션으로 전송됩니다.
  2. 처리: 애플리케이션은 A키를 눌렀기 때문에 문자가 표시되어야 한다고 결정합니다 a.
  3. a출력: 애플리케이션은 화면에 표시되는 명령을 제공합니다.

GUI 애플리케이션

UNIX 시스템의 사실상 표준 그래픽 사용자 인터페이스는 다음과 같습니다.X 윈도우 시스템, 애플리케이션과 디스플레이 서버 간의 핵심 프로토콜 버전 11에서 안정화되었기 때문에 X11이라고도 합니다. X 서버라는 프로그램은 운영 체제 커널과 응용 프로그램 사이에 위치하며 화면에 창을 표시하고 포커스가 있는 창에 키 입력을 전송하는 등의 서비스를 제공합니다.

입력하다

+----------+              +-------------+         +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+              +-------------+         +-----+
             USB, PS/2, …                 PCI, …
             key down/up

첫째, 키 누름 및 키 놓기에 대한 정보가 키보드에서 컴퓨터로, 그리고 컴퓨터 내부로 전송됩니다. 세부 사항은 하드웨어 유형에 따라 다릅니다. 체인의 이 부분 전체에 걸쳐 정보가 동일하게 유지되기 때문에 이 부분을 자세히 논의하지 않겠습니다. 즉, 키를 눌렀거나 놓았습니다.

         +--------+        +----------+          +-------------+
-------->| kernel |------->| X server |--------->| application |
         +--------+        +----------+          +-------------+
interrupt          scancode             keysym
                   =keycode            +modifiers

하드웨어 이벤트가 발생하면 CPU가 트리거됩니다.방해하다, 그 결과 일부 코드가 생성됩니다.핵심구현하다. 이 코드는 하드웨어 이벤트가 키보드의 키 누름인지 해제인지 감지하고 로그를 기록합니다.스캔 코드키를 식별합니다.

X 서버는 다음을 통해 입력 이벤트를 읽습니다.장치 파일, 예를 들어 /dev/input/eventNNNLinux(여기서 NNN은 숫자)입니다. 이벤트가 발생할 때마다 커널은 장치에서 데이터를 읽을 수 있다는 신호를 보냅니다. 장치 파일은 스캔 코드를 사용하여 키 업/다운 이벤트를 전송하는데, 이는 하드웨어에서 전송된 값과 동일할 수도 있고 동일하지 않을 수도 있습니다. (커널은 스캔 코드를 키보드 관련 값에서 일반 값으로 변환할 수 있습니다. Linux알지 못하는 스캔 코드를 재전송하지 마세요.).

X는 스캔 코드를 읽기 위해 이를 호출합니다.키 코드. X 서버는 키 입력 코드를 다음으로 변환하는 테이블을 유지 관리합니다.주요 기호("키 기호"의 약어). 키 코드는 숫자이고 키 기호는 이름입니다(예 A: aacute, F1, , KP_Add, Control_L…). 키 기호는 어떤 수정자 키를 누르는지( Shift, Ctrl, …)에 따라 달라질 수 있습니다.

키 코드에서 키 기호로의 매핑을 구성하는 메커니즘에는 두 가지가 있습니다.

  • xmodmap전통적인 메커니즘입니다. 이는 키 코드를 키 기호 목록(수정되지 않음, 이동됨 등)에 매핑하는 간단한 테이블입니다.
  • XKB더 많은 수정자, 특히 이중 언어 구성 등을 더 잘 지원할 수 있는 더 강력하지만 더 복잡한 메커니즘입니다.

응용 프로그램은 X 서버에 연결하고 응용 프로그램 창에 포커스가 있는 동안 키를 누르면 알림을 받습니다. 이 알림은 키 기호를 눌렀거나 놓았는지, 현재 어떤 수정자가 눌려져 있는지를 나타냅니다. 프로그램을 실행하면 주요 기호가 표시됩니다.xev터미널에서. 애플리케이션이 이 정보를 처리하는 방법은 애플리케이션에 달려 있습니다. 일부 애플리케이션에는 구성 가능한 키 바인딩이 있습니다.

일반적인 구성에서는 수정자 표시가 없는 키를 누르면 A키 기호가 a애플리케이션으로 전송됩니다. 애플리케이션이 텍스트 입력 모드에 있으면 문자가 삽입됩니다 a.

키보드 레이아웃과 xmodmap의 관계키보드 입력을 더 자세히 다룹니다.Linux에서 마우스 이벤트는 어떻게 작동합니까?하위 수준 마우스 입력 개요

산출

+-------------+        +----------+          +-----+         +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+        +----------+          +-----+         +---------+
               text or              varies          VGA, DVI,
               image                                HDMI, …

문자를 표시하는 방법에는 두 가지가 있습니다.

바라보다XWindows 글꼴의 다양한 유형은 무엇에 사용됩니까?X11에서의 클라이언트 측 및 서버 측 텍스트 렌더링에 대한 논의.

X 서버와 X 서버 사이에는 무슨 일이 일어나는가?그래픽 처리 장치(그래픽 카드의 프로세서)는 하드웨어에 크게 의존합니다. 간단한 시스템에서는 X 서버가프레임버퍼, GPU에 의해 선택되어 표시됩니다. 21세기 PC 또는 스마트폰의 고급 시스템을 사용하면 GPU가 더 나은 성능을 위해 일부 작업을 직접 수행할 수 있습니다. 궁극적으로 GPU는 화면 콘텐츠를 매초마다 픽셀 단위로 디스플레이에 전송합니다.

텍스트 모드 애플리케이션, 터미널에서 실행

텍스트 편집기가 터미널에서 실행되는 텍스트 모드 애플리케이션이라면 해당 터미널은 이전 쇼에 사용된 애플리케이션입니다. 이 섹션에서는 텍스트 모드 응용 프로그램과 터미널 간의 인터페이스를 설명합니다. 먼저 사례를 설명하겠습니다.터미널 에뮬레이터X11에서 실행됩니다."터미널", "쉘", "tty" 및 "콘솔"의 정확한 차이점은 무엇입니까?여기에 유용한 배경이 있을 수 있습니다. 이 기사를 읽은 후 더 자세히 읽어보고 싶을 수도 있습니다.각 PTY(의사 터미널) 구성 요소(소프트웨어, 마스터 측, 슬레이브 측)의 역할은 무엇입니까?

입력하다

      +-------------------+               +-------------+
----->| terminal emulator |-------------->| application |
      +-------------------+               +-------------+
keysym                     character or
                           escape sequence

터미널 에뮬레이터는 "누를 Left때 누름 " Shift과 같은 이벤트를 수신합니다. 터미널 에뮬레이터와 텍스트 모드 응용 프로그램 간의 인터페이스는 다음과 같습니다.의사 터미널(pty),ㅏ캐릭터 장치바이트를 전송합니다. 터미널 에뮬레이터는 키 누르기 이벤트를 수신하면 이를 응용 프로그램이 pty 장치에서 읽는 하나 이상의 바이트로 변환합니다.

ASCII 범위 밖의 인쇄 가능한 문자는 문자 및 유형에 따라 하나 이상의 바이트로 전송됩니다.코딩. 예를 들어,UTF-8부호화유니코드문자 집합, 문자 집합ASCII 코드범위는 단일 바이트로 인코딩되고, 범위 밖의 문자는 다중 바이트로 인코딩됩니다.

CtrlAlt기능 키에 해당하는 키 입력 또는 또는 같은 수정자를 사용하여 인쇄 가능한 문자이스케이프 시퀀스. 이스케이프 시퀀스는 일반적으로 문자로 구성됩니다.탈출하다(바이트 값 27 = 0x1B = , 때로는 또는 \033로 표시됨 ) 뒤에 하나 이상의 인쇄 가능한 문자가 옵니다. 일부 키 또는 키 조합에는^[\e제어 문자ASCII 기반 인코딩(유니코드를 포함하여 오늘날 사용되는 거의 모든 인코딩)에 해당: Ctrl+는 letter1-26 범위의 문자 값을 생성하고 위에 표시된 이스케이프 문자이며 Esc+와 동일하며 다음과 같습니다. +, +와 동일 등Ctrl[TabCtrlIReturnCtrlM

서로 다른 터미널은 주어진 키 또는 키 조합에 대해 서로 다른 이스케이프 시퀀스를 보냅니다. 다행히도 그 반대도 마찬가지입니다. 시퀀스가 ​​주어지면 실제로 인코딩하는 키 조합은 최대 하나입니다. 한 가지 예외는 127 = 0x7f = 문자로, \0177자주 나타나지만 Backspace가끔 나타납니다 Delete.

터미널에서 Ctrl+ V키 조합을 입력하면 키 조합에 있는 이스케이프 시퀀스의 첫 번째 바이트가 문자 그대로 삽입됩니다. 이스케이프 시퀀스에는 일반적으로 첫 번째 문자 뒤에 인쇄 가능한 문자만 포함되므로 문자 그대로 전체 이스케이프 시퀀스가 ​​삽입됩니다. 바라보다키 바인딩 테이블?이 맥락에서 zsh에 대해 토론하십시오.

터미널은 특정 수정자 조합에 대해 동일한 이스케이프 시퀀스를 전송할 수 있습니다. 예를 들어 많은 터미널은 및 Space+ 에 대해 Shift공백 문자를 전송합니다 Space.xterm에는 수정자 조합을 구별하는 패턴이 있습니다.하지만널리 사용되는 vte 라이브러리를 기반으로 하는 터미널은). 수정자 키 또는 터미널 에뮬레이터 바인딩(예: 복사 또는 붙여넣기 명령)을 트리거하는 키와 같은 일부 키는 전혀 전송되지 않습니다.

응용 프로그램은 필요한 경우 이스케이프 시퀀스를 기호 키 이름으로 변환할 수 있습니다.

산출

+-------------+               +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+               +-------------------+
               character or
               escape sequence

출력은 입력보다 훨씬 간단합니다. 응용 프로그램이 pty 장치 파일에 문자를 출력하는 경우 터미널 에뮬레이터는 현재 커서 위치에 문자를 표시합니다. (터미널 에뮬레이터는 커서 위치를 유지하고 커서가 화면 하단 아래로 떨어지면 스크롤합니다.) 응용 프로그램은 또한 이스케이프 시퀀스(대부분 ^[또는 로 시작 ^])를 출력하여 터미널에 커서 이동, 텍스트 속성 변경(색상, 굵은 글씨 등) 또는 화면의 일부를 지웁니다.

터미널 에뮬레이터에서 지원하는 이스케이프 시퀀스는 다음과 같습니다.용어 모자또는용어 정보데이터 베이스. 요즘 대부분의 터미널 에뮬레이터에는xterm. 바라보다LESS_TERMCAP_* 변수에 대한 문서가 있습니까?단말 능력 정보 데이터베이스에 대한 더 긴 논의, 그리고커서 깜박임을 멈추는 방법그리고내 로컬 컴퓨터의 터미널 색상을 SSH 연결 중인 컴퓨터의 터미널 색상으로 설정할 수 있나요?몇 가지 사용 예.

텍스트 콘솔에서 실행되는 애플리케이션

응용 프로그램이 텍스트 콘솔(즉, 터미널 에뮬레이터 응용 프로그램이 아닌 커널에서 제공하는 터미널)에서 직접 실행되는 경우에도 동일한 원칙이 적용됩니다. 터미널과 애플리케이션 사이의 인터페이스는 여전히 이스케이프 시퀀스로 인코딩된 특수 키와 명령이 포함된 전송된 문자의 바이트 스트림입니다.

네트워크를 통해 액세스되는 원격 애플리케이션

원격 텍스트 애플리케이션

예를 들어 다음을 통해 원격 컴퓨터에서 프로그램을 실행하는 경우SSH, 네트워크 통신 프로토콜은 pty 수준에서 데이터를 중계합니다.

+-------------+           +------+           +-----+           +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+           +------+           +-----+           +----------+
               byte stream        byte stream       byte stream
               (char/seq)         over TCP/…        (char/seq)

때로는 원격 터미널 데이터베이스가 로컬 터미널의 모든 기능을 알지 못할 수도 있다는 점을 제외하면 이는 대부분 투명합니다.

원격 X11 애플리케이션

애플리케이션과 서버 자체 간의 통신 프로토콜은 SSH와 같은 네트워크 프로토콜을 통해 전송될 수 있는 바이트 스트림입니다.

+-------------+            +------+        +-----+            +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+            +------+        +-----+            +----------+
               X11 protocol        X11 over       X11 protocol
                                   TCP/…

애플리케이션과 디스플레이 간의 직접 통신이 필요한 일부 가속 기능(예: 영화 디코딩 및 3D 렌더링)을 사용할 수 없다는 점을 제외하면 이는 대체로 투명합니다.

답변2

이해할 수 있을 만큼 작은 Unix 시스템에서 이것을 보고 싶다면Xv6. 이것은 John Lion의 유명한 유닉스의 기초가 된 다소 신화적인 여섯 번째 버전의 유닉스입니다.논평, 오랫동안 지하 출판물로 유통되었습니다. 해당 코드는 ANSI C에서 컴파일하고 멀티프로세서와 같은 최신 개발을 고려하도록 재설계되었습니다.

관련 정보