커널 영역과 사용자 영역 사이에 통신할 수 있는 방법이 있나요?

kiwist의 이미지

안녕하세요, kldp가 리뉴얼되고 잘 와보질 못했는데, 많이 변했군요...

다름이 아니고, 리눅스 커널 영역과 사용자 영역 사이에 통신할 수 있는 방법에 관해 궁금해서 그러는데요, 원칙적으로 주소 공간이 분리되어 있어서 설 침범 하지 못하는 건가요? 찾아본 바로는 get_fs(), set_fs()라는 함수들을 가지고 주소 서로의 주소영역에 접근하는 방법이 있는 것 같은데, 좀더 편리한 방법이 있으면 가르쳐 주십사하고 글을 올립니다. 커널과 사용자 프로세스간에 문자열이나, 패킷을 바로 주고 받을 수 있는 방법이라던지.. ^^;;; 고수님들의 답변 부탁드립니다. :(

코퍼스의 이미지

결국 사용자가 만든 프로세스가 커널과 어떤 데이터를 주고 받아야 된다는 겁니까?

그것도 아주 특수한 정보를요? 예를 들어, 새로운 디바이스 드라이버를 포팅했다던가 그런 일인가요?

무난한 답이라면, 결국 ioctl을 조금 손봐서 해야 될 일 같은데요.^^

A few Good Man

kiwist의 이미지

올려주신 답변 감사합니다.
정확히는 파일시스템관련인데요, ^^;
사용자 프로세스에서 파일관련 시스템 콜을 호출할때, VFS에서 받아서 시스템 콜 테이블을 참조해서 해당 파일시스템에 맞는 파일 오퍼레이션을 호출하는 것으로 알고 있습니다. 그런데, 여기서 해당 파일시스템의 파일 오퍼레이션을 수행하지 않고, 사용자 프로세스의 다른 함수를 호출할 필요가 있어서 그럽니다. ^^;

seoleda의 이미지

http://kldp.org/Translations/Kernel_Module_Programming_Guid

7. 시스템 호출 이부분이 도움이 될거 같습니다. ^^

송지석의 이미지

그 링크는 페이지가 없다고 나오네요.

음 copy_from_user 함수가 있습니다.

커널 모듈에서 copy_from_user하면 유저모드에서 데이터를 복사해오고요

copy_to_user 하면 유저모드로 복사해줍니다.

모듈을 짜신 다음에 read나 ioctl같은 모듈 루틴 내부에서 위 함수들을 호출해주면 되겠지요.

=============
글 수정이요
위 링크에 e가 빠져서 안되는 거였네요.
http://kldp.org/Translations/Kernel_Module_Programming_Guide
입니다.

권순선의 이미지

그렇다면 그것은 유저영역의 데이터를 복사해 오는 것 같고요.

커널에서 유저영역의 함수를 수행하는 방법은 혹시 있나요? 예를 들면 어떤 파일에 대해 삭제 명령이 내려질 경우 실제 하위 계층의 파일시스템 계층을 거쳐 블럭단위까지 내려가서 필요한 작업이 이루어질 텐데 블럭단위의 계층에서 어떤 조건에 대해 유저 영역의 함수나 프로그램을 수행하게 하고 그 리턴값에 따라서 다음 동작을 결정하는 것이지요.

아주 억지로 짜낸 예가 되겠습니다만, 아무튼 커널에서 유저영역의 함수를 호출하는 방법이나 특정 명령을 수행하고 그 리턴값을(만약 있다면) 받아오는 방법이 있는지요? 글을 읽다보니 갑자기 궁금해지는군요. 8)

송지석의 이미지

유저영역의 함수 호출이라면 c라이브러리 함수 같은 것을 말씀하시는 것인가요?

c라이브러리 같은 함수라면 꼼수로 쓸 수도 있지 않을까요? 음.. 안되나..

Quote:
사용자 프로세스에서 파일관련 시스템 콜을 호출할때, VFS에서 받아서 시스템 콜 테이블을 참조해서 해당 파일시스템에 맞는 파일 오퍼레이션을 호출하는 것으로 알고 있습니다. 그런데, 여기서 해당 파일시스템의 파일 오퍼레이션을 수행하지 않고, 사용자 프로세스의 다른 함수를 호출할 필요가 있어서 그럽니다. ^^;

이 내용으로 봐서는 함수를 직접 호출한다기 보다는 뭔가 시그널이나 파이프로 이벤트를 전달하는 식으로 구현할 수 있다면 그나마 실현 가능성이 있을 수도 있겠지만...
유저 함수를 직접 호출한다는 것은 거의 해킹 수준이 아닐까 합니다..
권순선님은 훨씬 실력이 좋으신데 뭔가 가르침을 듣고 싶네요.
(순선님이 쓰신 책, 저도 가지고 있답니다. ;) 프로그래밍을 위해 샀는데 보니까 커널이 자세히 나와있더군요)
권순선의 이미지

뭐...그렇지요. 특정 C 라이브러리 함수가 될수도 있겠고, 예를 들면 /usr/bin 의 어떤 명령어가 될수도 있겠고 아니면 대충 만든 쉘스크립트가 될수도 있겠고요....

댓글 달기

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