커널모드 프로세스 독립성? 에 대한 질문입니다.

sangpil의 이미지

안녕하세요 현재 회사에서 리눅스 커널모듈 개발 프로젝트를 진행하고 있습니다.

진행 중에, 다음 요구사항을 만족시켜야 하는데요.

해당 모듈을 수행하는 프로세스 외에 타 프로세스에 의해서 간섭이 발생하지 않아야 한다.

여기서 말하는 간섭방지에 대한 예시는, 만약 모듈이 shared library이고 이를 사용하는 프로세스가 어플리케이션 프로그램 일 경우에 대해서 들어져 있습니다.

어플리케이션 레벨에서 동작하는 어플리케이션들이 서로 고유한 메모리 영역을 가지고 있어, A프로세스에서 B프로세스의 주소 영역을 참조하거나 값을 변경할 경우, 커널레벨에서 이를 잘못된 참조로 가정하고 프로세스를 종료시키기 때문에 이러한 잘못된 참조가 방지된다 (약간 다를 수 있으나 이러한 논지로 되어있습니다.)

그런데 커널 모드에서 동작하는 모듈이고 사용 주체가 커널 프로세스인 경우에는 이러한 독립성을 어떻게 보장할 수 있을까요??

제가 알기로는 커널 모드에서는 메모리에 대한 권한이 모두 동일하여 mprotect()과 같은 함수와 같이 메모리를 보호하는 함수는 없는 것으로 알고 있습니다.
(참고 http://security.stackexchange.com/questions/38384/mprotect-at-kernel-level)
따라서 모듈 내부적으로 추가구현을 해서 논리적으로 분리시켜야 할 것 같은데 해당 부분에 대한 구현은 어떤식으로 하면 좋을까요??

긴글 읽어주셔서 감사합니다~!!
참고로 커널모듈은 EXPORT_SYMBOL 키워드를 이용하여 심볼테이블에 함수를 등록시키면 다른 커널모듈에서 이를 참조하여 사용하는 방식으로 동작합니다.

본 글은 이슈 게시판에도 올려 두었습니다~!

furmuwon의 이미지

int owner_tid;

....open()
if (!owner_tid)
owner_tid = 현재 프로세스 tid; 혹은 pid
else
return -EBUSY;

이렇게 하면 그 모듈은 한개의 프로세스만 사용하고
나머지 놈들은 사용 못하게 구현하면 되지 않을까요?

익명 사용자의 이미지

네 그렇게 구현을 할 수 있다면 될 것 같습니다만, 조금 문제가 있습니다.

본문에 제대로 명시되어 있지 않은데요
현재 모듈의 인터페이스가 EXPORT_SYMBOL 을 이용하여 API를 전역 참조시키고,
이를 사용하는 커널 프로세스(모듈)에서 해당 함수를 extern 하여 사용하도록 되어 있습니다.

이 경우에 커널 프로세스의 tid 혹은 pid를 알 수 있는 방법이 있을까요??

인터넷 검색이 부족한 건지 해당 방법을 찾을 수 없었습니다..

furmuwon의 이미지

current->tgid;
current->gid;

다른 모듈에서 사용할 수 있도록 EXPORT_SYMBOL 시킨다는 것은
그 개발하는 EXPORT 된 함수를 호출하는 경로를 통해서
여러 프로세스에서 접근 할 수 있을 것입니다.

프로세스라는 의미가 들어가는 것으로 보아서
유저스페이스에서 어떠한 액션이 올 것이라 생각 되는데요.

저는 단순히 액션이 오직 한 프로세서만 가능하도록하면 되는 것 아닐까 쉽게 생각합니다..

위에서 말씀 하신 커널 프로세스 = 모듈 은 아니라고 생각 되어지네요

모듈에서 커널 쓰레드를 사용한다는 말이신지?
아니면 다른 커널 쓰레드에서 EXPORT 된 함수를 호출 하게 된다는 건지요?

구현하시는 모듈의 복잡성을 모르겠습니다만,
단순한 구조로 가는 것도 어떠신지요 ㅎㅎ

익명 사용자의 이미지

네, 말씀해 주신 부분에서 커널 프로세스 = 모듈이 맞습니다.

다른 제 3의 모듈에서 커널 쓰레드 등을 이용하여 API를 호출하여 사용할 예정었습니다.

이런 경우에는 해당 요구사항을 충족시키기는 어려울 까요??

댓글 달기

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