KernelProgramming-printk
Programming/Kernel 2006. 7. 24. 22:13
커널의 나만의 함수를 시스템 콜(함수)로 만들어보기
1시스템 콜을 등록하자
리눅스 커널 2.4버전이 /usr/src/linux-2.4.32 의 디렉토리에 있다고 하면
/usr/src/linux-2.4.32/include/asm-i386/unistd.h
파일에서 내가 만들 함수를 추가한다
#define __NR_exit_group 252
아래에 추가할것(커널 2.4 일때)
만약 거기에 글자가 있더라도 수정해도 된다
(라인수가 맞게 작성하자 예를들어서 252밑 라인에)
ex>
#define __NR_cpuinfo 253
다음에는
/usr/src/linux-2.4.32/arch/i386/kernel/entry.S 파일에 역시 전거와 비슷하게
라인수를 맞춰서 적는다
ex>
.long SYMBOL_NAME(sys_cpuinfo)
참고로 라인수는 위쪽라인에 옆 주석에 대충 5인가 10사이마다 나와있다
그것을 잘 맞춰서 할것(앞에서 253이었다면 이번에도 253 맞춰서 적어주어야함)
Plus...C에서는 인수가 6개 정도 밖에 안된다고 한다나
2함수가 될 본제를 작성한다
/usr/src/linux-2.4.32/kernel/cpuinfo.c(편의상 kenel 디렉토리에 작성)
#include<linux/linkage.h>
#include<linux/unistd.h>
asmlinkage int sys_cpuinfo()
{
printk("CPU INFO\n");//C에서 printf 함수와 사용법이 비슷하다
return 0;
}
3/usr/src/linux-2.4.32/kernel/Makefile 에다가 오브젝트?를 추가해준다
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
module.o exit.o itmer.o info.o time.o softirq.o resource.o
중략....
signal.o sys.o kmod.o ......(맨뒤에다가) cpuinfo.o 추가(아마도 c파일이랑 같은 파일명으로 해야하는거 같다)
4 unistd.h 파일을 복사해 준다
cp /usr/src/linux-2.4.32/include/asm-i386/unistd.h /usr/include/asm/unistd.h
5 시스템 콜을 이용할 프로그램을 작성한다
#include<linux/unistd.h>
_syscall0(int,cpuinfo);
main()
{
int i;
i=cpuinfo();
}
6 컴파일
7 출력이 되지 않으면 로그 파일을 확인해본다
ex>/var/log/message.log
쏫스의 자세한 내용은 본인도 모름... 니마~ 이 라인 어떻게 되는거삼~ 하고 물으면 본인은 좌절할수 밖에 없음.;
예>main함수가 왜 저따위로 생겼삼? 이런거.. 내용은..C언어 안다면 대충 무슨짓하는지는 알수 있을듯
1시스템 콜을 등록하자
리눅스 커널 2.4버전이 /usr/src/linux-2.4.32 의 디렉토리에 있다고 하면
/usr/src/linux-2.4.32/include/asm-i386/unistd.h
파일에서 내가 만들 함수를 추가한다
#define __NR_exit_group 252
아래에 추가할것(커널 2.4 일때)
만약 거기에 글자가 있더라도 수정해도 된다
(라인수가 맞게 작성하자 예를들어서 252밑 라인에)
ex>
#define __NR_cpuinfo 253
다음에는
/usr/src/linux-2.4.32/arch/i386/kernel/entry.S 파일에 역시 전거와 비슷하게
라인수를 맞춰서 적는다
ex>
.long SYMBOL_NAME(sys_cpuinfo)
참고로 라인수는 위쪽라인에 옆 주석에 대충 5인가 10사이마다 나와있다
그것을 잘 맞춰서 할것(앞에서 253이었다면 이번에도 253 맞춰서 적어주어야함)
Plus...C에서는 인수가 6개 정도 밖에 안된다고 한다나
2함수가 될 본제를 작성한다
/usr/src/linux-2.4.32/kernel/cpuinfo.c(편의상 kenel 디렉토리에 작성)
#include<linux/linkage.h>
#include<linux/unistd.h>
asmlinkage int sys_cpuinfo()
{
printk("CPU INFO\n");//C에서 printf 함수와 사용법이 비슷하다
return 0;
}
3/usr/src/linux-2.4.32/kernel/Makefile 에다가 오브젝트?를 추가해준다
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
module.o exit.o itmer.o info.o time.o softirq.o resource.o
중략....
signal.o sys.o kmod.o ......(맨뒤에다가) cpuinfo.o 추가(아마도 c파일이랑 같은 파일명으로 해야하는거 같다)
4 unistd.h 파일을 복사해 준다
cp /usr/src/linux-2.4.32/include/asm-i386/unistd.h /usr/include/asm/unistd.h
5 시스템 콜을 이용할 프로그램을 작성한다
#include<linux/unistd.h>
_syscall0(int,cpuinfo);
main()
{
int i;
i=cpuinfo();
}
6 컴파일
7 출력이 되지 않으면 로그 파일을 확인해본다
ex>/var/log/message.log
쏫스의 자세한 내용은 본인도 모름... 니마~ 이 라인 어떻게 되는거삼~ 하고 물으면 본인은 좌절할수 밖에 없음.;
예>main함수가 왜 저따위로 생겼삼? 이런거.. 내용은..C언어 안다면 대충 무슨짓하는지는 알수 있을듯
'Programming > Kernel' 카테고리의 다른 글
확실히 다르잖아!! (4) | 2008.04.15 |
---|---|
ctags 설정 (4) | 2008.03.11 |
본체 전원키로 시스템 off 시키기 (4) | 2007.04.22 |
운영체제 없이 화면에 A를 찍어보아요... (6) | 2007.04.06 |
KernelProgramming-printk (5) | 2006.07.24 |
Kernel Panic! (2) | 2006.07.21 |
-
-
-
에그 2009.03.11 16:16
숙제로 구글링하다 들어와보니 또 자네 블로그구만 이런 대단한 살람 =_=ㅋㅋㅋ
2.6.24 버전에서 시스템콜 추가하고, 커널을 컴파일하고 시스템콜 부르는 파일을 컴파일 하는데, 새로 추가한 시스템콜 상수(본문에서는 __NR_cpuinfo)가 정의가 안되어있다고 하는구려 =_=;;
/usr/include/asm/unistd.h에다가 __NR_cpuinfo를 추가하면 돌아가긴 하는데... 그냥 본문의 4번처럼 소스의 unistd.h를 복사해서 옮겨줘버려도 동작엔 지장이 없을까? =_=;;;