리눅스 커널에서 파일입출력을 할려고 합니다.
커널 모드에서 파일 입출력을 하고자 합니다.
커널 모듈에서는 성공했는데 커널 코드를 바로 수정해서 파일 입출력을 하고자 하였으나 2주동안 패닉화면만 무진장 보고 있습니다.
제가 하고자 하는것은 페이지 폴트 발생하여 인터럽트가 발생하게 되면 do_page_fault()로 가게 됩니다.
제가 지금 해야 되는것이 이 함수 안에서 System.map이라는 파일을 입출력을 해야됩니다.
계속 kernel BUG at sched.c:565!라고 뜨며 패닉이 발생하네요
원래 커널 모드에서는 파일 입출력이 되지 않는다고 해서 set_fs(KERNEL_DS)를 사용했고 sys_open이나 sys_filp을 사용하면서 계속 바꿔 봤는데 안되네요.
인터럽트 중에는 파일 입출력을 할수가 없는것인지 ... 아님 인터럽트가 걸리면 그전에 다른 루틴을 수행하고 가게 할수 있는지 .. 반대로 인터럽트가 끝나고 다른 특정 루틴을 실행하게 할수 있는지 .. 인터럽트 중에 커널 쓰레드를 생성할수 있는지 .. 인터럽트 중에 적재되어 있는 모듈을 사용할수 있는지 궁금합니다. 모듈은 파일 입출력을 구현해 놓은 모듈이고 커널 쓰레드를 생성할수 있는지 묻는것은 커널쓰레드 내에서는 시스템콜이 가능하다고 해서 혹시나 인터럽트 중에 커널 쓰레드를 생성해서 시스템콜을 사용하여 파일 입출력이 가능한지 볼려는 것입니다.
초보라서 모르는것이 너무 많아서 질문도 맞는지 모르겠네요..
어떤 방법이라도 됩니다.
리눅스가 페이지 폴트로 인한 인터럽트 발생시에(커널 모드에서 이며 패닉 발생시입니다.) System.map파일을 입출력 해야합니다.
context 루틴을....
Interrupt context routine에서 process context routine으로 바꿔보세요~
머리를 굴려라! 그래야 먹고 산다.
메모리에 미리...
메모리에 미리 읽어놓고, 필요할 때 참조만하는게 정답 같습니다.
built-in 되는 core 에서는 EXPORT_SYMBOL() 로 초기값 NULL 인 포인터만 노출하고,
간단한 모듈 작성하셔서 모듈 올라갈 때 메모리 할당하고 System.map 읽어서 복사한 다음 포인터에 연결만 해주면 ?
물론 참조할 때 NULL 인지 아닌지 반드시 검사하셔야겠지요.
눈치채셨겠지만, 사실 커널모드에서 파일 입출력할 필요도 없습니다.
OTL
댓글 달기