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이라는 비서를 만들었고 작성해둔 일 만 한다.
모듈과 커널에 심는것.
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
[arm] 요약입니다@@ (4) | 2012.10.12 |
---|---|
[통신] 요약입니다@@ (1) | 2012.10.12 |
[리눅스커널] 요약입니다@@ (1) | 2012.10.12 |
[리눅스 커널]2012/10/12 작업일지(sprintf의 역활) - by. 이창현 (3) | 2012.10.12 |
[리눅스 커널] 2.4.32 와 2.6.14 소스 (0) | 2012.10.12 |
[RFID]스팩위주 설명 보완중 -김동기 (4) | 2012.10.11 |
[공유기]DNS 서버가 응답하지 않습니다.란 메세지 뜰시 (2) | 2012.10.11 |
제안 한가지 하겠습니다. (9) | 2012.10.11 |