임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현
글 작성자: _rian
시스템 호출(System Call)이란?
시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.
시스템 호출 과정
시스템 호출의 구현
시스템 호출을 구현하는 sequence는 위와 같다. 아래는 sys_hello라는 시스템 호출 함수를 만드는 예시이다.
1) 시스템 호출 함수 정의
Kernel 소스의 kernel 디렉토리에 시스템 호출 함수를 정의한 프로그램 파일 (hello.c) 생성
#include <linux/kernel.h>
asmlinkage void(sys_hello(){
printk("Hello, this is new system call!\n);
}
- asmlinkage : stack을 통하여 parameter 전달
- fastcall : 몇개의 parameter는 register를 통하여 전달
2) 시스템 호출 번호 할당
include/asm-arm/unistd.h 파일 편집 (추가함)
unistd.h 파일의 시스템 호출 번호의 마지막에 sys_hello()를 위한 번호 322를 추가함.
sys_hello 함수는 SWI 0x900322로 호출되어 수행됨.
3) 시스템 호출 함수 등록
arch/arm/kernel/call.S 파일에 등록
마지막에 sys_hello 함수 엔트리 추가
4) Makefile 수정 및 커널 재 컴파일
추가된 hello.c가 위치한 디렉토리(kernel)의 makefile 수정
obj-y에 hello.o를 추가함.
커널 재 컴파일 및 타겟 시스템 설치
시스템 호출을 수행하는 사용자 프로그램 작성
사용자 프로그램 test-hello.c 작성하기
#include <linux/unistd.h>
#include <errno.h>
#define __NR_hello (__NR_SYSCALL_BASE+322)
/* system call stub function */
_syscall0 (void, hello); // hello 함수 선언 – 인수 없음
int main()
{
hello();
return 0;
}
사실, 커널에 시스템 호출을 추가하는 경우는 많지 않다고 한다. (그냥 있는거대로 쓰는 모양)
'Computer Engineering > 임베디드 시스템' 카테고리의 다른 글
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍 (0) | 2019.06.12 |
---|---|
리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류 (0) | 2019.06.12 |
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수 (0) | 2019.06.11 |
임베디드 리눅스 커널 프로그래밍(1) - application 프로그래밍과 커널프로그래밍의 차이점, 커널프로그래밍 시 주의사항 (2) | 2019.06.11 |
ABI와 EABI (0) | 2019.06.11 |
댓글
이 글 공유하기
다른 글
-
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍
2019.06.12 -
리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류
리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류
2019.06.12 -
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
2019.06.11 -
임베디드 리눅스 커널 프로그래밍(1) - application 프로그래밍과 커널프로그래밍의 차이점, 커널프로그래밍 시 주의사항
임베디드 리눅스 커널 프로그래밍(1) - application 프로그래밍과 커널프로그래밍의 차이점, 커널프로그래밍 시 주의사항
2019.06.11