x86 환경에서 Kernel Mode -> User Mode 전환시
글쓴이: awdxawdx101 / 작성시간: 일, 2019/12/22 - 4:28오후
x86 환경에서 Kernel Mode -> User Mode 전환시 Kernel stack이 모두 초기화 되어서 문제가 생기고, 이 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용한다고 합니다.
초기화 때문에 문제가 발생하는 거라면, 초기화하지 않으면 되는거 아닌가요?
왜 굳이 초기화를 해서 문제를 만드는지 궁금합니다.
또 초기화하지 않으면 생기는 문제가 있는건가요?
Forums:
커널 스택을 초기화하면 어떤 문제가 생기나요?
> Kernel stack이 모두 초기화 되어서 문제가 생기고
Kernel stack은 커널 공간의 프로세스의 스택을 말씀하시는 것 같은데요.
문제가 생겼다(문제가 생기고)고 하셨는데 구체적으로 어떤 문제인지 알려주셔야 적절한 답을 드릴 수 있을 것 같아요.
(개인블로그)
http://rousalome.egloos.com
저도 그걸 몰라서 질문드렸습니다 ㅎㅎ.. signal
저도 그걸 몰라서 질문드렸습니다 ㅎㅎ.. signal handler 설명에 이렇게 적혀있는걸 봤습니다.
아니면 발생할 수 있는 문제가 여러가지인가요?
원문 : https://www.lazenca.net/display/TEC/01.SROP%28Sigreturn-oriented+programming%29+-+x86
유저 모드에서 실행 중이었던 레지스터 세트를 저장하기 위한 동작이군요.
위에서 언급하신 내용을 조금 더 부연해 설명을 드립니다.
>User Mode에서 Kernel Mode로 진입시 User Mode에서 사용중이던 context를 Kernel stack에 저장합니다.
유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트는 (커널 공간에 있는) 프로세서의 스택 공간에 저장합니다.
>Kernel Mode에서 User Mode로 진입시 Kernel stack은 모두 초기화됩니다.
커널 모드에서 유저 모드로 진입을 할 때 (커널 공간에 있는) 프로세서의 스택 공간에 저장된 유저 공간에서 실행 중인 레지스터 세트를 다시 로딩합니다.
이때 (커널 공간에 있는) 프로세서의 스택 공간에 저장된 유저 공간에서 실행 중인 레지스터 세트는 초기화됩니다.
>이러한 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용합니다.
위에서 설명한, 시그널을 처리할 때 예전에 유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트를 유저 모드의 스택 공간에 다시 저장합니다.
이 이유는 시그널 핸들러를 호출하고 난 후 유저 모드에서 커널 모드로 바뀔 때 유저 공간에서 실행 중인 레지스터 세트를 다시 백업하기 위해서입니다.
(개인블로그)
http://rousalome.egloos.com
답변 감사합니다.
답변 감사합니다.
여기서 제가 궁금한건, 초기화를 해서 생기는 "문제"라는게 어떤 문제인지, 또 이게 초기화가 원인이라면 초기화를 안하면 되는것 아닌지, 초기화를 안했을 때 생기는 문제가 무엇인지 궁금합니다.
혹시 이 궁금증에 대한 힌트를 얻을만한 도움이되는 사이트나 필요한 공부가 있나요?
아래 블로그의 글을 참고하시면 어떨까요?
시그널에 대한 전반적인 실행 흐름은 아래 블로그에 잘 정리돼 있고;
http://studyfoss.egloos.com/5182475
세부 커널 동작에 대해서는 제 블로그에 포스팅된 글을 보셔도 좋습니다.
http://rousalome.egloos.com/10002469
(개인블로그)
http://rousalome.egloos.com
댓글 달기