실습.
sys_writeFND(int one, int ten)을 시스템콜을 정의하고 호출하여 응용프로그램 작성해 보자.
시스템 호출 추가 하기
1.시스템 호출 번호 할당 하기
시스템 호출 번호는 /hanback/Source/kernel/linux...
/include/asm/unistd.h 파일에 구현 하면 된다.
unistd.h파일을 열면 시스템콜이 정의된어 있다.
...
#define __NR_readahead (__NR_SYSCALL_BASE+225)
#define __NR_wapper (__NR_SYSCALL_BASE+226)
#define __NR_writeFND (__NR_SYSCALL_BASE+227)
...
저장후, 나옴
2. 시스템 호출 테이블에 등록
호출 처리 함수는 /hanback/Source/kernel/linux...
/arch/kernel (기억이 잘....)^^;/calls.S파일에 구현하면
된다. calls.S파일을 열면 sys_call_table이 등록되어 있다.
calls.S파일을 열어서 심볼테이블을 등록한다.
/*225*/ .long SYMBOL_NAME(sys_readahead)
/*226*/ .long SYMBOL_NAME(sys_wapper)
/*227*/ .long SYMBOL_NAME(sys_riteFND)
등록 후, 저장하고 나옴
3. 시스템 호출 함수 작성
타겟보트 리눅스 커널 소스 중에 태스크 관리자 관련된 시스템
호출 함수들은 /hanback/Source/kernel/linux.../kernel밑에
구현되어 있다. 여기에서 sys_writeFND(int one, int ten)함수를 작성한다.
writeFND.c라는 이름 파일을 만들고 밑에 소스와 같이 코드를 작성한다.
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/linkage.h>
#define ADDRESSOFLED1 0xf1300000 //7segment 가상주소
#define ADDRESSOFLED2 0xf1400000 //7segment 가상주소
asmlinkage int sys_writeFND(int one, int ten){
int *fnd1, *fnd2;
if(check_region(ADDRESSOFLED1,1)) return -1;
if(check_region(ADDRESSOFLED2,1)) return -1;
fnd1= (int *)ADDRESSOFLED1;
fnd2= (int *)ADDRESSOFLED2;
*fnd1=0xffff&one;
*fnd2=0xffff&ten;
return 1;
}
저장후, 나옴
여기서 바로 커널을 리빌드 하면 추가 부분을 컴파일하지 안고
컴파일될 것이다. 그래서 추가된 부분도 같이 리빌드시 컴파일
하기위해서 Makefile 파일을 수정한다.
vi Makefile 을 하여 writeFND.o 를 추가한다. 그런후 상위 폴더에서 /hanback/Source/kernel/linux... 에서 make zImage
명령어를 사용하여 커널을 빌드한다.
zImage를 만들면 /hanback/Source/kernel/linux.../asm/arm
/boot에 zImage가 생긴다.
zImage를 /tftpboot/폴더에 복사를 한다.
4. EMPOS 장비에 zImage 퓨징하기 ㅋ
EMPOS 장비를 켜서 부트로드로 진입한다. 그런 후 bootp명령
어를 입력하여 엔터치면 호스트와 타켓 아이피 주소가 나온다. 그러나 주소가 나오지 않은 즉 에러가 발생하면
vi /etc/bootptab 을 열어서 입력이 올바르게 되었는지 아니면 호스트 ip 주소를 잘 입력했는지를 검사 한다.
가끔 사용자가 장비와 연결해준는 랜 선을 똑바로 연결하지 않아서 에러가 발생하는 경우도 있다.
이상이 없을경우
tftp zImage kernel 하면 zImage가 다운된다.
그런 후, flash kernel 하면 퓨징이 된다.
5. 공유 폴더 /mywork 에서 시스템호출 함수를 이용하여
7segment 제어 하기위한 프로그램 만들기
/mywork 폴더에 가서 vi syscall.c를 연다. 다른 이름을 줘도 상관없다.
그런 후, 우리가 등록한 시스템 함수를 사용하여 7segment 제어 해 보겠다.
#include <asm/unistd.h>
#include <stdio.h>
#include <errno.h>
_syscall2(int,writeFND,int,one,int,ten);
int main()
{
writeFND(0x3f06, 0x3f5b);
retrun 0;
}
입력한 후 저장하여 나옴.
syscall.c파일을 장비에 맞게 컴파일하기 위해서
arm-linux-gcc syscall.c -I(대문자아이) /hanback/Source/
kernel/linux..../include -o test 를 컴파일한다.
입력를 똑바로 했으면 에러없이 컴파일이 된다.
그런후, 타켓보드를 이용하여 ./test를 하기위해서 호스트에서 nfs 서비스를 실행시켜 한다.
service nfs restart
6. 타겟보드에서 호스트을 마운트하여 컴파일한 test 실행
minicom 하여 EMPOS장비를 부팅한다.
EMPOS장비 아이피를 지정
ifconfig eth0 192.168.1.200
마운트 시킨다.
mount 192.168.1.100:/mywork /mnt
/mnt 이동하여 test 실행시킨다.
./test
실행시키면 장비 7segment 에
02 01
이 나오게 된다.
그럼 이만 ~~~~ 힘들다.