리눅스 디바이스 드라이버에 관하여 질문드립니다.

enermysong의 이미지

한가지 궁금한 사항이 있는데요!
리눅스 디바이스 드라이버를 사용하는 방법이 크게 2가지 있는걸로 알고 있습니다.
우선 디바이스 드라이버를 Application에서 open,write,read 함수등을 이용하여 디바이스 드라이버를 사용하는 방법이 있고
다른 한가지로는 디바이스 드라이버 자체내에서 create proc를 이용하여 사용하는 방법 2가지가 있는 걸로 알고 있습니다.
그럼 질문드리겠습니다.
두번째의 경우에는 디바이스 드라이버 자체가 프로세스가 되어 동작하는걸로 알고 있습니다만 첫번째의 경우에는 디바이스 드라이버가 자체적인 프로세스가 되어 동작하는지 궁금합니다. ps명령을 이용하여 프로세스의 목록을 살펴본 결과 프로세스는 없더군요..
혹시나 아시는 분께서는 답변 해주시면 정말 감사드리겠습니다.

Hyun의 이미지

첫번째 경우는 어플리케이션에서 open, write, read 등의 system call을 호출하면 어플리케이션의 프로세스가 커널로 진입하여 직접 드라이버 함수를 호출합니다. 그러므로 프로세스가 추가로 생성되거나 하는 일은 없겠죠..
드라이버 함수 호출이 끝나면 다시 사용자모드로 바꾼 후 어플리케이션 실행을 계속하게 되겠죠.


나도 세벌식을 씁니다
poplinux의 이미지

ps 로 확인 가능한 것은 user space 에서 돌고 있는 프로세스입니다. 커널쪽은 확인 할 수없습니다.

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

enermysong의 이미지

음... 모듈 자체가 커널 프로세서라는건가요?

freemckang의 이미지

먼저... file operation을 통해 접근하는 것이나 proc fs를 통해 접근하는 것이나 개념 상으로는 동일합니다. 통로를 어떻게 열어주었냐의 차이 정도로 생각되는데요... 사용하는 성향에 따라서 나름의 장단이 있겠죠.

그런데... 이해가 안가는 것이 두번째 방법 (create proc이라고 하신 것으로 미루어보아 proc fs를 통해 접근하는 것을 말씀하시는 것 같네요)을 썼을 때는 process가 생성이 된다고 하셨는데... 생성이 되나요??? 혹시 kernel thread를 말씀하시는 것인지??? 그래도 proc fs와는 별 상관이 없어보이구요...

Kernel 자체가 모든 주소가 접근이 가능한 process라고 보시면 될 것 같습니다..

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

enermysong의 이미지

명쾌한 해답 주셔서 정말 감사드립니다. 복 받으실거에요~ ㅎㅎ

owlet의 이미지

file operation이나 proc fs를 통한 접근 모두 호출한 프로세스의 context에서 동작하고 따로 프로세스를 생성하지않습니다. 드라이버가 새로운 프로세스로 동작하지는 않습니다. 모듈은 어플리케이션에서의 동적 라이브러리와 비슷하다고 생각하시면 됩니다.

poplinux:
ps에서 kernel thread도 확인할 수 있습니다. []로 표시된 프로세스들이 kernel thread입니다.

freemckang:
커널은 커널 영역의 메모리만 접근하고, user memory를 직접 접근할수 없습니다. 현재 context의 user memory만 copy_from_user(), copy_to_user()등의 호출을 통해서 접근합니다.

Hyun의 이미지

owlet wrote:
freemckang:
커널은 커널 영역의 메모리만 접근하고, user memory를 직접 접근할수 없습니다. 현재 context의 user memory만 copy_from_user(), copy_to_user()등의 호출을 통해서 접근합니다.

아키텍쳐마다 조금씩 틀리다고 알고있으나, 대부분 커널에서는 커널메모리와 사용자메모리(현재 컨택스트) 모두에 접근할 수 있습니다.(다른 컨택스트의 메모리는 잘 모르겠군요.)
copy_{to,from}_user 류의 함수는 단순히 잘못된 메모리 접근을 막아주기 위해 사용하는 것으로 압니다.
나도 세벌식을 씁니다
owlet의 이미지

예.. 제 실수입니다. 하지만 커널에서의 user memory 접근은 주의를 요하고, copy_from_user(), copy_to_user()를 통해서 처리하는게 바람직할듯합니다.
커널에서 다른 컨텍스트의 user memory는 접근 불가합니다.

freemckang의 이미지

copy_to_user나 copy_from_user가 kernel에서 사용되는 address와 user process에서 사용되는 address가 다르므로... 변환해주기 위해 있는 함수 아닌가요??

말씀하신 내용을 kernel이 다른 user process의 메모리에 접근은 가능하지만 그 address가 동일하지 않기 때문에 사용에 주의를 요한다라고 봐도 되는건지요..?

H/W 팀에서 시료를 안보내주어서 금요일 저녁에 이러고 있습니다 ㅎㅎ

즐거운 주말 맞이하세요 :)

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

Hyun의 이미지

Quote:
copy_to_user나 copy_from_user가 kernel에서 사용되는 address와 user process에서 사용되는 address가 다르므로... 변환해주기 위해 있는 함수 아닌가요??

