DMA로 받은것을 mmap으로 mapping하는 예제는?

darkblue99의 이미지

드라이버로...
하드디스크등으로부터 dma로 memory로 전송한것을
mmap을 이용해 mapping하여 application에서 읽어갈수 있도록 하는
예제없을까요?

음..
그러니까..
HARD disk or Network card => DMA => MEMORY => application
을 공부할 수 있는 예제를 원합니다.

mmap에 대해서 LDD2에서 읽어도 잘 모르겠네요 -.-;
부디 고수님들의 친절한 설명 부탁드립니다.

jyj9782의 이미지

어려운거 하시네요. 커널 공부중인데, 하드부분 공부를 해야지 원 ㅎㅎㅎㅎㅎ

답변이 아니어서 송구스럽습니다;;

열심히 하세요..

힘내세요.

hb_kim의 이미지

darkblue99 wrote:
드라이버로...
하드디스크등으로부터 dma로 memory로 전송한것을
mmap을 이용해 mapping하여 application에서 읽어갈수 있도록 하는
예제없을까요?

mmap을 쓰는 이유는 비디오 드라이버와 같이 하드웨어 자체에 물리적 메모리가 있는 경우 애플리케이션에서 이를 마치 메모리처럼 액세스할수 있게 하기 위한 경우입니다. mmap 과 DMA 는 같이 쓰이는 경우가 별로 없죠.

darkblue99 wrote:

음..
그러니까..
HARD disk or Network card => DMA => MEMORY => application
을 공부할 수 있는 예제를 원합니다.

mmap에 대해서 LDD2에서 읽어도 잘 모르겠네요 -.-;
부디 고수님들의 친절한 설명 부탁드립니다.


하드디스크의 경우는 어댑터에 메모리가 없으므로 mmap 이 필요하지 않습니다. mmap은 잠시 잊어버리시고 파일관련 시스템 콜부터 보셔서 밑으로 내려가면서 보시면 될듯합니다. 소스코드를 본격적으로 보시기전에, 좋은 관련서적을 구해서 미리 읽어보시는것도 잊지마세요.
darkblue99의 이미지

Quote:
mmap을 쓰는 이유는 비디오 드라이버와 같이 하드웨어 자체에 물리적 메모리가 있는 경우 애플리케이션에서 이를 마치 메모리처럼 액세스할수 있게 하기 위한 경우입니다. mmap 과 DMA 는 같이 쓰이는 경우가 별로 없죠.

네.. 좀더 책을 가지고 공부를 해야겠군요~

그럼 mmap 예제도 없나요?
-.- LDD2의 예제는 이해가 안되서요

Be Postive!

쿨링팬의 이미지

Quote:

드라이버로...
하드디스크등으로부터 dma로 memory로 전송한것을
mmap을 이용해 mapping하여 application에서 읽어갈수 있도록 하는
예제없을까요?

하드디스크로부터 읽은 데이터는 커널에서 관리하는 버퍼캐쉬 영역에 올라가고,
NIC으로부터 읽은 데이터는 커널에서 관리하는 소켓버퍼로 올라갑니다.

mmap은 장치의 영역을 응용 프로그램의 가상 주소공간에 메핑하여, 접근할 수 있도록 합니다.
만약 장치의 mmap된 공간이 PCI address space상에 있으면 DMA를 통해 바로 장치의 메모리로 복사없이 적게 되는 것이죠.
(copy_from_user나 copy_to_user와 같은 함수로 인한 copy overhead를 없앨 수 있습니다.)
비디오카드의 메모리를 X나 그외 응용 프로그램들이 mmap을 이용하여 접근하는 것이 대표적입니다.

말씀하신대로 물리적인 장치로부터 읽은 내용을 mmap을 통하여 사용자가 접근케 하기 위해서는,
물리적인 장치를 위한 드라이버에 메모리 공간을 잡고 그 영역을 사용자가 접근할 수 있도록 mmap 함수를 드라이버에 구현하는 방법이 있습니다.
그러면 커널에서 관리하고 있는 버퍼의 내용은 드라이버 내부의 메모리에 복사가 될 것이고,
사용자는 복사된 메모리 영역을 mmap을 통해 access하게 되는 것입니다.

이와 같은 방법보다는 버퍼캐쉬 혹은 소켓버퍼의 내용을, 사용자 영역에서 일반적인 read, recv 시스템 콜을 통해 끌어 올리는 것이 효과적입니다.

물론 디스크로부터 읽은 내용을 바로 네트웍쪽으로 보내는 방법이 있습니다.
실제적으로 데이터를 사용자 영역으로 끌어올릴 필요가 없는 서버용 응용프로그램들이 이에 해당됩니다. sendfile등이 그 예가 되겠습니다.

댓글 달기

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