KernelProgramming-printk

커널의 나만의 함수를 시스템 콜(함수)로 만들어보기

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
Kernel Panic!  (2) 2006.07.21