커널영역에서의 무한루프에 대한 질문들
리눅스 2.6.x 커널에서 커널모듈의 init 함수에서 while(1); 을 하고
insmod 로 모듈을 올리면 시스템 전체가 멈춰버립니다
하지만 윈도우7 pro edition 에서 sys 파일의 DriverEntry 내에서 while(1); 을 하고 드라이버를 올리면
시스템 전체가 매우 느려지긴 하는데 아예 멈추지는 않습니다.
질문 1. 위 두 경우는 왜 차이가 날까요? 두 케이스에서 내부적으로 무슨일이 일어나는걸까요?
질문 2. 리눅스에서 insmod 로 모듈을 올린경우 init 함수는 insmod 프로세스의
context 상에서 수행되는 커널영역의 코드인데, 거기서 무한루프가 돈다고해도
왜 시스템 전체가 멈춰야 할까요? 하드웨어 타이머 인터럽트에 의해서 자동으로 스케줄 되어야하는거 아닌가요?
혹시 커널영역에 진입할때 인터럽트를 비활성화한다음 무한루프에 빠져서 그런걸까요?
질문 3. Windows 3.1 같은 non preemtive kernel 의 경우 프로세스가 직접 커널의 schedule 함수를 호출해줘야
스케줄이 되고, 그렇지 않으면 다른 프로세스들이 수행되지 못한다는 글을 봤는데,
그러면 프로그래머가 프로그램 내부에 시스템콜같은걸로 직접 schedule 함수를 호출하는 코드를
넣어주면서 코딩을 해야하는건가요?
질문 4. 리눅스 커널의 경우 옜날에는 non preemtive 였다가 요즘은 preemtive 로 바뀐것 같은데
어느 버전부터 달라진건가요?, 아니면 한번에 갑자기 바뀐게 아니라 서서히 달라진건가요?
질문1이 저두 궁금 죄송합니다. 쓸데없는 답글이라서
질문1이 저두 궁금합니다.
죄송합니다. 쓸데없는 답글이라서 ㅠㅠ
인생은 도박이다.
micro kernel 에 대해서 잠깐
micro kernel 에 대해서 잠깐 공부해보세요.
windows 가 micro kernel 이라는 주장을 하는 것은 아닙니다.
nt kernel 이 micro kernel 이라는 주장을 어디서 본 적은 있습니다만, 어쨌든간에 비슷한 특성이 있으니 이런 주장도 할 수 있는 거겠죠.
windows 3.1 은 DOS 커널에서 돌아가던 GUI framework 입니다.
DOS 커널 위에서 돌아가던, command.com 을 두어개 띄운다는 등의 거의 완전체에 도전하는 장난스런 어플이 이미 있었습니다.
windows 3.1 은 MS-DOS 커널이 제공하는 "램상주종료"를 좀 더 진지하게 framework API 를 만들어 제공하고, 제한적인 환경에서 그 동작을 보증하는 것일 거라 생각됩니다.
제가 봤던 것은 trumpet TCP/IP 였던가... 하여간 TCP/IP 스택을 구현한 거였습니다.
multi tasking 이 가능하냐 불가능하냐의 의미로 pre-emption 이라는 단어를 사용하시는 거라면,
linux 가 non pre-emption 이었던 적은 없습니다.
지금도 대부분의 Linux 배포본 커널에선 pre-emption 옵션이 꺼진 상태입니다.
어쨌든... 이 옵션은 패치 형태로 존재하다 합병됐습니다.
그 옵션이 뭔지, 합병된 시기는 언제인지는 검색하시면 아실 수 있고요.
댓글 달기