시스템 콜 관련하여 개념 질문좀 드립니다.
글쓴이: happyKYS / 작성시간: 월, 2012/08/27 - 5:21오후
안녕하세요 아무쪼록 답변 부탁드립니다 .꾸벅(__)
시스템 콜을 구현하고, 래퍼 루틴을 구현한 뒤, user 영역에서 라이브러리를 통해 시스템 콜과 연계된 함수를 수행하면, 해당 라이브러리 래퍼 루틴에서 system call 인터럽트를 걸면서 결과적으로 시스템 콜 함수가 수행되는 것으로 알고 있습니다.
간단히 생각해보면 단순히 유저 영역에서 커널 영역 접근을 할 수 없으니까, 시스템 콜을 통해 원하는 행동을 하는 것이므로, 역으로 생각해보면 커널 영역의 코드라면 sys_mknod() 와 같이 시스템 콜 함수를 직접 호출해서 사용할 수 있지 않을까? 라고 생각했었는데 놓치는 부분이 있는지 저런 방식은 할 수 없더군요.
시스템 콜 전에 유저 영역의 값에 대한 선 처리라던지 하는 부분과 시스템 콜 구현부 자체가 유저 영역으로의 서비스를 위해 작성된 것이기 때문에 그럴수도 있겠다.. 라는 생각도 들지만, 좀 더 명확하게 "커널 소스에서 시스템 콜을 직접 호출해서 정상적인 동작을 바랄수는 없다"에 대한 이유를 알고 싶습니다. 아시는 고수분은 답변좀 부탁드립니다.
감사합니다.
Forums:
흠
고수는 아니지만 제가 이해하는바로는...
시스템콜은 말씀하신대로 유저 영역으로의 서비스를 위해 있는 인터페이스 이기때문에
커널영역에서 시스템콜을 호출하기위한 래퍼루틴이 만들어진게 없어서 사용할수가 없을겁니다
하지만 결국 시스템콜도 어쨋든 커널모드상에서 코드가 수행되는것이므로 인터페이스는 억지로 만든다면
만들수 있을겁니다. 하지만 그럴 필요가 없죠
만약 커널모드로만 수행되는 커널쓰레드를(커널 자체를) 작성하시는 것이라면
이미 커널의 모든 코드들을 수행할수 있는데 구지 권한상승을 시켜주는 시스템콜을 이용할 필요가 없을것이고...
또만 만약 setreuid 를 예로 든다면, 순수한 커널코드상에서 이런 시스템콜이 사용되는 상황이 없죠
real, effective user ID 를 set 하는 시스템콜인데 이건 user application 이 아니면 개념적으로 해당이 안되니까요
read/write 같은 경우도 어떤 file descriptor 에 읽고 쓰느냐? 라는 상황이 존재해야 하는데, file descriptor 가 유저모드 프로그램
마다 독립적으로 존재하니까 유저모드자체가 없는 순수 커널코드에서는 file descriptor 를 어떻게 명시할지 난감한거죠...
유저컨텍스트에서 진입할 커널코드를 작성하시는거라면(핸들러 함수나 모듈 등) 문제가 달라지지만
구지 커널코드에 진입한다음 거기서 시스템콜을 또 부를 바에야 애초에 해당 코드에 진입할 유저코드에서
시스템콜을 호출하는게 더 효과적일테니까요
시스템콜은 해당 콜을 호출하는 유저 프로그램의 context 를 대부분 그대로 가져갑니다
context 전환에 대해서 알아보시다 보면 도움이 되지 않을까 싶네요
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
댓글 달기