디바이스 모듈과 /dev/*.파일과의 관계

linux_chozza의 이미지

안녕하세요.
디바이스 모듈과 /dev/*.파일과의 관계가 궁금합니다.
디바이스 모듈만 사용하지 않고 왜 /dev 디렉토리 밑에 특수파일을 만드는지 그리고, vi로 파일을 열어 보니 파일내용이 없더군요 :?

그리고, /dev 디렉토리 밑에 디바이스 파일을 만드는 기준이 어떤건지..
그러니깐, 디바이스 하나에 무조건 /dev/파일 하나씩이렇게 매핑이 되는건지 알고 싶습니다.
제가 넘 초짜라 모르는게 넘 많습니다.
부탁드립니다 :mrgreen:

ktd2004의 이미지

저도 잘 모르지만 아는 범위에서 답변드리겠습니다.

/dev/* 안의 디바이스 파일들은 major와 minor넘버를 가지고 있습니다.
주로 사용하는 major number들은 $LINUX/Documentation/devices.txt 파일에서 확인할 수 있습니다.

이 파일을 보면 어떤 디바이스가 어떤 major 번호와 minor 번호를 가져야 하는지를 알수 있습니다. 그리고 사용자가 만드는 새로운 device를 위해 할당된 major 넘버도 물론 존재합니다.

linux device driver를 작성할 때 일반적으로 하나의 디바이스 드라이버는 하나의 major 넘버와 mapping됩니다. 따라서 /dev/* 이름은 별 의미가 없습니다.
중요한 것은 major와 minor 넘버입니다.

사용자 프로그램에서 /dev/ttyp0 를 open하게 되면 major number 3번에 해당하는 디바이스 드라이버가 호출되게 됩니다.

그리고 해당 디바이스 드라이버 내부에서 minor넘버로 다른 동작을 수행하도록 되어 있습니다.

제가 아는 내용이 별로 없어서...
더 자세한 내용은 Linux Device Driver 책을 보시면 될 것 같네요..

linux_chozza의 이미지

근데, 제가 알고싶은 내용은 ^^

그냥 모듈을 이용한 후에 직접 장치에 디바이스에 접근을 하면, 될건데
왜 /dev/* 파일을 만드는 이유입니다.

모듈내에서도 메이저넘버를 정할수 있습니다.(단, 마이너넘버는 지정못하구요) 그리고, 메이저 넘버는 모듈내의 메모리에 위치하겠죠.

그럼 커널에서 메이저넘버로 해당 모듈을 찾아서 호출할 수 있을거고 그럼 모듈이랑 디바이스랑 통신을 하면 될건데... 왜 구지 /dev/*파일을 만드는 이유를 알고 싶습니다.

그리고, device driver책을 보고있는데.. 위와 같은 내용이 어디 있는지 찾지를 못하겠어요.T_T

우~싸!!! ^_________^

jcly2의 이미지

말씀하신 것처럼 그냥 device node를 적당한 곳에 막 만들어서 사용도 할 수 있을 것입니다만..

제가 알기로는 unix 호환성 때문에 (아님.. 표준화인가..) 이렇게 설정하고 있는 것으로 알고 있읍니다.

자세한 내용은 Linux Standard Base Specification 규격에서 file system쪽 정의를 함 살펴보거나 File System Hierarchy Standard 문서를 보시면 알 수 있을 것같네요.. *nix 계열에서 어떤 디렉토리 구조를 정의하고 사용하고 있는지..

valor의 이미지

리눅스 디바이스 드라이버 개발할 때 귀찮은 점 중 하나였는데, 2.4 커널에 올라오면서 DEV FS라는 것이 생겼습니다.

이게 뭐냐 하면 /proc 처럼 dev라는 파일시스템을 /dev에 마운트해주면 자동으로 디바이스 노드들을 실시간적으로 관리해주는 데몬이지요.

register_devfs 어쩌고 하면서 node를 등록했다가 삭제하는 형식이거든요? 이걸 사용하면 mknod ... 이런걸 안써도 되지요.

다만 커널을 다시 컴파일할지도 모르고 쓰는 사람이 별로 없는듯하다는 점이 단점일듯...

그리고 device node를 안만들면 user application에서 device를 못열텐데요?

xfree의 이미지

간단하게 시리얼 통신을 하는 프로그램을 만든다고 가정해 봅시다. 시리얼 통신하는 프로그램은 사용자 프로그램이고 이 프로그램은 통신을 위해 /dev/ttyS0 와 같은 시리얼 디바이스를 open/read/write/close/ioctl 함수들을 이용해 제어할 것입니다.

사용자 프로그램에서 /dev/ttyS0를 open할때 커널은 ttyS0의 메이저 번호를 보고 해당하는 디바이스 드라이버의 open함수를 실행시켜 줍니다. 모듈내의 open함수를 실행시킨다는 뜻입니다.

시리얼 디바이스 화일이 있어야 사용자 프로그램이 시리얼 통신을 할 수가 있게 되는 거죠. 대부분의 모듈은 수동적이라 그 자체로서 아무일도 하지 않고 사용자 프로그램에서 요청이 와야 동작하게 됩니다.

kuma의 이미지

Unix 는 모든것을 file 로 보는 일관된 방식을 유지합니다.

터미널 도 그렇고, serial, file 등등 모든것을 파일로 보고 처리합니다.

이런 생각에 유추해 보면 device 가 file 목록에 있는것이 이상하게 보이지 않을 겁니다.

이런 비슷한 예로 Open VMS 는 모든것을 Queue I/O 의 형태로 모든것을 봅니다. File 에 대해서도 Device 에 대해서도 socket 또한 Queue I/O 로 모든걸 제어 할 수 있습니다.

이걸 다른게 보면 Device module 과의 Interface 가 이런 방식으로 이루어 지게끔 만들어 졌다고 볼수도 있겠죠.

새로운 O/S 를 처음 접할때 저는 항상 이 부분을 제일 먼저 찾아봅니다.

김충길의 이미지

누군가가 /dev 밑에서 rm -rf * 했다는 ㅠ.ㅠ 옛 기억이 떠오르는군요.

screen + vim + ctags 좋아요~

kyong의 이미지

linux_chozza wrote:
안녕하세요.
디바이스 모듈과 /dev/*.파일과의 관계가 궁금합니다.
디바이스 모듈만 사용하지 않고 왜 /dev 디렉토리 밑에 특수파일을 만드는지 그리고, vi로 파일을 열어 보니 파일내용이 없더군요 :?

user space와 interfacing을 할 일이 없다면 필요없겠죠.

댓글 달기

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