임베디드 리눅스 커널 프로그래밍(1) - application 프로그래밍과 커널프로그래밍의 차이점, 커널프로그래밍 시 주의사항
글 작성자: _rian
Kernel Programming 이란?
커널 모드에서 수행하는 프로그램을 작성하는 것을 말한다. 커널 프로그래밍의 종류는 아래와 같다.
- Linux Kernel core 기능 추가
- Linux Kernel 알고리즘 개선
- Linux Kernel 모듈 프로그래밍 - 커널 컴파일 필요 없음
(나는 주로 세번째인 모듈 프로그래밍을 했다. 나머지는 차차 포스팅 할 예정)
Kernel Programming vs Application Programming
수행 방법에서의 차이
- Application program : 처음부터 순차적으로 수행함
- Kernel : 응용 프로그램이 호출한 system call이나 interrupt handler를 수행하기 위해 비동기적으로 수행함
라이브러리
- Application program : 모든 라이브러리를 link하고 사용할 수 있다.
- Kernel : kernel에서 export하는 것들만 사용할 수 있다. (아래와 같은 명령어 삽입함)
EXPORT_SYMBOL(func_name)
커널모드와 사용자모드
- Application program : user mode에서 수행되며 하드웨어에 직접 접근하는 것과 메모리에 대한 허용되지 않은 접근이 제한된다.
- Kernel : kernel mode에서 수행되며 모든 것이 허용된다.
주소 공간(Address Space)
Application Program과 Kernel Program은 서로 다른 메모리 주소 공간을 가지고 있다. 32비트 가상 주소 공간에서의 예시는 아래와 같다.
Namespace Pollution 문제
- Application Program : 현재 개발하는 프로그램에서만 각 함수와 변수의 이름을 구별해주면 된다.
- Kernel Program : 리눅스 커널 = 커널 core + 다수의 커널 모듈. 현재 개발하는 커널 모듈 뿐만아니라 커널 전체에서 함수와 변수의 이름이 충돌하지 않도록 해야한다.
Kernel Programming 주의 사항
라이브러리
- stdio.h와 같이 보통 프로그램에서 사용하는 헤더 파일을 include 해서 사용할 수 없다.
- 다음에 선언된 헤더파일만 include 한다. (아래)
/usr/include/linux 와 /usr/include/asm
(예)
#include <linux/***.h>
#include <asm/***.h>
Namespace pollution
- 외부 파일과 link하지 않을 모든 심볼을 static으로 선언함.
- 외부 파일과 link할 symbol을 symbol table에 등록함.
EXPORT_SYMBOL(name); //심볼 name을 export함
- 전역 변수는 잘 정의된 prefix를 붙여준다.
(ex) sys_open()
Fault handling
- 커널은 하드웨어 접근에 대해 어떠한 제한도 없기 때문에 커널에서의 에러는 시스템에 치명적인 결과를 발생시킨다.
- 함수 호출 등의 작업시 모든 에러 코드를 검사하고 처리해야한다.
Address space
- 커널이 사용하는 스택의 크기는 제한되어있고, 인터럽트 핸들러도 같은 스택을 사용할 수도 있으므로 큰 배열을 지역변수로 사용하거나 recursion이 많이 일어나지 않도록 주의해야한다.
- Application과 data를 주고받기 위해 특별한 함수를 사용하여야 한다. -> call by reference
기타
실수 연산이나 MMX/SSE 연산(x86)을 사용할 수 없다.
'Computer Engineering > 임베디드 시스템' 카테고리의 다른 글
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현 (0) | 2019.06.12 |
---|---|
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수 (0) | 2019.06.11 |
ABI와 EABI (0) | 2019.06.11 |
툴체인(Tool Chain)이란 (0) | 2019.06.11 |
임베디드 시스템 - 교차 개발 환경(JTAG에 관하여) (0) | 2019.06.11 |
댓글
이 글 공유하기
다른 글
-
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현
2019.06.12 -
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
2019.06.11 -
ABI와 EABI
ABI와 EABI
2019.06.11 -
툴체인(Tool Chain)이란
툴체인(Tool Chain)이란
2019.06.11