리눅스 커널의 i/o port에 대해 질문드리고 싶습니다.

글쓴이: 익명 사용자 / 작성시간: 월, 2020/04/06 - 10:20오후
안녕하세요. 인풋 인터럽트를 공부하고 있는 학생입니다.
커널 소스에 포함된 input-programming.rst 예제로 인풋 디바이스 드라이버의 구조를 파악하려고 하는 중인데, 잘 이해가 가지 않는 부분이 있어서 질문드립니다.
static struct input_dev *button_dev; static irqreturn_t button_interrupt(int irq, void *dummy) { input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); input_sync(button_dev); return IRQ_HANDLED; }
예제의 인터럽트 핸들러 함수 부분입니다. 이 중 inb(BUTTON_PORT) 부분이 잘 이해가 가지 않습니다.
inb() 함수는 i/o port에서 값을 읽어오는 함수이고 input_report_key() 함수는 event를 인풋 이벤트 드라이버에 보고하는 함수라는 것은 알겠는데, inb(BUTTON_PORT) 가 무엇을 뜻하는 건지 잘 모르겠습니다.
저 BUTTON_PORT 부분에 0x60을 넣고 돌려보면 해당 값이 0xFF 등으로 나오던데, 이렇게 넘어오는 값에 어떤 의미가 있는건가요?
다시말해 i/o port에 inb()로 값을 읽어오고 outb()로 값을 쓰는게 어떤 의미가 있는 행위인지 궁금합니다.
또 i/o port에 대해 공부해볼만한 키워드를 좀 알려주시면 감사하겠습니다.
Forums:
...
장비와 프로세서가 통신을 할 때, 주고 받는 데이터의 크기가 작은 경우 (이를테면, 하드 디스크 모듈더러 이제부터 섹터 X에서 Y바이트 만큼 가져와서 내 메모리의 주소 Z에 써달라고 명령을 보내는 경우, 그 명령 자체는 크기가 작겠죠) 장비에 붙은 레지스터에 값을 쓰거나 읽음으로써 처리하게 됩니다.
이런 레지스터들은 프로세서 관점에서 종종 메모리 상의 특정 주소부터 N 바이트에 있는 것처럼 보이게 되구요.
inb(BUTTON_PORT)는 아마 button이 눌릴 때, 그 장치 모듈이 그 버튼의 아스키 값을 저장하는 레지스터의 프로세서 메모리상 주소인 BUTTON_PORT에 가서 값을 1 바이트 읽어 온다는 뜻일 겁니다.
outb는 키패드인지 키보드인지 하여튼 입력 장치에 뭔가 프로세서가 간단히 (1 바이트 크기의) 할 말이 있을 때 쓰지 않을까 싶네요. 제가 생각할 수 있는 건, 다 읽었으니 다음 입력을 받아도 좋다, 뭐 이런 얘기 아닐까요? 구체적으로 저 수준에서 어떤 통신이 오가느냐는 장치의 문서를 읽어 보거나, 그런 종류의 장치 일반에 표준화된 방식이 있다면 그 방식에 관한 문서를 읽어 보거나 해야할 것 같습니다.
질문하신 내용은 저수준에서 장치와 프로세서가 어떻게 통신을 하느냐의 문제인데, 아마도 마이크로컨트롤러나 아두이노 같이 저사양의 프로세서에 OS 없이 프로그램을 올려 보시면 이해하기 보다 쉽지 않을까 생각합니다.
감사합니다!
감사합니다!
댓글 달기