본문 바로가기

프로그래밍./ARM(임베디드)

[s5pc100] System Call 추가하기. 그림 설명.

[s5pc100] System Call 추가하기. 그림 설명.
[can-c100] System Call 추가하기. 그림 설명.
[kernel-2.6.29-aesop-RTM10] System Call 추가하기. 그림 설명.



kernel-2.6.29-aesop-RTM10 의 커널에 system call을 추가해 보자.


경로가 상당히 깁니다. 2~3글자 정도 입력 후 Tab 키를 눌러주면 자동으로 완성됩니다.
중복된 이름이 있는 경우 그 이름들을 모두 출력해 주며,
중복되지 않는 고유한 글씨까지 입력 후 Tab 키를 눌러주면 완성 됩니다.


unistd.h 파일을 열어서 System Call을 추가한다.

vi /android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/include/asm/unistd.h


현재 +360 번까지 지정이 되어 있었으며 마지막에
#define __NR_함수명 (__NR_SYSCALL_BASE+361) 을 추가해 줍니다.




calls.S 파일에 콜 처리함수를 등록해 줍니다.

vi /android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/kernel/calls.S


주의할 점은. 여기서 360번까지 있고. 그 뒤에 등록을 했습니다.
즉, 361번이 되는 셈이죠. unistd.h 에서의 361번과 동일해야 합니다.




콜 발생시 수행할 함수를 구현해 줄 차례입니다.

cd /android/kernel/kernel-2.6.29-aesop-RTM10/kernel
vi mysyscall.c






만든 처리함수를 커널이 컴파일 될 때 함께 컴파일 되도록 추가해 줍니다.

vi /android/kernel/kernel-2.6.29-aesop-RTM10/kernel/Makefile





마지막으로 커널을 컴파일 해줍니다.

cd /android/kernel/kernel-2.6.29-aesop-RTM10
make zImage


오류라고 나오는데,

dd: `/tftpboot/zImage-S5PC100' 열기: No such file or directory

tftp를 아직 작업하지 않아서, 해당 폴더가 없기 때문에 나오는 에러로 무시 하셔도 됩니다.


이 커널은 컴파일 시 zImage 파일을 2곳에 만듭니다.
/tftpboot/ 과 /android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/boot



/android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/boot 에 만들어진 zImage



tftp와 nfs가 셋팅이 되어 있어야 합니다.
커널을 수정하여 새로 이미지를 만들었기 때문에 보드의 이미지를 변경 해줘야 하는데.
tftp로 커널을 가져오게 셋팅된 경우. 설정된 이름과 동일한 파일이 생성되기 때문에 자동으로 불러옴.

tftp가 아닌 보드 자체에서 이미지를 사용하는 경우에는 tftp로 받아서 저장하던가,
부트를 보드에서가 아닌 tftp로 변경해 줘야 합니다.




원하는 위치에 테스트 파일 작성하기
vi syscall_test.c


위의 코드를 작성해 줍니다.



컴파일시 기존의 리눅스 컴파일과 다릅니다.

 -I 옵션으로 해당 해더파일이 있는 곳을 잡아줘야 합니다. (nistd.h)


arm-s5pc1xx-linux-gnueabi-gcc syscall_test.c -o syscall_test  -I /android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/include/

arm-s5pc1xx-linux-gnueabi-gcc  [컴파일러]
syscall_test.c [소스파일]
 -o syscall_test [만들 실행 파일]

 -I /android/kernel/kernel-2.6.29-aesop-RTM10/arch/arm/include/ [해더파일 위치]

kernel-2.6.29-aesop-RTM10 압축 해제한 곳의 경로에 뒤에 추가해 주시면 됩니다.





nfs를 통해서 보드에 동일한 파일이 있고.
보드에서, 생성한 실행 파일을 실행하시면 위와 같은 메시지가 출력 됩니다.

 저 ~ 위에서 mysyscall.c 파일에 작성했던 내용이 나왔습니다.