os 공부 중 이해가 안되는 부분이 있네요.
글쓴이: Reper / 작성시간: 월, 2015/07/13 - 11:50오후
현재 os를 만들기 위해서 책을 보며 공부하고 있는데요.
lea esp, [pm_start-256] push dword user_data_selector push esp push dword 0x200 push dword user_code_selector lea eax, [user_process] push eax iretd
이 부분에서 pm_start가 커널 스택 영역의 주소이고 pm_start-256이 유저 스택 영역의 주소입니다.
esp에 pm_start-256의 주소를 넣음으로써 유저 스택 영역의 주소를 넣었음이 확실한데 ..
저자는 push 되는 부분부터 현재 esp에 커널 스택 주소(pm_start)가 들어있으며
push되는 값들이 모두 커널 스택에 쌓인다고 하네요.
무슨 말인지 납득이 가질 않는데... 혹시 도와주실 수 있으신가요 ?
Forums:
끝의 iretd를 못보셨군요.lea 명령 다음에
끝의 iretd를 못보셨군요.
lea 명령 다음에 나오는 push 명령들은 복귀할 user mode의 ss:esp, cs:eip 어드레스를 커널스택에 push합니다.
iretd 실행되면서 이들이 한꺼번에 pop 되고 cs:eip는 물론 ss:esp도 바뀝니다.
위의 경우는 유저모드 복귀 이후 esp는 pm_start-256의 값을 갖는게 맞지만 ss도 바뀌기 때문에 커널모드에서 참조하고 있는 그 주소인지는 장담 못합니다. 확인할려면 ss가 가리키는 세그먼트 디스크립터를 까봐야죠.
더불어서 커널스택과 유저스택은 보통 세그먼트 자체가 완전히 다르고 pm_start-256 하는 이유는 이 소스만으로는 알 수 없습니다.
아 앞의 push 명령 때문에 esp는 pm_start-260이 되겠군요. (4바이트가 더 빠짐)
커널스택과 유저스택은 같은 메모리 어드레스 쓰게 만들지도 않고요. 그렇게 했다간 보안상 문제 생깁니다.
덧붙어서 call(세그먼트까지 바뀌는 far call), ret, int, iretd 같은 명령은 목적지의 특권수준이 같을때와 다를 때의 동작 방식이 다릅니다.
Written By the Black Knight of Destruction
음.. 그러니깐
다른 부분에 대해서는 다 이해가 갑니다. 그런데 제 질문의 요지는 esp에 lea명령을 사용하여 유저 스택 영역의 주소(pm_start-256)를 넣고 바로 밑에서 push명령을 사용하는데 저자는 값들이 커널 스택 영역(pm_start)에 쌓인다고 설명을 하네요. esp에 유저 스택 영역 주소가 들어있으니 유저 스택에 쌓여야 하는데 왜 커널 스택에 쌓이는지 납득이 안갑니다 ...
그렇다면 커널모드와 유저모드에서 ss가 가리키는
그렇다면 커널모드와 유저모드에서 ss가 가리키는 디스크립터의 base address를 추적할 필요가 있겠네요.
base address가 같다면 같은 주소에 쌓이는게 맞고, 그렇다면 context switching이나 실행 후 결과값 반환 같은 뭔가의 작업이 있을것 같습니다.
님이 올리신 소스만으로는 판단할 수가 없습니다.
Written By the Black Knight of Destruction
그렇군요.. 답변 감사합니다 !
그렇군요.. 답변 감사합니다 !
댓글 달기