질문입니다. 디바이스에서 한 결과를 사용자 프로그램으로 어떻

fuerza의 이미지

어떤 식으로 하면, 디바이스에서 한 결과값을 사용자 레벨 프로그램으로

전달해 줄수가 있을까요?

codeart의 이미지

int copy_from_user(void *to, const void *from, unsigned long n)
int copy_to_user(void *to, const void *from, unsigned long n)

asm/uaccess.h

미래를 수정할 수 있는 때는 현재이다.

bbok의 이미지

커널 레이어와 유저 레이어 사이에 통신을 하기 위해서 유닉스에서 제공해주는
것인 바로 시스템 콜이라는 것이잖아요. 따라서 그것을 이용하시면 될것 같습니다.

이렇게 말씀 드리면 너무 추상적이기 때문에 좀더 구체적으로 말씀을 드리면,
다음의 3가지 방법이 있을 것 같습니다.(방법은 더 많겠죠 @.@)
1. 새로운 시스템콜의 구현
2. 기존의 시스템콜을 이용
3. NETLINK이용

먼저 '새로운 시스템콜의 구현'을 위해서는 상당한 노력이 필요합니다.
많은 책들에서 소개된것 처럼, 시스템콜을 커널에 많들고, 그것을
'system call dispatch table'에 등록하여야 하며, 그것을 사용자 레이어에서
호출해주어야 합니다. 할일이 아주 많죠 @.@
관련서적이나 시스템콜 관련 아티클들에 상세히 나와 있을것 같다는 생각이 듭니다.

두번째 방법은 첫번째 방법의 단점을 조금이나마 극복하기 위해서, 기존에 만들
어진 시스템을 잘 활용해서 새로운 기능을 추가하는 방법이다.
기존에 있는 어떤 시스템콜을 이요하면 좋을까요? 아주 좋은게 하나 있습니다.
바로 ioctl 인데요, 이놈이 하는 일이 특정 아규먼트에 따라서 서로 다른 기능을
수행하잖아요? 따라서 그놈을 잘 이용하면 될것으로 생각됩니다.
먼저 ioctl을 이용하기 위해서는 커널에서 ioctl 시스템콜이 호출되게 되어지면
어떤 함수들이 호출되어지는 추적하는 작업이 필요합니다. 뭐 간단하게 예를 들어 보면
open()함수를 이용하여 파일을 열고, 해당 파일 디스크립터를 이용하여 함수
를 ioctl()을 호출하면, fs/ioctl.c에 있는 어떤 함수를 호출하게 됩니다.(기억이
잘 -_-;;) 여튼 해당함수에 새로운 request number를 추가하고, 사용자 레이
어에서는 해당 request number를 이용하여 ioctl을 호출하면 되겠죠.
디바이스 드라이버를 작성하셨다고 하니, 해당 디바이스 드라이버를 open하면 생기는
파일 디스크립터를 잘 이용하면 될듯 합니다.
여튼 두번째 방법을 이용해서, 사용자와 커널이 데이터를 주고 받기 위해서는 위에서
답글 달아주신 분이 설명한 함수를 이용하여 커널 메모리 영역에서 사용자
메모리 영역으로 데이터를 복사하여 주면 되겠죠..

세번째 방법은 NETLINK라는 것을 이용하면 됩니다.
Netlink를 socket방식으로 데이터를 커널과 사용자가 주고 받기 위해서 만들어
진 것입니다. ARP, ROUTING TABLE등이 대부분이 NETLINK를 이용하여 커널
에 데이터를 주고 받고 있는것으로 알고 있습니다. 여튼 이 NETLINK에 새로운 것을 하나
추가해주면 됩니다. Netlink같은경우에는 주고 받아야 할 데이터가 많은 경우에 유용한것 같더군요..

설명을 잘못하는 체질이라.. 쓰고나서 제가 읽어봐도 모르겠네요 @.@ ㅎㅎ
여튼, 간단하게 데이터를 주고 받을 거라면 두번째 방법을 이용해서 간단하게
구현하면 될듯 합니다. 아주아주 조금이나마 도움이 되셨길..

@.@ 어제처럼, 오늘 처럼, 내일 처럼.

fuerza의 이미지

감사합니다 ioctl로 해결했습니다.

그리고 커널 프로그램에서 나온 결과값도 ioctl로 해야 되나요?

proc를 이용하려고 하는데....

bbok의 이미지

fuerza wrote:
감사합니다 ioctl로 해결했습니다.

그리고 커널 프로그램에서 나온 결과값도 ioctl로 해야 되나요?

proc를 이용하려고 하는데....

경우에 따라서 틀리겠지만 PROC 파일 시스템을 사용해도 될듯합니다.
IOCTL을 이용해도 될것 같구요.. 편하신데로 하시면 될듯합니다.

근데, 어떤 작업을 하시려는 것인지 잘 몰라서 이렇게 판단할 수도 있는데요,
커널프로그램에서 나온 결과값을 받아 들이기 위해서, 또, 그것이 디바이스
인경우에는 'read'를 이용해서 데이터를 받아 들이면 되지 않나요?
데이터이외의 컨트롤메시지나 통계정보를 받아보시려고 그러시는건가? @.@

@.@ 어제처럼, 오늘 처럼, 내일 처럼.

fuerza의 이미지

네, 컨트롤 메세지 하고, 결과값을 사용자 프로그램에게 보내 주고 받아 올려고하는데요..

잘안되네요.. 특이.. ioctl로 해서 사용자 레벨에서 인자값으로 어떤값을 디바이스 프로그램으로 주고 싶은데 어떤 식으로 해야 될지.. ㅡ.ㅡ;;

아니면 다른 방법 이있을까요?

시작한지 얼마 안되서 잘 모릅니다.. 많은 지도 부탁드립니다.

albamc의 이미지

좀 무식한 방법이긴 하지만

UDP 패킷을 만들어서 localhost로 올려버리는 수도 ... :D

^^*

ahgod의 이미지

잘안되네요.. 특이.. ioctl로 해서 사용자 레벨에서 인자값으로 어떤값을 디바이스 프로그램으로 주고 싶은데 어떤 식으로 해야 될지.. ㅡ.ㅡ;;
-> ioctl function에서 "unsigned long arg" parameter가 있잖아요? 그 Parameter를 이용하는데요. User에서 Structure를 선언하구요 그 안에 원하시는 값들을 넣고, Structure Pointer를 넘기면 "arg"에 그 포인터가 넘어오거든요? 그럼... copyfromuser를 이용해서 Kernel에 설정해놓은 동일한 형태의 Structure로 Copy하셔서 이를 이용하면 될 것 같은데... 참고로 uClinux의 경우는 copyfromuser를 사용하지 않고 "arg"로 넘어온 Pointer를 바로 사용해도 됩니다. 왜냐하면 uclinux는 physical address를 사용하기 때문이랍니다. ^^* 도움이 되었을란지 모르겟네요~~

댓글 달기

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