커널모드에서 동작하는 프로세스들에 대한 독립성? 에 대한 질문입니다.

sangpil의 이미지

안녕하세요 현재 회사에서 리눅스 커널모듈 개발 프로젝트를 진행하고 있습니다.

진행 중에, 다음 요구사항을 만족시켜야 하는데 마땅한 방안을 찾지 못해서 논의해보고자 이곳에 올리게 되었습니다.

  해당 모듈을 수행하는 프로세스 외에 타 프로세스에 의해서 간섭이 발생하지 않아야 한다.

여기서 말하는 간섭방지에 대한 예시는, 만약 모듈이 shared library이고 이를 사용하는 프로세스가 어플리케이션 프로그램 일 경우에 대해서 들어져 있습니다.

어플리케이션 레벨에서 동작하는 어플리케이션들이 서로 고유한 메모리 영역을 가지고 있어, A프로세스에서 B프로세스의 주소 영역을 참조하거나 값을 변경할 경우, 커널레벨에서 이를 잘못된 참조로 가정하고 프로세스를 종료시키기 때문에 이러한 잘못된 참조가 방지된다 (약간 다를 수 있으나 이러한 논지로 되어있습니다.)

그런데 커널 모드에서 동작하는 모듈이고 사용 주체가 커널 프로세스인 경우에는 이러한 독립성을 어떻게 보장할 수 있을까요??

제가 알기로는 커널 모드에서는 메모리에 대한 권한이 모두 동일하여 mprotect()과 같은 함수와 같이 메모리를 보호하는 함수는 없는 것으로 알고 있습니다.
(참고 http://security.stackexchange.com/questions/38384/mprotect-at-kernel-level)
따라서 모듈 내부적으로 추가구현을 해서 논리적으로 분리시켜야 할 것 같은데 해당 부분에 대한 구현은 어떤식으로 하면 좋을까요??

긴글 읽어주셔서 감사합니다~!!
참고로 커널모듈은 EXPORT_SYMBOL 키워드를 이용하여 심볼테이블에 함수를 등록시키면 다른 커널모듈에서 이를 참조하여 사용하는 방식으로 동작합니다.

Necromancer의 이미지

커널모드에서 돌아간다면 다 커널 내부에 들어가는 코드일테고 공유라이브러리 같은건 당연히 못씁니다.

프로세스마다 주소 달리한다는것은 페이징 처리하면 다 구현 됩니다. 같은주소라도 프로세스가 다르면 페이지의 물리메모리 매핑이 다를테고 그럼 프로그램 코드는 같은주소 접근한다 해도 실 메모리 주소는 달라집니다. 보통 코드는 같은 곳을 매핑하고(가능하다면 수정불가옵션까지 더하고) 데이터를 달리합니다. 그렇지만 권한이 많은 만큼 다른 프로세스 쉽게 접근할수 있고, 그만큼 조심해야겠죠.

Written By the Black Knight of Destruction