NIC device driver 제작 방법에 대한 질문

rain의 이미지

리눅스에서 Realtek 8139 ethernet 카드의 driver를 제작해보려구 합니다.
소스도 있어서 분석하고 실제로 만들어 보면 재미있을거 같더군요.
첨으로 driver를 만들어 보는 거라 궁금한게 많습니다.
보통 driver를 제작할때 단지 device에 대해 제품 회상에서 제공되는
레퍼런스만 있음 제작이 가능한건 지 궁금해요. 혹시 nic카드의 상태등을
확인 해보기 위한 장치들이 있어야 하는건지. 아니면 kernel level에서
테스트 해가면서 제작을 하는 건지 궁금합니다. :roll:

hb_kim의 이미지

보통 현업에서 드라이버를 만들때는 하드웨어 제작사에서 제공하는 technical reference 외에도, 디자인 가이드와 애플리케이션 가이드등을 또 받습니다. 그외에도 대부분의 회사에서는 샘플 드라이버를 제공해줍니다.

Technical reference 는 하드웨어의 스펙에 관한 세부정보이고요.

디자인 가이드는 이 하드웨어는 이러한 특징이 있으며, 이러한 방법으로 사용하면 좋다~ 그런 가이드이구요.

애플리케이션 가이드는 디자인 가이드와 같은것이지만, 보다 더욱 더 자세한 예를 들어서 설명한것이죠.

샘플 코드는 특정 OS 에서 왠만큼의 기능은 거의다 실행되는 드라이버의 소스 코드입니다. 보통 별다른 문서 없이 코드만 오죠.

이 정도만 있으면, 드라이버를 만들때 필요한 모든 정보는 다 갖추어진 셈입니다. 그외에 필요한것은 작성하고자 하는 OS 에 대한 지식, 기본 C 프로그래밍 기술뿐이죠. 어셈블리 언어의 지식은 드라이버 작성에는 별 필요가 없습니다.

커널 레벨에서의 테스트를 말씀하셨는데, 그런것은 아직 못보았습니다. 대부분 드라이버는 그냥 유저레벨 테스트 프로그램으로 테스트합니다. 유닉스 계열에서는 I/O 를 발생시켜주는 프로그램,IOCTL 을 호출하는 프로그램과 함께 쉘 스크립트를 쓰고요. 윈도우즈에서는 잘 모르겠지만, 기본기능 테스트외에도 그들이 제공하는 stress test program 을 에러없이 수행해야 하는것으로 압니다. 그래야만 인증 테스트를 시작을 하죠.

현업에서 풀타임으로 드라이버 개발시에 보통 1-2 개월은 스펙과 샘플코드만 공부하고요. 그후에 대략의 드라이버 아키텍쳐를 구상하고, 나머지 시간은 거의 샘플코드를 paste & copy 합니다. 샘플코드에 부족하거나 없는 부분은 새로 만들거나, 어디 다른데서 또 paste & copy 하면 되죠. :o

개발자가 테스트까지 같이 겸임하는 법은 거의 없으며, QA 소관입니다. 개발자들은 게을러서 잘 테스트를 못하거든요. 문제 발생시 디버깅은 console print, event logging, assert, gdb crash tool 등 적절하게 사용해서 디버깅합니다. 위의 방법으로 잘 안될때는 코드를 보면서 직감을 이용해서 찾아내구요.

rain의 이미지

답변 감사합니다. 것두 새벽에..^^;;
한가지 더 궁금한게 생겨서 질문드립니다.
하드웨어 회사에서 제공하는 sample code를 구할 수있나요? Realtek NIC에 대한 sample code같은건 사이트에서는 못 봤거든요. sample code에서 구현된거랑 완성된 driver랑 어느 정도 차이가 있는지 보구 궁금해서요.

세상에서 가장 이해하기 힘든 것은 내 자신이 그것을 이해할 수 있다는 것이다.
- 알베르트 아인슈타인 -

hb_kim의 이미지

리눅스용으로 소스까지 배포되는 드라이버의 경우에는 보통 말하는 샘플코드보다는 더 안정되고 기능도 왠만큼 필요한것은 다 있는 경우입니다. 따라서 리눅스 소스를 보면 샘플코드를 보는것보다 조금 복잡하기는 해도, 더 완성도 있는 코드를 보는것이 되겠죠.

보통 샘플코드의 경우는,
- 부하가 많을때 비안정적이고,
- 타기기와의 호환성이 검증되지 않았고,
- 하드웨어 성능이 최대한으로 활용되지 않았고,
- 기능이 전부 구현되지 않았고,
- 군데 군데 버그가 숨어있고,

등등의 특성을 갖는 코드입니다. 한마디로 기본 동작은 하지만, 실제로 쓸려면 여러군데 손볼데가 있는 코드이죠. 따라서 일반에게 공개하기는 좀 그렇고 해서, customer-vendor 관계가 있어야 NDA 등에 서명하고 나누어 주는 것이죠.

rain의 이미지

덕분에 많은 도움이 됐습니다.
3000라인 정도인데도 공부할 건 많은거 같네요..^^
즐프하세요...

세상에서 가장 이해하기 힘든 것은 내 자신이 그것을 이해할 수 있다는 것이다.
- 알베르트 아인슈타인 -

댓글 달기

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