System call에 관한 두가지 질문입니다.. ^^;

배상윤의 이미지

Application program과 Kernel Module간의 통신을 만들고자 합니다.
제가 알기로는 이러한 통신은 System Call 외에는 방법이 없는 걸로 아는데 혹 다른 방법이 있을까요? *^^*이부분이 제가 알고 싶은 첫번째 질문임돠..

꼭 System Call을 사용해야 한다면 두가지 방법을 생각하고 있습니다.
하나는 새로운 System Call을 만드는 방법이고,
또 하나는 기존의 System Call을 수정하는 방법입니다.

새로운 System Call을 만드는 방법의 경우에 커널 컴파일까지 해야 하기 때문에 부담이(배포 및 새로운 시스템에 설치시) 클거 같습니다. 그래서 기존의 System Call을 변경하는 방법을 생각중인데 혹 커널 시스템 콜중에 개발자가 임의로 변경해서 쓸수 있는 System Call이 있을 까요? *^^*그리고 이게 제가 알고 싶은 두번째 질문임돠..!

즉 모듈 개발에 있어 테스트 용으로 사용하는 System Call이 있는지가 궁금합니다.
여기에 덧붙이자면 커널 시스템 콜중에 'sys_ni_syscall'이라는 심볼을 쓰는 시스템 콜들이 존재하는데 대부분 구버전의 시스템 콜이나 예약된 시스템 콜이 연결되어 있는 것들입니다.

내용을 찾아보니 'sys_ni_syscall'이라는 심볼의 시스템 콜들은 같은 처리 함수로 이동을 하더군요..
예를 들면
extern asmlinkage long sys_ni_syscall(void);
int asmlinkage sys32_nfsservctl(int cmd, void *notused, void *notused2)
{
return sys_ni_syscall();
}
이런 식으로 시스템 콜이 설정이 된 상태에서 sys_ni_syscall() 함수로 전이하게 되는데 그 함수의 구현부를 보면
asmlinkage long sys_ni_syscall(void)
{
return -ENOSYS;
}
이렇게 되어 있거든요.. 일단 판단하기에 아직 사용하지 않거나 (예약 된 시스템 콜) 더이상 사용하지 않거나(구 버전의 시스템 콜) 하는 시스템 콜을 이런식으로 막아 놓았다고 보여지는 데 여기에 대해서 말씀을 해주셨으면.... 고맙겠습니다.

쓰다보니 하고자 하는 질문보다 덧붙이는 질문이 더 많아졌네요.. ^^;
고수님들의 답변 부탁 드리겠습니다.

namhw의 이미지

저도 잘은 모르지만,, 수업시간에 몇개 주어들은게 있어서 리플답니다.
사용자레벨에서 커널과 통신하기위해선 시스템콜외에도
proc을 이용하는 방법도 있습니다. proc이라는게 우리가 흔히 알고있는
/proc 을 말하는거고요.

http://linuxkernel.net/moduleprog/lkp/doc/v1.01/lkp.pdf

위의 문서 5장을 참고해보시면 좋을것 같습니다.

그리고 제 생각이지만 안쓰는 시스템콜을 그냥 수정해서 쓰는것도 문제는 없을듯 합니다.
만약 기존의 시스템 콜을 이용해서 추가적인 작업을 하신다면 시스템 콜을
wrap해서 쓰셔도 좋을것 같고요. 위의 문서 9장에 나오는 시스템콜
가로채기편을 봐도 좋을것 같습니다...

뭐,, 그 아래 질문들은 잘 모르겠습니다. 그럼 참고 되셨길.....

촌놈.

redrocki의 이미지

님아가 지금 시스템콜을 만드신다면 일단 리눅스 커널이라는 책이 있습니다. 그 책을 참조하시고요......직접 시스템콜을 만들어서 사용하시다면 커널의 함수에 님아가 하나 만들어서 넣어야 합니다. 이것은 상당한 어려움이 따릅니다. 시간도 많이 걸리기 때문에 이보다는 모듈을 만드시는것이 훨씬 더 빠르실것입니다. 혹이 현재 지금 리눅스에서 제공하는 시스템 콜을 다르게 고치고싶으면 유저단과 커널단에서 중간에서 시스템콜을 가로 채기를 할수가 있습니다. 후킹을 사용하시면 지금 존재하는 시스템콜을 우회로 만들수도 있습니다.........많은 도움이 되지 못되어서 지송^^

