char device driver 질문.

zasxer의 이미지

안녕하세요.
디바이스 드라이버를 공부하고 있는 직장인입니다.

리눅스 디바이스 드라이버 책을 따라해보고 있는데, 이해가 안되는 부분이 있어 질문을 올립니다.

dev = open(DEVICE_FILENAME, O_RDWR|O_NDELAY);
wirte(dev, 0x40, 0x41);

응용 프로그램에서 DEVICE_FILENAME에 해당하는 inode와 file 구조체를 찾고 write를 하는 구조로 이해를 햇는데요. 쓰는 거는 쓰는건데 dev의 0x40의 주소에 0x41을 쓰는 거라는 설명으로 되어 있습니다.
여기서 궁금한게 두가지 인데요.

1. 0x40은 물리주소인가? 가상 주소인가?
2. 0x40말고 엄청 큰 수를 입력을 해도 해당 영역에 write가 되는가?(가상주소에 한에서)
3. module을 등록하는데 module의 크기나 위치는 도대체 어디에 등록되는 걸까요?
단순히 register(CALL_DEV_MAJOR, CALL_DEV_NAME, &call_fops); 로 등록만 하는데요...

라스코니의 이미지

여기(https://temp123.tistory.com/16)에 잘 설명되어 있네요. 뭐가 다른지 비교해 보세요.

1. write 함수를 ssize_t write(int fd, const void *buf, size_t count) 라고 본다면 (http://man7.org/linux/man-pages/man2/write.2.html 참조), buf 가 들어가야 할 자리입니다. 이는 당연히 가상주소입니다. 리눅스에서 커널 함수를 제외하고 물리주소를 접근할 수 있는 함수는 없습니다.

2. 그 주소는 가상함수가 표현할 수 있는 주소값 범위 내에 있어야 합니다. 물론 그 주소는 malloc() 등으로 할당된 것일테니 잘못된 값을 줄수 있지도 않고요.

3. 유저 모듈은 커널 디바이스 드라이버에 붙어서(?) 동작합니다. 그러니까 커널 영역에 있다고 봐야 겠죠.

bushi의 이미지

CPU 의 MMU 가 켜진 이후로 물리주소에 직접 접근할 수 있는 s/w 는 없습니다.
커널도 예외는 아닙니다.
MMU 에 물리주소와 가상주소가 1:1 identical 매핑이라도 되어 있어야 물리주소로 접근하는 흉내라도 낼 수 있습니다.

예로 드신 코드는 일반적인 write() 함수 사용방법과는 매우 다릅니다.
하지만 장치 드라이버를 그에 맞게 작성한다면 불가능하지는 않습니다.
따라서 장치 드라이버 코드를 보기 전엔 1번,2번 질문에 대한 답이 불가능합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.