커널 소스에 시스템콜 추가 하는 방법?

ysscuba의 이미지

리눅스 커널 2.4.25 버전에 시스템콜을 하나 추가 하려고 합니다.

커널 소스를 건드려 본적이 없어서 공부하는 중인데요... ^^;;

지금 제 짧은 생각으로는 그냥 gettimeofday() 와 같은 시스템콜이 어떻게 짜여져 있나 분석해 보고 비슷하게 하나 추가 하려고 하는데요...

제가 궁금한건...

이런 경우 제가 커널의 어떤 임의의 파일 XXX.c 를 수정 하였다고 할때...

전체 커널을 다시 컴파일 (make...) 하고 이미지 올려 주고 해야 하는 건가요?

당연히 그래야 겠죠? ^^;;

아니면 전체 컴파일 안하고 수정된 커널을 사용하는 방법이 있나요?

jyj9782의 이미지

커널을 컴파일해야합니다.
매번 make clean 해서 컴파일한 파일들을 클린시켜버리면.. 속도 엄청 걸리죠.. 그러지말고 수정하고 make bzImage 바로 하셔서 교체해주시면됩니다. 시스템콜은 콜테이블이랑 그런게 정해져 있는 파일이 시스템부팅부이기 때문에, 컴파일을 다시해주어야합니다.

힘내세요.

sajacall82의 이미지

헐.. kldp 첨 써보는데 이거원 모가몬지 모르겠네요...
위에 주제는 몰 쓰는건지.... -_-

암튼 윗분이 말씀하셨듯이 커널 수정해서 컴파일 다시 해주어야 됩니다.

하지만 컴파일만 해서는 작동 안될거구요..

user모드에서 컴파일 전에 unistd.h 헤더파일 옮겨주셔야 되요.(당연한건가요. -_- 전 이것땜에 커널 10번도 넘게 컴파일 했습니다.)

시스템콜 내부 동작원리는 웹 상에도 많지만 커널의 이해 책에 잘 나와있습니다.

웹상의 문서보다 좀 더 내부적으로 들어가서 에러 검출 방법이나 매개변수 받는 방법에 대한 설명이 추가적으로 있습니다.

순간을 지배하는 사람이 인생을 지배한다.

ysscuba의 이미지

>> user모드에서 컴파일 전에 unistd.h 헤더파일 옮겨주셔야 되요.(당연한건가요. -_- 전 이것땜에 커널 10번도 넘게 컴파일 했습니다.)

어디로 옮겨주셔야 되는지요? ^^;;
/usr/include 정도로 옮기면 되는건가요?

>> 웹상의 문서보다 좀 더 내부적으로 들어가서 에러 검출 방법이나 매개변수 받는 방법에 대한 설명이 추가적으로 있습니다.

커널의 이해책 샀습니다.
시스템콜 chapter를 읽었더랬죠...

그리고... 위에 말씀하신 에러검출이랑 매개변수 부분은...
The Part that I didn't understand in the book YET -.-;;

거의 다 왔는가라고 생각했었는데...
아직 가야 할 길이... -.-

sihwp의 이미지

:?:

시스템 콜들을 저장하고 관리하는 부분을 구현한 파일의 이름이 무엇인가요?

처음 공부해봐서리 system_call() 에서 직접 시스템 콜을 호출하는 것까지는

알아냈는데 system_call을 구현한 파일만도 여러개던데 어떻게 딱 내가 원하

는 파일인 알수가 있을까요?

________________________

이제는 커널이다.....
________________________

quintus의 이미지

학교 숙제 하고 있죠.?^^
교학사에서 나온 그 책 읽어보면 원하는 내용 잘 나와있습니다.

sajacall82의 이미지

/usr/include/asm

순간을 지배하는 사람이 인생을 지배한다.

revizes의 이미지

http//user.chollian.net/~jackcom/study/linux/linux_kernel.htm
여길 찬찬히 읽어보시길....

다 덤벼! 다 받아줄께!!

ysscuba의 이미지

위의 알려 주신 사이트가 정말 도움이 많이 되었습니다.

그런데... 사이트에서 설명해 주는 테스트 프로그램을 실행 하려고 하는데요...

Hello World를 시스템콜을 이용해서 printk 하는 프로그램인데요...

가르쳐 주는 대로 먼저...

1. include/asm-i386/unistd.h 에서 2.4.25 커널의 마지막이 252번으로 잡혀 있더군요. 그래서 #define __NR_newsyscall 253 으로 추가를 하고...

2. arch/i386/kernel/entry.S 에서 253번째에 맞춰서
.long SYMBOL_NAME(sys_newsyscall) 을 추가 해 주었습니다.

3. kernel/ 디렉토리에 아래와 같이 newfile.c를 만들고...
makefile에 추가 해 주었습니다.

#include <linux/unistd.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/sched.h>
                                                                                
asmlinkage int sys_newsyscall(void)
{
        printk("Hello\n");
        return(0);
}

4. 이제 커널을 다시 make bzImage 해서 컴파일 해 주고... 컴파일 된 커널을 이용하여 리부팅 하였습니다. 이 부분 까지는 잘 됩니다. 컴파일도 에러 없이 잘 됩니다.

5. 문제는 사용자레벨 응용프로그램을 아래와 같이 test.c 로 만들고

#include <linux/unistd.h>
_syscall0(int, newsyscall);
                                                                                
main()
{
        int i;
        i = newsyscall();
}

gcc 로 컴파일을 하면 아래와 같은 에러가 발생 합니다.

[root@localhost test]# gcc test.c
test.c: In function `newsyscall':
test.c:2: `__NR_newsyscall' undeclared (first use in this function)
test.c:2: (Each undeclared identifier is reported only once
test.c:2: for each function it appears in.)

