커널 모듈에서 X윈도로 데이터를 출력하는 방법.. 질문입니다.

raison799의 이미지

현재 네트워크로 들어오는 패킷의 데이터 부분을 출력하는
커널 모듈을 작성하는 중입니다.
간단하게 패킷을 받아서, printk를 이용하여 console에
출력하는 모듈을 작성하기는 했습니다.
그런데.. 이것을 x윈도로 출력을 하려 하는데..
방법을 알 수가 없네요..

여러 방법을 사용해 보았습니다.
첫째로.. 새로운 char device를 작성하여, put_user 매크로로
응용 프로그램에서 출력을 해볼려 했으나..
insmod 하자마자 시스템 전체가 다운이 되더군요..

둘째로.. tty를 이용하려 했으나..
원하는 포맷으로 처리하기가 너무 힘들더군요..

혹시 간단한 방법 알고 계시는 분.. 좀 알려주세요..
부탁드립니다.

godmode2k의 이미지

아래의 게시물을 보시면 X-Windows 에서도 결과를 확인하실 수 있습니다.
기본적인것이기 때문에 parameter 로 들어오는 값에 대해서는 따로 만들어 주어야 합니다.

그럼,,,. 홧팅!

KLDPWiKi 개발자 코너 -> 5 분야별 커널 프로그래밍 -> Kernel Module Programming Guide (채병철)

http://doc.kldp.org/Translations/Kernel_Module_Programming_Guide

Quote:

제 9 장

printk의 대치

문서의 처음에서(제 1 장), X와 커널 모듈 프로그래밍을 혼합하여 작성하지 말라고 했
다. 커널 모듈을 작성하는 동안 이것은 확실히 지켜져야 하지만, 실제로는 모듈로 부
터의 메세지를 보내도록 tty(*1) 명령을 어느 곳에서든 사용하길 원할 것이다. 이것은
커널 모듈이 해제된 후에 오류를 인식하기 위해 중요하며, 이것은 그들의 모두에서 이
용될 수 있다. 여기의 방법이 현재 실행중인 tty의 포인터, 현재 태스크의 tty 구조체
를얻기 위해 현재 이용되는 것이다. 이제, tty에서 문자열을 쓰기 위해 이용하는 문자
열 쓰기 함수의 포인터를 찾기 위해 tty 구조체의 안을 들여다보게 된다.
각주1 *************************************************************************
Teletype, 원래는 유닉스 시스템의 통신에 이용되던 키보드--프린터의 조합기계, 오늘
날에는 유닉스 프로그램에서 이용되는 텍스트 스트림의 추상적 의미, 물리적 터미널,
X 화면 장치상의 xterm, 네트웍 상에 연결된 telnet, 기타 등등.
*******************************************************************************

<printk.c>
/* printk.c - 실행중인 tty에, X를 통해서든, telnet, 또는 다른 것, 텍스트를 출력
하기. */

/* Copyright (C) 1998 by Ori Pomerantz */

/* 필요한 헤더 파일들 */
/* 커널 모듈에서의 표준 헤더 */
#include <linux/kernel.h> /* 커널에 대한 작업을 한다 */
#include <linux/module.h> /* 특별히, 모듈에서 */

/* CONFIG_MODVERSIONS와 다루기 */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

/* 여기에서 필요한 헤더 */
#include <linux/sched.h> /* For current */
#include <linux/tty.h> /* tty 선언들을 위해 */

/* 현재 태스크에서 이용되는 적절한 tty에 문자열을 표시한다. */
void print_string(char *str)
{
struct tty_struct *my_tty;

/* 현재 태스크를 위한 tty */
my_tty = current->tty;

/* my_tty이 NULL이면, 프린트할 tty가 없다는 의미(예를 들어, 만약 데몬이라면).
이 경우에는, 아무 것도 할 수 없다. */
if (my_tty != NULL)
{
/*
my_tty->driver가 tty의 함수들의 구조체이며, 이들 중 하나(write)가 tty에 문
자열을 쓰는데 이용된다. 사용자 메모리 세그먼트, 커널 메모리 세그먼트, 모두에
서 문자열을 가져올 수 있다.

이 함수의 첫 번째 인자는, 보통 동일한 함수가 확실한 형태의 모든 tty를 위해서
이용되기 때문에, 쓰려는 tty이다. 두 번째 인자는 함수가 커널 메모리(0) 또는
사용자 메모리(0이 아닌 값)에서 문자열을 수신할 것인지를 정한다. 세 번째 인자
는 문자열의 포인터이며, 네 번째 인자는 문자열의 길이이다.
*/

(*(my_tty->driver).write)(
my_tty, /* tty 자신 */
0, /* 사용자 영역에서 문자열을 가져오지 않는다. */
str, /* 문자열 */
strlen(str)); /* 길이 */
/*
tty는 원래 ASCII 표준을 준수(통상적으로)하는 하드웨어 장치이다. ASCII에 의하
면, 새로운 줄로 이동하기 위해 두 문자가, CR & LF, 필요하다. 반면에, 유닉스에
서는 ASCII의 LF가 두 가지 목적에 이용된다 - CR을 이용할 수 없기에 \n을 이용
할 수 없고 LF의 후에 다음 줄이 칼럼의 오른쪽에 위치하게 된다.

이것이 유닉스와 윈도우에서 텍스트 파일이 다른 이유이다. CP/M에서 이것이 파생
되었으며, MS-DOS와 윈도우처럼, ASCII 표준은 엄격하게 준수되기에, 새로운 줄은
LF와 CR모두가 요구된다.
*/
(*(my_tty->driver).write)(my_tty, 0, "\015\012", 2);
}
}

/* 모듈의 초기화와 삭제 */
/* 모듈의 초기화 - /proc에 파일 등록 */
int init_module()
{
print_string("Module Inserted");
return 0;
}

/* 삭제 - /proc에서 파일 제거 */
void cleanup_module()
{
print_string("Module Removed");
}

raison799의 이미지

qodmode2k님.. 답변 감사합니다..

혹시.. character device driver를 작성하여 X 윈도우로의 출력이 가능한지??
혹, 가능하다면 방법이 무엇인지 좀 알려주시면 감사합니다.

열심히 하자.. 리눅스

정태영의 이미지

raison799 wrote:
qodmode2k님.. 답변 감사합니다..

혹시.. character device driver를 작성하여 X 윈도우로의 출력이 가능한지??
혹, 가능하다면 방법이 무엇인지 좀 알려주시면 감사합니다.

모니터를 하나 짜야되지 않을까요 ;)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

제가 보기에는 커널에서 시스템의 특정 파일(사용자지정 임의 파일)/공유메모리등으로 로깅(큐잉)하게 하고, 큐잉전략도 그때 그때 다르게 기술해야 할듯하며,
해당파일/큐)에서 읽어서 디스플레이 시키는 별개 프로세스로 가야될듯합니다.
당연하게도 커널이 제공하는 (데이터 양 >> 디스플레이 해야하는 양)의 관계로 예측되며, 커널->X의 시나리오는, 자칫 bottle-neck으로 인한 문제를 놓치기 쉬워보입니다. 그리고 위험한 접근으로 보이는 군요.

댓글 달기

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