-
디바이스 드라이버 / 커널 소스가 필요한 이유Linux/Linux Device Driver 2020. 9. 1. 12:36
타깃 보드에 이미 리눅스 커널이 올려져 있는데 디바이스 드라이버 코드를 컴파일하기 위해서는 커널 소스가 따로 필요하다.??
뭔 소리일까?
디바이스 드라이버는 커널 영역에 적재되어 동작하기 때문에 커널 영역에 있는 커널 함수(일반 함수, 매크로 함수, 인라인 함수)로 구성된다.
일반 함수를 사용할 경우 분기하여 동작하므로 커널 영역의 어느 위치에 해당 일반 함수가 있는지 알아야 한다. 그래서 커널 소스를 다운로드하고 빌드하면 심볼 테이블인 Module.symvers파일이 나오는데 이 위치 정보 파일을 참조하여 컴파일한다.(그럼 System.map은 뭐할 때 사용할까??.. /proc/kallsyms도 주소가 나오는 거 같은데;;???)
매크로 함수와 인라인 함수는 일반 함수와 다르게 컴파일 시 치환된다. 즉 분기하지 않는다는 뜻이기 때문에 커널 함수의 위치 정보도 없다. 그래서 매크로 함수와 인라인 함수가 정의된 커널 헤더 파일이 필요하다. 이 커널 헤더 파일은 커널 소스에 있다.
※ 여기서 말하는 일반 함수, 매크로 함수, 인라인 함수는 커널 영역에 있는 커널 함수를 의미하는 것이다.
이 두 가지 이유로 커널 소스가 필요하다.
사실 내 시스템과 동일한 심볼 테이블과 커널 헤더 파일만 따로 받을 수 있으면 커널 소스를 다운로드하고 빌드하지 않아도 되는 것 같다.
하지만 리눅스 커널 버전에 따라서 함수가 조금이라도 바뀌면 심볼 테이블이 바뀔 것이다. 버전이 다른 심볼 테이블을 사용하면 컴파일은 될 것 같지만 잘못된 주소로 분기해 커널 패닉이 발생하지 않을까 싶다.
커널 헤더 파일 또한 버전에 따라서 함수가 삭제가 되거나 추가될 수 있다. 만약 삭제되지 않은 매크로 함수나 인라인 함수를 사용하면 컴파일되겠지만 실행하더라도 예기치 못한 상황이 발생할 수 있고, 삭제된 매크로 함수나 인라인 함수를 사용하면 컴파일 에러가 뜨지 않을까 싶다.
그래서
리눅스 커널 소스를 다운로드하고 빌드하여 심볼 테이블과 커널 헤더 파일을 만들고 빌드한 리눅스 커널을 현재 시스템에 적용시키는 것이지 않을까?
틀린 점이 있다면 댓글 부탁드리겠습니다. 감사합니다.
'Linux > Linux Device Driver' 카테고리의 다른 글
디바이스 드라이버 / 동작 과정 (0) 2020.09.01 디바이스 드라이버 / 모듈 파일들의 정체 (0) 2020.09.01 디바이스 드라이버 / 실습 환경 설정 및 준비 (1) 2020.09.01 디바이스 드라이버 / 개발 방법 (0) 2020.09.01 디바이스 드라이버 / 헤더 파일별 함수 정의 (0) 2020.08.30