시스템 콜 안에서 다시 시스템 콜 할 수 없나요?

quintus의 이미지

모듈로 시스템 콜을 만들었는데

그 안에서 sys_open() , sys_write() 같은거 call 할 수 없나요?

filp_open 하고 open_namei() 같은 함수를 사용하려니, 파라미터로
넘겨줄것들이 좀 막막해서요.

제 생각엔 어차피 커널내에서 구현된 함수들이니 가져다 써도 될거 같은데..안되네요

sys_newsyscall()
{

 ...............
 sys_open();
 sys_write();

 ...............

}

이렇게 하면 컴파일은 되는데, insmod 에서 unresolved symbol 이라고 나오네요..

hb_kim의 이미지

그냥 파일 액세스를 쓰지 않고 해보세요. 초보분들이 커널/드라이버 프로그래밍 시작하면서 꼭 파일 액세스를 해보려고 시도하시는데 별로 좋은 습관이 아닙니다. 새로운 시스템 콜을 추가해서 원하는 기능을 만들려고 하는것도 사실은 절대 피해야 할 방법이죠. (학교숙제로 낼것이 아니라는 가정하에서)

자신의 모듈에 상관이 있는 스택내의 모듈 레이어에 관련된 정보면 해당 모듈에서 export 시키면 되고, 자신의 모듈과 직접적 연관이 없는 모듈의 정보면 알아서도 안되고 알 필요도 없습니다.

feelpassion의 이미지

쓸 수 있습니다.
다른 것이 잘못된 거 같네요.
그러나 위의 고수님 의견을 따르는 것이 나을 것 같습니다.

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

charsyam의 이미지

hb_kim wrote:
그냥 파일 액세스를 쓰지 않고 해보세요. 초보분들이 커널/드라이버 프로그래밍 시작하면서 꼭 파일 액세스를 해보려고 시도하시는데 별로 좋은 습관이 아닙니다. 새로운 시스템 콜을 추가해서 원하는 기능을 만들려고 하는것도 사실은 절대 피해야 할 방법이죠. (학교숙제로 낼것이 아니라는 가정하에서)

자신의 모듈에 상관이 있는 스택내의 모듈 레이어에 관련된 정보면 해당 모듈에서 export 시키면 되고, 자신의 모듈과 직접적 연관이 없는 모듈의 정보면 알아서도 안되고 알 필요도 없습니다.

제 생각에도 써질것 같은데요 ^^ 쿨럭, 그래도 처음할 때 생각나는건 -_-
파일 액세스쪽이 젤 쉽게 떠오른다는 ^^ 모듈에서 로그 남길때도 그렇고
우, 삽질하던 기억이 -_- T.T 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

pastime의 이미지

파일에 대한 연산이 필요하시다면
이호님의 홈페이지에 있는 klib 를 가져다 써보심이 어떨지요..

http://linuxkernel.net/linux/moduleprog/klib/

kslee80의 이미지

아마도 sys_write() 가 Unresolved symbol 일 겁니다.
sys_* 계열 함수들중에는 export 되어있지 않는 녀석들도 존재하기 때문이죠.

그렇긴 하지만...
sys_* 계열 함수들을 커널 내부에서 호출해서 사용하는 경우에
정상적인 동작을 보장할 수 없습니다.
sys_* 계열 함수들은 유저레벨에서 시스템 콜을 통해 호출되는 것을 가정하고
작성되기 때문이죠.

넘겨주는 인자들 때문에 한숨이 나온다면,
sys_* 계열 함수들이 구현되어 있는것을 보고 흉내내서 호출하면 됩니다.

quintus의 이미지

hb_kim wrote:
그냥 파일 액세스를 쓰지 않고 해보세요. 초보분들이 커널/드라이버 프로그래밍 시작하면서 꼭 파일 액세스를 해보려고 시도하시는데 별로 좋은 습관이 아닙니다. 새로운 시스템 콜을 추가해서 원하는 기능을 만들려고 하는것도 사실은 절대 피해야 할 방법이죠. (학교숙제로 낼것이 아니라는 가정하에서)

자신의 모듈에 상관이 있는 스택내의 모듈 레이어에 관련된 정보면 해당 모듈에서 export 시키면 되고, 자신의 모듈과 직접적 연관이 없는 모듈의 정보면 알아서도 안되고 알 필요도 없습니다.

학교 숙제하는거구요, 커널/드라이버 프로그래밍 처음하는것도 맞습니다 (족집게시군요 --; )

근데 위에 파일액세스를 쓰지 않고 해보란게 무슨 얘기인지..잘 모르겠는데,
다시 설명 부탁드립니다.
(파일 액세스 하려면 user application에서 시스템 콜로 파일 액세스 하란 얘긴가요?)
export 시키라는것도 무슨 소린지..

