디바이스 드라이버 같은 커널 라이브러리를 객체(object) 형태로 만들어서 시스템 콜을 통해 리눅스 커널에 적재 요청을 하면, 커널은 해당 객체를 커널에 동적으로 링크 시킨다.

이 개념은 동적 라이브러리의 동작과 유사하다. 커널은 이미 링크가 끝난 상태기 때문에 심블릭 테이블이 제거된 상태이므로 그 자체로는 링크 처리를 할 수 없다. 그래서 커널은 내부적으로 심볼 테이블을 가지고 있다. 심볼 테이블은 커널 내부의 함수나 변수 중 외부에서 참조할 수 있는 함수의 심볼과 주소를 담은 테이블이다. 이 심볼 테이블을 이용하면 객체 형태로 작성된 커널 모듈 루틴이 참조할 커널 내부의 함수나 변수에 연결되어 동적으로 링크된다.

1. 커널에 외부 참조가 선언된 심볼 선언을 심볼 테이블에 등록한다.
2. 모듈은 커널에 적재될 때 커널 내의 심볼 테이블을 참고하여 참조 주소를 얻는다.
3. 모듈에 외부 참조된 심볼 선언은 객체와 테이블을 이용해 관리한다.
4. 모듈의 외부 참조가 선언된 심볼들을 커널 내의 심볼 테이블에 등록한다.
5. 모듈 코드에서 선언되지 않았던 주소를 모두 선언하면 커널에 등록된다. 



커널에서 제공하는 심볼 테이블은 /proc/ksyms 또는 /proc/kallsyms 를 통해 알 수 있다. (리눅스 커널 버젼에 따라 ksyms나 kallsyms가 다르다)


 

+ Recent posts