net_device 나 tty 디바이스 드라이버 같은 경우 mmap을 쓸 수 없나요?

jgm2000의 이미지

file operations 구조체에 보면 mmap 이라는 함수가 있습니다.
이 함수는 하드웨어의 메모리 포인터를 app에 전달해 주는 함수로 알고 있습니다.
일반 캐릭터 디바이스는 이 함수를 쓸 수 있을 것 같은데,
net_device 나 tty 디바이스 같은 경우는 operations에 mmap 함수가 없습니다.
net_device 나 tty 디바이스 같은 경우 mmap을 대신하는 함수가 없나요?
아니면 어떻게 mmap 같은 역할을 하는 함수를 쓸 수 있을까요? 답변 부탁드립니다.

bleu의 이미지

바로는 안되는걸로 알고 있습니다..
아마도 원하시는건 DMA를 사용하셔야
할것 같네요..

저도 DMA를 사용해야 한다는 정도만 알고
있어서 자세한건 DMA관련 자료를 찾아 보시는게..

bushi의 이미지

mmap() 을 하려고 하는 대상 공간이 물리적으로 연속된 page 들의 집합이면 상당히 편합니다. 물리적으로 연속된 공간을 malloc 해주는 함수가 커널에 있습니다.
2.4 에서 2.6 으로 올라오면서 그 함수의 이름에 dma 라는 단어가 들어간 것이 이런 오해를 불러일으키는 것 같습니다.

본질적으로 DMA 컨트롤러는 DMA 를 하기 위한 source/destination 이 물리적으로 연속이기를 기대하므로, 함수 작명에 큰 문제가 있다고는 보지 않습니다.

무엇보다도, 불연속인 page 들의 집합이라해도 mmap 은 가능하므로 mmap 과 DMA 는 아무 관련이 없습니다.
불연속인 page 들의 집합을 사용하는 예는 커널의 drivers/media/video/ 에서 쉽게 찾아보실 수 있습니다. v4l, v4l2 에서 사용하는 프레임 메모리 공간은 일반적으로 매우 큽니다. 평시에 이 큰 공간이 물리적으로 연속이기를 바란다는 것은 ... 힘들지요.

bushi의 이미지

mmap() 은... 사실상 glibc 의 malloc() 도 mmap() 을 이용해서 구현한다는 것에서 부터 시작하겠습니다.
물리적 공간(메모리,외장chip등)을 user application 이 사용할 수 있도록 직접적인 매핑을 해줍니다. (x86 처럼 맵이 복잡하지 않은 프로세서에선 CPU 내장 레지스터도 user application 이 접근가능합니다)

가장 친근한 예를 꼽자면 리눅스 프레임버퍼를 들 수 있겠습니다.
프레임버퍼에 사용될 메모리 공간은 외장 칩이 제공하는 것일 수도 있고,
CPU 내장 컨트롤러일 경우는 커널 내부에서 malloc() 한 메모리 공간일 수도 있습니다.
드라이버레벨에서 적절히 매핑을 해주면 user application 에서는 이 공간을 직접 읽고 쓰는 것이 가능합니다.

비교적 덜 친근한 다른 예로는 OSS audio 입니다.
입출력용의 버퍼는 거의 예외없이 커널 드라이버 내부적으로 malloc() 한 메모리 공간입니다. 이 공간을 mmap() 하여 user application 이 직접 읽고 쓸 수 있다면 read/write 에서 자유로와 집니다. read/write 에서 자유로와 진다는 것의 의미는 그렇게 단순하지만은 않습니다. 이것을 사용하는 구체적인 예를 들어보라면... 저는 quake3 밖에 못 봤습니다. 아시다시피 3D FPS 는 보이는 것과 들리는 것의 sync 가 무척 중요합니다. sync 뿐만 아니라 소리의 중첩도 중요합니다.
mmap() 외에 몇가지 부가설비를 더 이용해야 하는 만큼 간단치는 않습니다만, write 를 사용하는 것보다는 쉽습니다. 어찌됐건, 현재 DMA 로 전송 중인 버퍼의 내용을 당장 업데이트하는 것도 가능하니까요.

net_device 나 tty 가 mmap() 이 필요한 일이 있을런지에 대한 고민은 해보지 않았습니다. 둘 다 오래된 전통만큼이나 다양한 표준설비들이 있습니다.
이유를 밝혀주시면 다른 분들이 길을 일러 주시리라 생각합니다.

jgm2000의 이미지

일단, 답변 정말 감사드립니다.
제가 커널에서 모듈을 하나 만들었습니다. 그 모듈에 여러 변수들이 있는데, 그 변수들을 명령 프롬프트에서 command로 변수값들을 설정하고 싶습니다.
그럴려면 그 command를 app로 구현을 해야 하는데, 커널에 올라와 있는 모듈의 변수들을 설정을 할려니, shared memory 같은 것은 못쓸거 같고, 커널에 할당 되어 있을 구조체를 app의 구현을 통하여 값을 설정하고자 합니다.
mmap이 아니면 어떤 것으로 가능할 까요.

댓글 달기

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