예전에 이런(kernel에서 사용되는 address와 user process에서 사용되는 address가 다른) 아키텍쳐를 사용했던 기억이 있는거 같은데, 오래되서 자세히 기억이 나지 않는군요. 하여튼 커널과 사용자 영역에서 데이터를 교환할 땐 copy_{to,from}_user 등의 함수를 쓰는게 좋습니다.

그리고, 만약 어플리케이션에서 read나 write에 잘못된 버퍼 포인터를 넘겼을 때 copy_{to,from}_user 나 기타 적당한 함수를 사용하지 않으면 잘못된 메모리 접근으로 커널 웁스(패닉)이 납니다. 하지만 copy_{to,from}_user 를 사용하면 잘못된 메모리접근에 대해 웁스를 피할 수 있습니다.

또한, 한 프로세스가 동작할 때 커널 전역에서 그 프로세스에 할당된 메모리 테이블을 사용하므로, 다른 프로세스의 메모리를 참조하는건 좀 힘들지 않을까 합니다. 물론, 해당 프로세스의 메모리 디스크립터 등을 참조한다던지, 다른 프로세스의 메모리 페이지를 기억한다던지 하면 될 듯도 하지만, 좀 힘들지 않을까 합니다.


나도 세벌식을 씁니다
freemckang의 이미지

언뜻 생각해보면 SH core나 MIPS core 등이 그런 부류가 아닐까 생각해보았습니다.

SH core의 경우 U0/P0/P1/P2/P3/P4 등으로 완전히 구분이 되지요... 물론 U0/P0는 겹치는 address이긴 합니다만... MIPS도 useg, kseg, sseg.. 뭐 이런식으로 구분을 하고는 있는데.. 하지만 그 어느 address도 kernel (privileged mode)이 접근하지 못하는 곳은 없는데, 혹시 이것이 가능한 아키텍처가 있다는 말씀이신지...? 신기하네요~

그리고 말씀하셨던 것처럼 "특정" process의 "특정" address (그 process가 바라보는 address 관점에서)에 접근하기가 그렇게 간단하지만은 않을 것 같네요 ^^;;

다만 제가 말씀드렸던 것은, "특정' process의 "특정" address에 접근한다는 이야기가 아니라, 말씀하셨던 것처럼 예측되지 않은 동작을 일으키게 된다.. 라는 의미였습니다. (어느 address든 접근이 가능하므로..) 제 글이 모자랐나봅니다.

아직도 H/W팀에서 시료가 오지 않고 있습니다.. 나름 금요일 저녁인데~~

즐거운 주말 되세요 (--)(__)

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

enermysong의 이미지

디바이스 드라이버에서 인터럽트의 시간을 측정 중인데요! do_gettimeofday() 요 함수로 시간을 측정합니다.
그런데 이 do_gettimeofday함수가 시간을 잘못 측정할수도 있나요?
인터럽트 핸들러 함수내에서 인터럽트 한번당 do_gettimeofday()함수가 측정되어지는데요! 1000번에 11번정도 잘못된 시간을 가져옵니다.
인터럽트가 1ms로 발생하는데 시간 간격이 31마이크로 나올때도 있고 어쩔때는 0이나올때도 있습니다. 그래서 0이 나올때 먼저 측정한 값과 나중에 측정한 값을 찍어 봤더니 같은 값이 들어있더군요! 이런 경우도 있나요? 참고로 소스문제라면 시작부터 이상했을겁니다. 아무래도 do_gettimeofday()함수 내부에서 xtime을 가지고 시간 처리해주는 부분에서 이상이 발생하는듯한데요!`
도무지 해답을 찾을수 없어서 질문 올립니다. 읽어보시고 좋은 지도 부탁드리겠습니다. 벌써 2일째 밤샘 작업중입니다.

freemckang의 이미지

대부분의 경우에 커널에서 이상한 부분은 찾기가 어려운 것 같습니다.. (stable version일 경우에는 더욱)

별로 경험이 없긴 합니다만 제가 알기로 커널은 이미 대단히 안정적인 프로그램입니다. 생각하신 것처럼 시간을 잘못 계산하고 있다는 부분은.. 아마 아니지 않을까 하는 생각이 듭니다. 간혹 x86용이 아닌 나름의 patch가 적용된 임베디드 시스템의 경우 문제가 발생하는 경우도 봤습니다만...

정녕 이 함수가 의심이 가신다면 jiffies 값을 직접 사용해보시는 건 어떨까 싶습니다.

개발환경이나 소스에 대해서 잘 알지 못해서 뭐라 드릴 말씀은 없네요.. 그럼 즐거운 주말 되세요 :)

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

enermysong의 이미지

제가 현제 구축한환경은 x86 인텔 모바일 400mhz이고 커널은 2.6.25.14입니다. 인터럽트 발생장치는 개발한 isa카드 장치 입니다.
현재 커널을 업그레이드 하는중이라 확인해보고 말을 해야 할것 같습니다.

enermysong의 이미지

tsc를 이용하여 측정하면 정상적으로 측정이 됩니다만 do_gettimeofday 함수를 이용한다면 여전히 문제가 발생합니다.

댓글 달기

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