Charater Device에서 커널모듈에서 이벤트 발생시 User App에게 변수를 보내는 법

winterprincess의 이미지


커널모듈에서 이벤트 발생시 User App에게 변수를 보낼 수 있는 방법이 없을까요?

지금까지 예제를 보니 User App에서 먼저 커널 모듈로 접근할 때만 변수 메모리를 Copy할 수 있던데,

반대로는 작동하지 않는 것 같습니다...

혹시 문자 드라이버 외의 방법이나 문자 드라이버로 가능한 방법이 있는지 조언 부탁드립니다.

spbrain의 이미지

예전에 커널 2.4에서 기억하기로는 커널에서 유저로 특정 이벤트를 발생시키는 것은 어렵고요.
대신에 변수값을 바꾸는건 쉽습니다.
ioctl 에서 RW로 하나 등록하신후에 변수 포인터를 넘기고 난 뒤에 그 포인터를 가지고 copy_to_user와 같은 함수로 만들면 될듯하고요.

이벤트는 보통 App에서 Ioctl같은걸로 Polling 해서 커널에서 이벤트가 발생했는지를 검사하는 방식을(HandShaking)이용하면 될거 같습니다.

winterprincess의 이미지

답변 감사합니다.

select함수를 줘서 dev와 연결된 fd를 넣고 status를 계속 체크하는 방식으로 구현을 하려했습니다만...
이방법은 지속적인 감시가 필요한데다가
문제를 제가 구현하려는 목적이 들어오는 패킷의 정보를 특정 주기로 보내려는 것인데, 이벤트가 발생시 Waring을 뿌리기엔 문제점이 여러가지 발생되어 구현을 포기했었습니다...

오직 겨울 공주를 위하여.

-----------------------------------------------------------------------------------

오직 겨울 공주를 위하여.

dorado2의 이미지

아직 사용할 일이 없어서 저도 안 써봤지만, netlink라는 걸 한번 봐보세요.

http://www.linuxjournal.com/article/7356

winterprincess의 이미지

netlink도 고려해봐서 iptables 소스를 다 봤는데...
역시 어렵더군요.
우선 구현시 Kernel 처리 따로 User 처리 따로 노는 바람에 소켓 통신을 이용해서 정보를 주고 받는 건 포기했습니다.
어떤분이 인터럽트 처리를 하면 괜찮지 않느냐라고 말씀하셨는데,
RealTime을 포기하고 차라리 특정 데이타값을 일정 주기로 넘기는 방식으로 구현하는 것이 나을 거 같아 방식을 조금 바꾸었습니다.
사실...인터럽트 처리에 자신이 없어서 제가 자신 있는 방법으로 하려는 거였죠 ㅎㅎ

오직 겨울 공주를 위하여.

-----------------------------------------------------------------------------------

오직 겨울 공주를 위하여.

grassman의 이미지

보통 copy_from_user나 copy_to_user 같은 함수를 사용해서 User 메모리 영역에 접근합니다.

그런데 질문의 내용을 보니 event wait를 원하는 것 같은데요.
그 경우에는 보통 kernel module에 ioctl을 추가하고 해당 ioctl에서 task를 wait queue에
밀어넣습니다. 그리고 event 조건이 되면 task를 다시 wait queue에서 빼서 run시키는 방식
으로 접근하시면 됩니다. User application에서는 새로 추가된 ioctl 호출이 완료되었을 때
event에 대한 처리를 하면 되는 겁니다.

vt_ioctl.c 코드에 통상적으로 사용하는 wait 코드가 있습니다. 해당 코드를 분석하시면 될
듯 합니다.

kernel module에서 wait 하는 코드는 다음과 같습니다.

DECLARE_WAIT_QUEUE_HEAD(wait_queue);
 
...
 
        int retval;
        DECLARE_WAITQUEUE(wait, current);
 
        add_wait_queue(&wait_queue, &wait);
        for (;;) {
                set_current_state(TASK_INTERRUPTIBLE);
                retval = 0;
                // wait 종료 조건이면 break 하도록 하는 코드 추가
                retval = -EINTR;
                if (signal_pending(current))
                        break;
                schedule();
        }
        remove_wait_queue(&wait_queue, &wait);
        current->state = TASK_RUNNING;
        return retval;

보통 wait 종료 조건이 완료되더라도 즉시 task가 깨어나지 않습니다. 그럴 경우 wait 조건을
성립시키는 부분에서 해당 wait queue에 wake up하도록 해 줘야 합니다.

        // wait 종료 조건 성립
        wake_up_interruptible(&wait_queue);

winterprincess의 이미지

이런 방법이 있었네요.
한번 시도를 해봐야 할 것 같습니다.
지금 다른 방법으로 구현한 것과 이 방법을 비교해서 어떤 것이 나을지 보고 결정을 해봐야겠습니다.
감사합니다.

오직 겨울 공주를 위하여.

-----------------------------------------------------------------------------------

오직 겨울 공주를 위하여.

댓글 달기

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