커널모드 프로세스 독립성? 에 대한 질문입니다.
안녕하세요 현재 회사에서 리눅스 커널모듈 개발 프로젝트를 진행하고 있습니다.
진행 중에, 다음 요구사항을 만족시켜야 하는데요.
해당 모듈을 수행하는 프로세스 외에 타 프로세스에 의해서 간섭이 발생하지 않아야 한다.
여기서 말하는 간섭방지에 대한 예시는, 만약 모듈이 shared library이고 이를 사용하는 프로세스가 어플리케이션 프로그램 일 경우에 대해서 들어져 있습니다.
어플리케이션 레벨에서 동작하는 어플리케이션들이 서로 고유한 메모리 영역을 가지고 있어, A프로세스에서 B프로세스의 주소 영역을 참조하거나 값을 변경할 경우, 커널레벨에서 이를 잘못된 참조로 가정하고 프로세스를 종료시키기 때문에 이러한 잘못된 참조가 방지된다 (약간 다를 수 있으나 이러한 논지로 되어있습니다.)
그런데 커널 모드에서 동작하는 모듈이고 사용 주체가 커널 프로세스인 경우에는 이러한 독립성을 어떻게 보장할 수 있을까요??
제가 알기로는 커널 모드에서는 메모리에 대한 권한이 모두 동일하여 mprotect()과 같은 함수와 같이 메모리를 보호하는 함수는 없는 것으로 알고 있습니다.
(참고 http://security.stackexchange.com/questions/38384/mprotect-at-kernel-level)
따라서 모듈 내부적으로 추가구현을 해서 논리적으로 분리시켜야 할 것 같은데 해당 부분에 대한 구현은 어떤식으로 하면 좋을까요??
긴글 읽어주셔서 감사합니다~!!
참고로 커널모듈은 EXPORT_SYMBOL 키워드를 이용하여 심볼테이블에 함수를 등록시키면 다른 커널모듈에서 이를 참조하여 사용하는 방식으로 동작합니다.
본 글은 이슈 게시판에도 올려 두었습니다~!
손수 프로그래밍 하는 수밖에 없을 것 같습니다.
int owner_tid;
....open()
if (!owner_tid)
owner_tid = 현재 프로세스 tid; 혹은 pid
else
return -EBUSY;
이렇게 하면 그 모듈은 한개의 프로세스만 사용하고
나머지 놈들은 사용 못하게 구현하면 되지 않을까요?
네, 답변 감사합니다.
네 그렇게 구현을 할 수 있다면 될 것 같습니다만, 조금 문제가 있습니다.
본문에 제대로 명시되어 있지 않은데요
현재 모듈의 인터페이스가 EXPORT_SYMBOL 을 이용하여 API를 전역 참조시키고,
이를 사용하는 커널 프로세스(모듈)에서 해당 함수를 extern 하여 사용하도록 되어 있습니다.
이 경우에 커널 프로세스의 tid 혹은 pid를 알 수 있는 방법이 있을까요??
인터넷 검색이 부족한 건지 해당 방법을 찾을 수 없었습니다..
current->tgid;current->gid;
current->tgid;
current->gid;
다른 모듈에서 사용할 수 있도록 EXPORT_SYMBOL 시킨다는 것은
그 개발하는 EXPORT 된 함수를 호출하는 경로를 통해서
여러 프로세스에서 접근 할 수 있을 것입니다.
프로세스라는 의미가 들어가는 것으로 보아서
유저스페이스에서 어떠한 액션이 올 것이라 생각 되는데요.
저는 단순히 액션이 오직 한 프로세서만 가능하도록하면 되는 것 아닐까 쉽게 생각합니다..
위에서 말씀 하신 커널 프로세스 = 모듈 은 아니라고 생각 되어지네요
모듈에서 커널 쓰레드를 사용한다는 말이신지?
아니면 다른 커널 쓰레드에서 EXPORT 된 함수를 호출 하게 된다는 건지요?
구현하시는 모듈의 복잡성을 모르겠습니다만,
단순한 구조로 가는 것도 어떠신지요 ㅎㅎ
EXPORT_SYMBOL로 선언된 API는 외부 모듈에 의해서 참조될 예정입니다.
네, 말씀해 주신 부분에서 커널 프로세스 = 모듈이 맞습니다.
다른 제 3의 모듈에서 커널 쓰레드 등을 이용하여 API를 호출하여 사용할 예정었습니다.
이런 경우에는 해당 요구사항을 충족시키기는 어려울 까요??
댓글 달기