강좌
클라우드/리눅스에 관한 강좌입니다.
자격증 분류

리눅스마스터1급 : 매커니즘 모듈(Modules)-모듈을 로드하기

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터1: 매커니즘 모듈(Modules)-모듈을 로드하기

 





커널 모듈을 로드하는 방법은 두 가지가 있다.

 

 

 

 

첫 번째는 modprobe 또는 insmod 명령을 사용하여 수동으로 모듈을 커널에 추가하는 것이다.

 

 

 

 

 

두 번째는 모듈을 필요로 할 때 로드하는 것으로 이를 요구 시 로딩(demand loading)이라고 한다.

 

 

 

커널이 어떤 모듈을 필요로 한다는 것을 발견하면(사용자가 커널에 없는 파일 시스템을 마운트 한 경우), 커널은 커널 데몬(kerneld)에게 맞는 모듈을 로드하라고 요구한다.

 

 

 

 

커널 데몬은 비록 수퍼 유저 권한을 가지고 있기는 하지만 보통의 사용자 프로세스이다.

 

 

 

이 프로세스는 보통 시스템이 부팅할 때 시작하여 커널과 프로세스 간 통신(IPC) 채널을 하나 연다.

 

 

 

이 연결은 커널이 kerneld에게 여러 가지 작업을 요청하기 위해 메시지를 보내는데 사용한다.

 

 

 

kerneld의 주된 역할을 커널 모듈을 로드하고 언로드하는 것이지만, 필요할 때 직렬 라인상에 PPP 연결을 시작하거나 필요하지 않을 때 이를 닫는 것 같은 다른 작업을 할 수 있는 능력도 있다.

 

 

 

kerneld는 직접 이런 일들을 하는 것이 아니라 이런 일을 하기 위해 필요한 프로그램(insmod )을 실행한다.

 

 

 

kerneld는 단지 커널의 대리인이며, 커널의 다른 한 편에서 일을 스케줄링한다.

 

 

 

 

insmod 프로그램은 자신이 로드해야 하는 요청한 커널 모듈을 찾을 수 있어야 한다.

 

 

 

요구시 로드하는 커널 모듈은 보통 /lib/modules/kernel-version에 들어있다.

 

 

 

커널 모듈은 시스템에 있는 다른 프로그램과 비교하면 링크된 오브젝트 파일이라는 점은 같지만 재배치 가능한 이미지로 링크되어 있다는 점이 다르다.

 

 

 

, 특정 주소에서 시작하도록 링크되어 있지 않다는 것이다.

 

 

 

이 이미지는 a.out 포맷이나 ELF 포맷의 오브젝트 파일일 수 있다.

 

 

 

insmod는 커널이 익스포트(export)하는 심볼을 찾기 위해 특권층의 시스템 콜을 사용한다.

 

 

 

커널은 익스포트 심볼을 심볼의 이름과 그것의 값(심볼의 주소같은)의 쌍으로 가지고 있다.

 

 

 

커널의 익스포트 심볼 테이블은 커널이 관리하는 모듈의 목록인 module_list 포인터가 가리키고 있는 첫 번째 module 자료 구조에 들어있다.

 

 

 

커널에 있는 모든 심볼들이 모듈에게 익스포트되는 것은 아니다.

 

 

 

단지 커널을 컴파일하고 링크할 때 특별히 지정한 심볼만이 이 테이블에 들어간다.

 

 

 

드라이버가 시스템의 특정 인터럽트의 제어권을 갖고 싶을 때 호출해야 하는 커널 루틴인 “request_irq” 심볼을 예로 들어보자. 필자가 갖고 있는 현재 커널에서 이것의 값은 0x0010CD30이다.

 

 

 

insmod는 모듈을 자신의 가상 메모리 공간으로 읽어 들이고, 아직 해결되지 않은 커널 루틴과 자원에 대한 참조를 커널에 있는 익스포트 심볼을 통하여 맞추어준다.

 

 

 

이렇게 위치를 고정하는 것은 메모리상에 있는 모듈 이미지를 수정하는 형태로 이루어진다.

 

 

 

insmod는 모듈에 있는 해당하는 위치에 물리적으로 심볼의 주소를 써넣는다.

 

 

 

 

insmod가 모듈의 익스포트된 커널 심볼에 대한 참조를 모두 해결하였다면, 특권 시스템 콜을 이용하여 커널에게 새로운 커널을 포함할 수 있는 충분한 공간이 있는지 묻는다.

 

 

 

커널은 새 module 자료 구조와 새 모듈을 충분히 포함할 수 있는 크기의 커널 메모리를 할당하고, 이 구조체를 커널 모듈 리스트의 끝에 넣는다.

 

 

 

새 모듈은 초기화되지 않았다고(UNINITIALIZED) 표시된다.

 

 

 

로드된 커널의 목록과 그들의 상관 관계를 보고 싶으면 lsmod 명령어를 쓰면 된다.

 

 

 

lsmod 명령은 단지 커널 module 자료 구조의 리스트로부터 만들어지는 /proc/modules의 포맷을 바꾸어서 보여주는 것뿐이다.

 

 

 

커널이 모듈을 위해 할당한 메모리는 insmod가 이에 접근할 수 있도록 insmod 프로세스의 주소 공간에 매핑이 된다.

 

 

 

insmod는 모듈을 할당받은 공간으로 복사를 하고 이를 재배치하여, 할당받은 커널 공간에서 실행될 수 있도록 한다.

 

 

 

이는 모듈이 서로 다른 리눅스 시스템에서 똑같은 주소에 로드되거나 두 번 모두 같은 주소에 로드된다는 보장이 없기 때문에 반드시 필요하다.

 

 

 

다시 한 번 이렇게 재배치하는 것은 모듈의 이미지를 올바른 주소로 수정하는 것을 포함한다.

 

 

 

 

새 모듈은 또한 커널에 심볼들을 익스포트하기 때문에 insmod는 이렇게 익스포트된 이미지의 테이블을 만든다.

 

 

 

모든 커널 모듈은 모듈 초기화와 모듈 정리 루틴을 가지고 있어야 한다.

 

 

 

이 두 심볼은 익스포트되진 않지만, insmod는 이 둘의 주소를 알아내어 커널에 넘겨야 한다.

 

 

 

모든 것이 잘 되었다면 insmod는 이제 모듈을 초기화할 준비가 되어 있고, 특권 시스템 콜을 불러 커널에 모듈의 초기화 루틴과 정리 루틴의 주소를 넘긴다.

 

 

 

 

새 모듈이 커널에 추가되면, 커널의 심볼 목록을 갱신하고 새 모듈이 사용하는 모듈들을 수정해야 한다.

 

 

 

자신에 의존하는 다른 모듈을 가진 모듈은 자신의 module 자료 구조의 포인터가 가리키고 있는 자신의 심볼 테이블 끝에 참조되는 목록을 관리하여야 한다.

 

 

 

커널은 모듈의 초기화 루틴을 부르고, 이것이 성공하면 모듈 설치를 계속 하게 된다.

 

 

 

모듈의 정리 루틴의 주소는 모듈의 module 자료 구조에 저장되며, 모듈이 언로드될 때 커널에 의해 호출된다.

 

 

 

마지막으로 모듈의 상태는 실행중(RUNNING)으로 설정된다.

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,038 명
  • 현재 강좌수 :  35,813 개
  • 현재 접속자 :  141 명