[완료]모듈 프로그램에 관한 질문입니다.

kwonsu의 이미지

안녕하십니까.

모듈프로그램에 대한 개념이 좀 없어서 이렇게 질문드립니다.
여러 고수님들의 도움 부탁드립니다.

1. 모듈프로그램을 하나 만들려고 하는데 kernel space 와 user space 간 통신을 하는 모듈프로그램을 만들려고 합니다. 찾아보니 다양한 방법들이 있는데 netlink로 해볼까 하는데 커널 버전마다 조금 달라 보여서 어떤 방식으로 하는것이 효과적인지 모르겠습니다. 제가 사용하고자 하는 커널버전은 2.6.22.19 입니다.

2. 응용프로그램에서 사용하는 쓰레드나 포크 방식처럼 하고자 하는 기능을 따로따로 동작하도록 하는 방식이 모듈프로그래밍을 할때도 할수 있는지 궁금합니다. 있다면 어떤 방식으로 하는지 링크나 기타 문서가 있으시다면 부탁드립니다.

끝까지 읽어주셔서 감사합니다. 여러 고수님들의 현답 부탁드립니다.
그럼 수고하십시요.

poplinux의 이미지

1. netlink 는 잘 모르겠고.. 처음 해 보시는 거라면 read, write call 을 구현해서 하는 방법부터 해 보시고 더 나은 방법을 찾는 것이 좋을 듯 합니다.

2. 커널 쓰레드가 있습니다.

문서는 "리눅스 커널의 이해" 라는 책이 있습니다.

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

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

kwonsu의 이미지

먼저 친절한 답변 감사드립니다 ^^

한가지 더 질문 드립니다.

질문이 말이 안되는것 같은 생각이 들지만 cpu가 하나 있을 경우 작업 1은 무한루프를 돌면서 특정작업을 하고 작업 2는 응용프로그램간 통신을 하게 한다면 방법이 있을지 여쭙니다.

감사합니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

drinkme의 이미지

제가 궁금한 것은 그런작업을 왜 커널모드에서 할려고 하시는지 잘 모르겠습니다.
그런 상황이라면, user mode에서 하고 필요한 것만 kernel mode로 호출하는 것이 좋지 않을까요?

물론, 말씀하시는 것이 방법이 있습니다.
윗분이 말씀하시는 것처럼
kernel thread를 생성해서 작업1시키고, read()/write() 통해서 통신하면 됩니다.

kwonsu의 이미지

우선 제가 할 목적은 kernel space에서 후킹작업을 하고 user space에서 로깅처리등의 작업을 할 계획이였습니다.
그래서 kernel 모듈에 kernel space와 user space 간 통신만 하는 부분, 그리고 후킹하는 부분 이렇게 두 부분을 나눌려고 했던 거죠.

그래서 생각한것이 처음에 netlink로 통신하는 방법이였는데 이건 커널별로 좀 다르고 시간이 많이 걸릴것 같아 보류하고 proc나 udp소캣을 이용한 통신을 생각했습니다.
응용프로그램으로 치면 스레드 두개를 생성하고 하나는 클라이언트 통신, 하나는 시스템 감시 뭐 이런 식으로 하면서 한쪽 스레드의 결과값에 따라 상대 스레드를 lock/unlock 하는 것처럼 말이죠.
방법이 안좋나요? ^^; 더 좋은 방법이 있으면 알려주십시요. ^^
방향을 잡기위한 참고용으로 kernel thread 생성 하고 read/write하는 예제 소스나 참고할 사이트를
알려주시기를 부탁드립니다.
감사합니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

kwonsu의 이미지

제가 할려고 했던거는 결국 kernel module과 user program간 통신이였습니다.
이 통신을 이용하여 kernel module에서 생성된 로그정보를 user program에 넘기는 거였습니다.
테스트는 다음과 같은 방법으로 했습니다.

1. netlink
2. user program에서 읽을 수 있도록 파일에 저장
3. kernel module <--> user program 간 소켓통신 ( netlink와는 별개 )

1번 netlink방법은 kernel module에서 보내는 방법이 검색을 해도 마땅한 예제소스를 발견하지
못했습니다. 발견했던 것들을 전부 테스트 해봤으나 동작이 원할하지 않았으며 커널 소스 디렉토리에 있는
netlink 관련 소스, 그리고 route관련 소스등을 보았으나 시간이 허락하지 않아 일단 패스했습니다.
참고로 user program에서 보낸 패킷정보를 이용하여 kernel module에서 다시 보내는 방식을 취하는듯 하였습니다.

2번 방법은 좀 아닌듯 싶지만 일단 해보기로 했으나 결과는 아니였습니다.

3번 방식으로 선택하여 대신 user program에서 서버로 띄우고 kernel module에서 접속하여 로그를 보내는 형식으로 하였습니다.

일단 3번으로 테스트 중이며 원할한 동작이 되는지 지켜보고 있습니다.

저와 같은 생각을 하셨거나 고민하신 분들에게 아주 조금이나마 도움이 됬으면 합니다. ^^;

이 글에 답변 주신 분들에게 다시한번 감사의 말씀 드립니다.
감사합니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

댓글 달기

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