본문 바로가기
학교 공부/내장형 시스템

[내장형 시스템] 모듈 프로그래밍

by 그적 2020. 12. 2.

초창기 리눅스 시스템은 Monolithic 시스템 구조이다. 시스템 일부를 수정하더라도 리눅스 전체를 다시 컴파일하고 재부팅해야 한다는 단점을 가졌다. 이후 모듈을 이용한 모듈 프로그래밍이 나오게 되었고, 커널 시스템 일부를 커널이 동작하는 과정에서 load/unload가 가능해졌다. 필요 없는 커널들, 자주 사용하지 않는 모듈들은 메모리에 적재시키지 않아도 되기 때문에 메모리 사용량이 최소화되고, 확장성 유연성을 제공한다.

 

모듈 프로그래밍 장점

- Device Driver를 사용할 때 유용하다

- 파일 시스템, 통신 프로토콜 및 시스템 콜 등 또한 모듈로 구현이 가능하다.

 

모듈 프로그래밍 특징

- event-driven 방식으로 작성

- 커널 적재 및 제거를 위한 규칙과 유틸리티가 필요하다.

- object 파일로 적재(2.6x 버전 이전 리눅스는 .o 파일 사용 / 2.6x 버전 이후 리눅스는 .ko 파일 사용)

 

모듈 프로그래밍의 기본 구조

#include <linux/kernel.h>       // 커널에 관한 헤더 파일 
#include <linux/module.h>
#include <linux/init.h>

int example_init(void){        // 모듈이 적재될 때의 초기화를 수행
	...	                        (void형 매개변수와 int형 프로토타입 필수)
    return 0;
}

void example_exit(void){       // 모듈이 제거될 때의 모듈 반환을 수행
	...                         (void형 매개변수와 void형 프로토타입 필수)
}

module_init(example_init);      // module 적재 및 제거를 위한 매크로
module_exit(example_exit);
MODULE_LICENSE("GPL");          // 모듈과 관련된 라이선스 표시

 

모듈 프로그래밍 주의사항

- 일반 프로그램에서 사용하는 헤더 파일을 포함할 수 없다.

- 메모리 접근 시 주의해야한다. (커널 모드로 실행되기 때문에 메모리 접근에 제한이 없다.)

- stack의 크기가 제한되어 있기 때문에, system이 충돌되는 문제점이 가진다.

- recursize call을 자제해야 한다.

 

댓글