블럭디바이스 드라이버의 Request_Queue와 Application Level의 Read Write의 관계를 알고 싶습니다.

wind351의 이미지

블럭디바이스 드라이버의 Request_Queue와 Application Level의 Read Write의 관계를 알고 싶습니다.

리눅스에서 Application Level에서 디바이스를 Open 하고 Read Write를 하는 경우

디바이스 드라이버의 Read Write Open 함수와 맵핑을 시킨다고 하는데...

보통 네트워크 카드들은 그런 구성으로 이루어 진거 같은데...

블럭디바이스 드라이버는 보통 구조가

커널에서 Request 생성 -> Request_Queue에 인큐 -> 디바이스 드라이버에서 처리

이런식으로 이루어지는 것 같은데...

만약 제가 /dev/myHdd1 이라는 디바이스의 드라이버를 만들고

Application 래밸에서 fd = open ("/dev/myHdd1")을 부르고

Read(fd,..........) 을 수행하게 된다면....

어떤식으로 동작이 이루어지는 것일까요?

Read 함수를 열어보니

bin_buffer, dentry, size, offset 등등 설정하고

뮤택스 잡고 fill_read(...)함수를 콜해주고

fill_read함수에서는 bin_attribute에 맵핑되어있는

attr->read 함수를 콜하던데... 이게 제가 만든 디바이스 드라이버의

Request_queue와 연동이 되는것인가요?

개념이 잘 안잡히네요....

조금 정신 없이 질문을 하고 있는데..

정리해서 말씀드리면

request방식으로 제작된 디바이스 드라이버의 request_queue에 함수를 하나 맵핑 시키는데

이 함수가 application level의 read write가 어떤경로를 통해 호출되는지 궁금합니다.

pastime의 이미지

read 시스템 콜의 서비스 루틴인 sys_read의 실행 과정을 간략히 말씀드리겠습니다. (커널 3.0-rc5 기준)

sys_read는 vfs_read를 거쳐 결국 해당 file의 f_op->read 함수를 호출합니다.
이는 대부분의 파일 시스템에서 do_sync_read 함수에 해당하며 블록 장치의 경우도 동일합니다.

do_sync_read는 다시 file->f_op->aio_read 함수를 호출하는데
이는 대부분 generic_file_aio_read 함수에 해당하며
이 함수는 먼저 페이지 캐시를 살펴보고 원하는 데이터가 없는 경우 실제 I/O를 발생시킵니다.

disk I/O를 담당하는 함수는 inode->mapping->a_ops->readpage (혹은 readpages) 인데
(보통의 파일 시스템이라면 각자의 get_block 구현과 함께 mpage_readpage를 호출하는 형태이고
블록 장치인 경우 block_full_read_page에 해당하지만 하는 일은 거의 비슷합니다)
주어진 파일 offset을 통해 블록 번호 (디스크 offset)를 얻어낸 후
결국에는 submit_bio 함수를 호출하여 블록 레이어로 요청(bio)을 보냅니다.

bio는 generic_make_request를 거쳐 q->make_request_fn으로 보내지는데
드라이버에서 특별히 변경하지 않았다면 __make_request가 호출될 것입니다.
그러면 새로운 request가 만들어지거나 기존의 request에 merge되며
unplug가 이루어지는 시점에 I/O scheduler에게 전달된 후
드라이버가 제공한 q->request_fn 함수가 호출되게 됩니다.

wind351의 이미지

정말 감사합니다!

많은 도움이 되었습니다!^^

댓글 달기

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