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

익명 사용자의 이미지

안녕하세요. 인풋 인터럽트를 공부하고 있는 학생입니다.

커널 소스에 포함된 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에 대해 공부해볼만한 키워드를 좀 알려주시면 감사하겠습니다.

Stephen Kyoungwon Kim@Google의 이미지

장비와 프로세서가 통신을 할 때, 주고 받는 데이터의 크기가 작은 경우 (이를테면, 하드 디스크 모듈더러 이제부터 섹터 X에서 Y바이트 만큼 가져와서 내 메모리의 주소 Z에 써달라고 명령을 보내는 경우, 그 명령 자체는 크기가 작겠죠) 장비에 붙은 레지스터에 값을 쓰거나 읽음으로써 처리하게 됩니다.

이런 레지스터들은 프로세서 관점에서 종종 메모리 상의 특정 주소부터 N 바이트에 있는 것처럼 보이게 되구요.

inb(BUTTON_PORT)는 아마 button이 눌릴 때, 그 장치 모듈이 그 버튼의 아스키 값을 저장하는 레지스터의 프로세서 메모리상 주소인 BUTTON_PORT에 가서 값을 1 바이트 읽어 온다는 뜻일 겁니다.

outb는 키패드인지 키보드인지 하여튼 입력 장치에 뭔가 프로세서가 간단히 (1 바이트 크기의) 할 말이 있을 때 쓰지 않을까 싶네요. 제가 생각할 수 있는 건, 다 읽었으니 다음 입력을 받아도 좋다, 뭐 이런 얘기 아닐까요? 구체적으로 저 수준에서 어떤 통신이 오가느냐는 장치의 문서를 읽어 보거나, 그런 종류의 장치 일반에 표준화된 방식이 있다면 그 방식에 관한 문서를 읽어 보거나 해야할 것 같습니다.

질문하신 내용은 저수준에서 장치와 프로세서가 어떻게 통신을 하느냐의 문제인데, 아마도 마이크로컨트롤러나 아두이노 같이 저사양의 프로세서에 OS 없이 프로그램을 올려 보시면 이해하기 보다 쉽지 않을까 생각합니다.

익명 사용자의 이미지

감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.