분명 __NR_newsyscall 을 찾는걸 보면 커널은 제대로 컴파일 되었다는것 같은데...

혹시 gcc 로 컴파일 할때 무슨 옵션을 주어야 하는 건가요?

위의 test.c 파일이 왜 컴파일이 안 되는 걸까요?

주말 내내 삽질 하다 여쭤 봅니다. ㅜ.ㅜ

방금 혹시나 해서 gcc -I /usr/src/linux/include test.c 으로 컴파일 해 보았습니다.

결과는 역시... -.-

[root@localhost test]# gcc -I /usr/src/linux/include test.c
/tmp/ccdKf7pJ.o(.text+0x1c): In function `newsyscall':
: undefined reference to `errno'
collect2: ld returned 1 exit status

lab700의 이미지

아무리 책이나 웹을 검색해봐도 답변이 없네요...

(이 문제가 발생한 경우는 저와 여기 글올리신 분을 포함해서 3번 보았습니다...역시 답변은 없구요...ㅜ.ㅜ)

이게...시스템콜 추가시의 문제라기 보다는 무언가 다른게 있는것 같은데.. 그것이 뭔지 모르겠군요...흠...

lab700의 이미지

어플리케이션 소스에

#include <errno.h> 라는 헤더를 인클루드하면 되는거였네요..ㅎㅎ

ysscuba의 이미지

진짜루여?

아침에 일어나자 마자 KLDP로 들어오게 되는군요 -.-;;

어제 올린 질문에 대한 답변이 있는지 들어와 봤는데...

혹시 진짜 errno.h 만 더해 주면 되는 거라면 진짜... -.-;;

빨랑 테스트 해 봐야 겠습니다. ^^

ysscuba의 이미지

컴파일 잘 되고... 실행도 잘 되내요... ^^

그런데 질문에 있습니다.

사용자 응용 프로그램에서

#include <linux/unistd.h> 하면 안되고...

#include </usr/src/linux/include/asm-i386/unistd.h> 로 하던가

컴파일 할때 gcc -I /usr/src/linux/include test.c 로 해 줘야 하는데...

이거 환경 설정에서 어떻게 하면 그냥 #include <linux/unistd.h> 로 해도 컴파일이 잘 될수 있지 않나요?

gcc 환경 설정 중에 있는 건지... 아니면 PATH 설정을 해 줘야 하는 건지...

소스 코드에 절대 경로로 작성 하지 않고... gcc -I 하지 않고
#include <linux/unistd.h> 할 수 있는 방법을 알고 싶습니다.

#include <errno.h> 는 #include </usr/include/errno.h> 라고 안 해 줘도 잘 되잖아요... ^^

sihwp의 이미지

저두 숙제하느라 열심히 커널 컴파일하구 드라이버들 깔구

주말내내 끙끙대다가 지금 하나씩 해보구 있습니다.

그런데 문제의 unistd.h를 우리가 바꿨기 때문 아닐까요

즉 errno.h는 고친 것이 없으므로 시스템이 깔려 있는 라이브러리를 써도

되겟지만 unistd는 바뀐 내용이 있기때문에 직접 시스템의 lib디렉토리에서

가져다 쓸수 없다구 생각이 되는데.........

________________________

이제는 커널이다.....
________________________

hyangil의 이미지

링크를 걸어주면 문제가 해결될듯한데요 ^^;

나는 본인이 맞음을 증명하노라 ㅋ

ysscuba의 이미지

링크를 걸어 주라는 건

소프트 링크를 말씀하는 건가요?

ln -s 써서 파일을 링크 걸라는 말씀? ^^;;

hyangil의 이미지

소프트 링크 입니당!~~~
ln -s

^^

근데 혹시 운영체제 숙제 하고 계세요?

ㅎㅎ

나는 본인이 맞음을 증명하노라 ㅋ

ysscuba의 이미지

예... ^^

이 글의 조회수가 800을 넘어섰내요... ^^

KLDP에 처음 올린 글이 이렇게 히트를 치다니... -.-ㅋ

도움 주신 분들 감사드립니다... ^^

hyangil의 이미지

다 우리 학교 학생들이 아닐까요? 하하

나는 본인이 맞음을 증명하노라 ㅋ

ysscuba의 이미지

궁금한 점이 생겼습니다.

이제 다 잘 되는데...

제가 고친 소스들을 묶어서 다른 컴퓨터에서
고친 소스들을 가지고 다시 커널 컴파일을 해서 테스트를 해 볼 텐데...

여기서 /usr/src/linux 가 아닌 다른 디렉토리로 되어 있다면...

#include </usr/src/linux/include/asm-i386/unistd.h> 가 컴파일 에러를 발생 할텐데...

음...

이건 어떻게 해결 할 수 있을까요? -.-;;

절대 경로를 쓰지 않고 할 수 있는 방법이 있을 것 같은데...

ln -s 는 이런 경우에 안되잖아요...

익명 사용자의 이미지

#include </usr/src/linux-2.6.10/include/asm-i386/unistd.h>
#include<errno.h>
_syscall0(int, newsyscall);

main()
{
int i;
i = newsyscall();
}

이렇게 하니깐..ㅡㅡ;; 에러 없이..오브젝트 파일이 맹글어지네요
모가 이런지...쩝..

artycode의 이미지

ysscuba wrote:

소스 코드에 절대 경로로 작성 하지 않고... gcc -I 하지 않고
#include <linux/unistd.h> 할 수 있는 방법을 알고 싶습니다.

C_INCLUDE_PATH

자세한 것은 셸 상에서

info gcc
g Environment Variables

혹은
http://ou800doc.caldera.com/cgi-bin/info2html?(gcc.info)Environment%2520Variables&lang=en

댓글 달기

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