Page 181

나만의 시스템 호출제작 과정은 

  • 시스템 호출 번호 할당
  • 시스템 호출 테이블 등록
  • 새로운 시스템 호출 작성
  • 커널 재컴파일

으로 나뉜다.

 

시스템 호출 번호 할당

시스템 호출 번호 할당은 아래의 파일에서 찾아, 추가할 있다.

(include/asm-i386/unistd.h) 파일은 단지 define 위한 과정이다. 아래처럼  newcall 정의해주고 값을 명시한 아래 갯수를 하나 올려준다.

 

시스템 호출 테이블 등록

커널 2.6 부터는 arch/i386/kernel/syscall_table.S 있다. 여기에 등록해 두면 호출을 받았을때 아래의 sys_newcall 이라는 함수를 찾아서 실행해 것이다

 

새로운 시스템 호출 함수 작성

kernel/newcall.c 작성한다. kernel. printk 함수 제공을 위함. syscall 함수는 커널영역에서 실행되는 함수이기에 아래 코드를 잘못 작성하면 어플리케이션 단위의 에러가 아닌 커널 패닉을 일으킨다. 그리고 커널 영역에서는 printf같은 표준라이브러리는 사용할 없다.

 

커널 재컴파일

이제 커널을 재컴파일을 하여 추가 시킨 새로운 시스템콜이 동작할 있게 커널에 넣어 준다.

Makefile 수정해 줘야 하는데 newlcall.o 끝에 적어준다.

 

여기까지 진행이 됐으면 이제 커널 이미지를 만들어 준다. 전체 컴파일을 필요가 없으므로 커널 이미지만 빌드한다.

make bzImage

이미지를 boot 디렉토리에 복사하고 grub 추가 시켜준다.

 

새로운 시스템 호출을 이용하는 응용프로그램 작성

_syscall0 모습은 아래의 처럼 바뀐다. define

 

_syscall0 모습(include/asm-i386/unistd.S)

 

소스는 아래와 같이 전처리가 끝나면 바뀌어 있을거라 예상하고 적어보았다..

 

이것을 실제로 소스를 컴파일 하여 중간파일을 생성하여 살펴보자. 현재 공유파일을 사용할 있는 커널을 사용하기 때문에 컴파일을 우리가 손을 커널소스를 참조 하지 않는다. 그렇기 때문에 아래와 같이 입력하여 제대로 나오게 필요가 있다.

 

 

이제 생성된 i 파일을 보자. 아래에 보면 _syscall0 어떻게 처리되었는지 있다.

 

 

중간 과정에서 생성된 어셈블리 파일 확인

 

 

App 영역과 Kernel 영역

가상메모리 개념이 있기 때문에 4기가라는 메모리를 가상으로 가지고 어플리케이션은 돌아간다.

실제 부족한 메모리는 Swap 통해서 보충하게 되는데 이때 과도한 하드디스크 엑세스로 느려 있다.

 

우리는 application 통해서 원하는 함수를 호출하는데 이것은 실제로 커널에게 system_call 요청한것이다.

 

 IDT 보디가드라고 보고 집은 커널 우리는 보디가드에게 원하는 일을 요청하고 보디가드가 집에 들아가서 그것을 실행하고 21번을 리턴하는데 이것이 수행했다는 말이다. 커피 창고에는 절대 못들어간다. 커피창고는 리소스 창고. 일종의 newcall이라는 비서를 만들었고 작성해둔 한다.

 

모듈과 커널에 심는것.

 

신고


티스토리 툴바