[환경]
windows 8.1
VMware player
Fedora 20 (linux kernel ver 3.13.5) 64bit
작년에는 32비트 환경에서해봤는데
지금은 컴퓨터가 64비트여서 정말로 약~간 차이나는 것 빼곤 거의 다 같은 과정...ㅇ.ㅇ!!!
이전 포스팅 커널 컴파일로 새로 받은 커널(3.13.5) 환경에서 시스템콜을 추가하는게 이번 포스팅의 목표!
step 0.
/usr/src/linux 디렉토리 하위에 커널 소스코드를 두고 아래 단계들을 전부 실행했음을 미리 알림.
step 1. System call 번호 부여
> 컴퓨터 환경이 32bit라면
- /usr/src/linux/arch/x86/syscalls/syscall_32.tbl 에 추가
- 32비트 경우 맨 마지막 번호를 할당해주면 됨.
> 컴퓨터 환경이 64bit라면
- /usr/src/linux/arch/x86/syscalls/syscall_64.tbl 에 추가
64비트엔 common(64, 32 둘다 가능) , 64(64bit) , x32(32bit) 으로 구분되는데
간단한 시스템콜을 추가할거라 common으로 두고 추가.
주석으로도 나와있지만, 32비트용 시스템 콜은 512 이후로 할당하라고 되어있음.
314번에 새로운 시스템콜 mycall()을 등록
+ 번호는 커널 버전이나 리눅스 배포판 마다 다를 수 있음을 유의!
step 2. System call 테이블 등록
- /usr/src/linux/include/linux/syscalls.h 파일에 등록
- #endif 전에 asmlinkage long sys_mycall() 추가
step 3. System call 처리 함수 구현
- 커널에 포함되어 컴파일 할 함수니까 /usr/src/linux/kernel/ 하위에 mycall.c 작성
- /usr/src/linux/kernel/Makefile 을 수정하여, 위에서 작성한 파일명의 오브젝트 파일을 obj-y에 추가 (mycall.o 추가)
※ obj-y : built-in 되어 커널이미지의 일부가 됨
obj-m : module로 컴파일 됨
step 4.
방법 1. 커널 전체 컴파일 (커널 컴파일 참고)
# make mrproper
# make menuconfig (혹은 기타 다른 방법으로 configuration 설정...)
# make
# make modules
# make modules_install
방법 2. 이미 커널 컴파일을 완료 해서 System.map 파일과 initrd-#.#.img 파일이 /boot 디렉토리에 존재하는 경우
--> 커널이미지만 만 새로만들어 /boot 디렉토리로 덮어쓰기
# make bzImage
# reboot 하여 3.13.5 커널로 부팅
step 5.
⑴ 사용자 프로그램 작성
코드를 작성합니다. 시스템 콜을 호출 할때, 앞에서 할당해준 번호로 접근을 하게되요.
코드 작성 후 컴파일 할 떄 -I 옵션을 줍니다.
-I 옵션은 헤더파일의 경로를 지정할 수 있습니다. (갑자기 존대말...???)
# gcc -I/usr/src/linux/include -o test test.c
# ./test
올바르게 실행된 결과를 볼 수 있다.
+ 또한 dmesg 명령어를 통해 커널 메시지에 본 시스템콜로 인해 출력된 메시지를 볼 수 있음. " do it mycall(int n)! "
⑵ 사용자 라이브러리 작성
- mysys.c 로 아래와 같은 코드를 작성
- mycall()을 호출하면 내부에서 시스템 콜을 호출하도록 한다
- 컴파일 할 때 오브젝트 파일로 생성되도록 -c 옵션을 준다.
(mysys.c ---> mysys.o 생성)
# gcc -I/usr/src/linux/include/ -c mysys.c
- 라이브러리 아카이브 생성
-r 옵션 : libmy.a 라는 라이브러리 아카이브에 mysys.o 를 추가
(라이브러리명이 뭐가 되도 좋지만 앞에 접두로 lib를 반드시 붙이길 바람)
# ar -r libmy.a mysys.o
그리고 라이브러리를 이용하는 프로그램을 작성 ↓↓↓
컴파일 하고 실행하면 다음과 같은 결과가!
# gcc -I/usr/src/linux/include/ -O -o test test.c -L./ -lmy
( ※ 라이브러리 파일명이 libabcd.a 이면 옵션에서 -labcd 로 )
'Computers > Adv. Linux System Programming' 카테고리의 다른 글
change sources.list (0) | 2014.05.20 |
---|---|
install RT linux (0) | 2014.05.19 |
ubuntu initrd.img 생성 (0) | 2014.05.01 |
커널 컴파일 / kernel compile (0) | 2014.03.07 |
checkpoint +_at_ Embedded board (0) | 2013.04.26 |