===========================

Make Beautiful 世上 ~~~ Cool Mind!!

===========================

raymundo의 이미지

redrocki wrote:

님아가 지금 시스템콜을 만드신다면...

님아가 하나 만들어서...

말도 많고 탈도 많은 "님아, ..." "님들아, ..." 까지는 들어봤습니다만
"님아가.." 는... :shock:

좋은 하루 되세요!

방준영의 이미지

배상윤 wrote:
Application program과 Kernel Module간의 통신을 만들고자 합니다.
제가 알기로는 이러한 통신은 System Call 외에는 방법이 없는 걸로 아는데 혹 다른 방법이 있을까요? *^^*이부분이 제가 알고 싶은 첫번째 질문임돠..

커널과 사용자가 통신하는 방법은 여러가지가 있지만 궁극적으로는 커널로 진입하지 않으면 안되기 때문에 시스템콜은 필수입니다.

Quote:
꼭 System Call을 사용해야 한다면 두가지 방법을 생각하고 있습니다.
하나는 새로운 System Call을 만드는 방법이고,
또 하나는 기존의 System Call을 수정하는 방법입니다.

새로운 System Call을 만드는 방법의 경우에 커널 컴파일까지 해야 하기 때문에 부담이(배포 및 새로운 시스템에 설치시) 클거 같습니다. 그래서 기존의 System Call을 변경하는 방법을 생각중인데 혹 커널 시스템 콜중에 개발자가 임의로 변경해서 쓸수 있는 System Call이 있을 까요? *^^*그리고 이게 제가 알고 싶은 두번째 질문임돠..!


기존의 시스템콜을 변경하더라도 커널 컴파일은 불가피합니다. 오히려 새로 만든다면 모듈로 분리해서 커널 컴파일을 피할 수 있을 텐데요. 그리고 개발자가 임의로 변경해서 쓸 수 있는 시스템콜은 없고, 시스템콜 엔트리 표중에서 뒤에 남는 부분을 쓰면 됩니다. 기존 것을 임의로 변경하는 것은 골치아픈 문제를 야기할 가능성이 매우 높으므로 하지 않으시는 것이 좋겠습니다.

Quote:
여기에 덧붙이자면 커널 시스템 콜중에 'sys_ni_syscall'이라는 심볼을 쓰는 시스템 콜들이 존재하는데 대부분 구버전의 시스템 콜이나 예약된 시스템 콜이 연결되어 있는 것들입니다.

내용을 찾아보니 'sys_ni_syscall'이라는 심볼의 시스템 콜들은 같은 처리 함수로 이동을 하더군요..
예를 들면
extern asmlinkage long sys_ni_syscall(void);
int asmlinkage sys32_nfsservctl(int cmd, void *notused, void *notused2)
{
return sys_ni_syscall();
}
이런 식으로 시스템 콜이 설정이 된 상태에서 sys_ni_syscall() 함수로 전이하게 되는데 그 함수의 구현부를 보면
asmlinkage long sys_ni_syscall(void)
{
return -ENOSYS;
}
이렇게 되어 있거든요.. 일단 판단하기에 아직 사용하지 않거나 (예약 된 시스템 콜) 더이상 사용하지 않거나(구 버전의 시스템 콜) 하는 시스템 콜을 이런식으로 막아 놓았다고 보여지는 데 여기에 대해서 말씀을 해주셨으면.... 고맙겠습니다.


맞습니다.
방준영의 이미지

namhw wrote:
저도 잘은 모르지만,, 수업시간에 몇개 주어들은게 있어서 리플답니다.
사용자레벨에서 커널과 통신하기위해선 시스템콜외에도
proc을 이용하는 방법도 있습니다. proc이라는게 우리가 흔히 알고있는
/proc 을 말하는거고요.

http://linuxkernel.net/moduleprog/lkp/doc/v1.01/lkp.pdf

위의 문서 5장을 참고해보시면 좋을것 같습니다.