filp_open, namei() 함수에서 파라미터 내용들을 잘 이해 못해서,
(혹시 man page 가 있나요? 아님 제가 볼만한 커널 함수 api 라도..)
sys_open() 으로 파일 접근하려고 한거거든요.

근데, 모듈로 시스템 콜 추가하고 그 new_syscall() 안에서 sys_open(), sys_read() 같은걸 쓰면 insmod 가 안 되구요. 그거 빼고 하면 insmod 됩니다.

hb_kim의 이미지

너무 많은 분들이 소프트웨어를 자전거 타듯이 배우려고 하는것 같습니다. 소프트웨어는 서예를 배우듯이 배우는 것이 좋다고 봅니다. 그냥 어떻게든 앞으로 가려고 넘어지고 깨지고 하면서 배우게 되는것 보다는, 이미 있는 좋은 작품을 충분히 보고 느끼면서 비슷하게 따라하는 수순으로 배우는게 더 좋다는 말입니다.

namo98 wrote:
hb_kim wrote:
그냥 파일 액세스를 쓰지 않고 해보세요. 초보분들이 커널/드라이버 프로그래밍 시작하면서 꼭 파일 액세스를 해보려고 시도하시는데 별로 좋은 습관이 아닙니다. 새로운 시스템 콜을 추가해서 원하는 기능을 만들려고 하는것도 사실은 절대 피해야 할 방법이죠. (학교숙제로 낼것이 아니라는 가정하에서)

자신의 모듈에 상관이 있는 스택내의 모듈 레이어에 관련된 정보면 해당 모듈에서 export 시키면 되고, 자신의 모듈과 직접적 연관이 없는 모듈의 정보면 알아서도 안되고 알 필요도 없습니다.

학교 숙제하는거구요, 커널/드라이버 프로그래밍 처음하는것도 맞습니다 (족집게시군요 --; )

근데 위에 파일액세스를 쓰지 않고 해보란게 무슨 얘기인지..잘 모르겠는데,
다시 설명 부탁드립니다.
(파일 액세스 하려면 user application에서 시스템 콜로 파일 액세스 하란 얘긴가요?)
export 시키라는것도 무슨 소린지..

filp_open, namei() 함수에서 파라미터 내용들을 잘 이해 못해서,
(혹시 man page 가 있나요? 아님 제가 볼만한 커널 함수 api 라도..)
sys_open() 으로 파일 접근하려고 한거거든요.

근데, 모듈로 시스템 콜 추가하고 그 new_syscall() 안에서 sys_open(), sys_read() 같은걸 쓰면 insmod 가 안 되구요. 그거 빼고 하면 insmod 됩니다.

아무리 학교 숙제라 하더라도, 모듈내에서 파일을 액세스하라는 요구사항은 없었을것으로 추측되네요.

보통 모듈/드라이버의 목적은 사용자를 위해 뭔가 유용한 일을 하려는것이 아니고, 디바이스에 대한 기본적인 파일 액세스 mechanism 을 제공해주는것입니다. 이런 모듈/드라이버에서 파일 액세스를 한다는것은 전체적인 균형에도 어긋나고 보기에도 안좋습니다. 이런 드라이버가 일반적으로 쓰인다면 시스템 보안/안정성등에 문제가 될 가능성도 있겠죠. 따라서 거의 모든 기존의 모듈/드라이버들은 파일 액세스 기능을 안씁니다.

시스템 콜도 마찬가지입니다. 시스템 콜 추가하려면 전체 커널을 수정하는 셈인데 그러면 모듈 프로그래밍의 의미가 없어지겠죠. 모듈은 로딩되면서 파일 인터페이스나 hook 을 제공해야하고, 해당 디바이스에 대해서 Read/Write 가 아닌 뭔가 특수한 기능을 제공하기 위해서는 IOCTL 을 이용해야죠.

이것은 모듈/드라이버 뿐만 아니라 일반론인데, 연결되는 다른 component 에게 너저분한 자기 자신의 내부정보는 될수 있으면 숨기고 깔끔한 인터페이스만을 제공하면 좋겠죠. 이때 인터페이스를 제공하기 위해서 필요한 심볼은 EXPORT_SYMBOL( ) 을 써서 다른 커널 component 에 알려줍니다.

사실 여러가지 주절주절 늘어놓았지만, 다 쓸데없는 이야기입니다. 자기가 만줄 짜리 드라이버 코드를 직접 작성하려고 한다면, 커널에 포함된 기존 코드 10만줄만 읽어보면 됩니다. 그러면 어떻게 해야할지 다 알게 되니까요.

댓글 달기

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