/proc은 커널의 상태를 보여주기 위한 가상 파일 시스템이기 때문에 통신용으로 사용하는 것은 (현재로선) 불가능합니다. /proc내 각각의 디렉토리와 파일들을 이벤트 통지용 포트 개념으로 만드는 것도 생각해 볼 수 있겠지만, 호환성 문제라든지 락킹 문제, 성능 등의 측면에서 실질적으로 장점이 없을 듯 하군요.

Quote:
그리고 제 생각이지만 안쓰는 시스템콜을 그냥 수정해서 쓰는것도 문제는 없을듯 합니다.
만약 기존의 시스템 콜을 이용해서 추가적인 작업을 하신다면 시스템 콜을
wrap해서 쓰셔도 좋을것 같고요. 위의 문서 9장에 나오는 시스템콜
가로채기편을 봐도 좋을것 같습니다...

시스템콜 표에 보면 비어있는 엔트리가 아주 많은데 그걸 안쓰고 일부러 예약해 둔 엔트리를 용도 변경해서 쓰는 것은 바람직하지 않습니다.
chunsj의 이미지

/proc을 써서 하는 것이 가능하지 않은가요? 저는 가능한 걸로 알고 있습니다.
게다가 그걸 이용하는 프로그램을 만들기도 했고요. 성능의 문제에 대해서는
잘 모르겠습니다. 별로 그게 중요한 것은 아니고 편의성 때문에 한 것이라...
어차피 파일로 보면 되기때문에 편리하기는 합니다.

쓰다 보니 "이벤트"라는 말이 보이네요. 제가 한 방식은 커널쪽에서 /proc/aaa
같은 "파일"의 변화를 기다리다가 변화가 있으면 그 내용에 따라서 다른
작업을 수행하도록(실제로는 다른 유저 레벨의 프로그램을 불렀습니다, 이렇게
할 필요가 없는 일이지만, 재미로!!!) 했습니다. 이게 "통신" 아닐까요?

방준영 wrote:
namhw wrote:
저도 잘은 모르지만,, 수업시간에 몇개 주어들은게 있어서 리플답니다.
사용자레벨에서 커널과 통신하기위해선 시스템콜외에도
proc을 이용하는 방법도 있습니다. proc이라는게 우리가 흔히 알고있는
/proc 을 말하는거고요.

http://linuxkernel.net/moduleprog/lkp/doc/v1.01/lkp.pdf

위의 문서 5장을 참고해보시면 좋을것 같습니다.


/proc은 커널의 상태를 보여주기 위한 가상 파일 시스템이기 때문에 통신용으로 사용하는 것은 (현재로선) 불가능합니다. /proc내 각각의 디렉토리와 파일들을 이벤트 통지용 포트 개념으로 만드는 것도 생각해 볼 수 있겠지만, 호환성 문제라든지 락킹 문제, 성능 등의 측면에서 실질적으로 장점이 없을 듯 하군요.
방준영의 이미지

chunsj wrote:
/proc을 써서 하는 것이 가능하지 않은가요? 저는 가능한 걸로 알고 있습니다.
게다가 그걸 이용하는 프로그램을 만들기도 했고요. 성능의 문제에 대해서는
잘 모르겠습니다. 별로 그게 중요한 것은 아니고 편의성 때문에 한 것이라...
어차피 파일로 보면 되기때문에 편리하기는 합니다.

예, 기술적으로는 가능하지만 사실은 launch_process(flags)처럼 시스템콜을 한번 호출하는 것이 파일을 열고, 파일을 읽고, 파일에 써서 이벤트를 발생시키는 것보다 한층 빠르고 편리하지요. 8)
mushim의 이미지

정확힌 어떤 커널모듈인지는 모르지만, system call 을 쓰는것 보다는 커널모듈을 디바이스 드라이버형태로 제작하시는 것이 좋을 것 같습니다.

신규 system call 인 경우 현재 커널을 재컴파일해야 하는등 배포시에 어려움이 따를 것 같습니다. 물론, 아주 빠른 성능을 요구한다면 단일 system call 하나로 해결해야 겠지만, 그런 경우는 흔하지는 않더라구요.

댓글 달기

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