64비트 멀티코어책을 보고있는데 GDT 크기구하는 부분과 함수 호출시 SP이동에 대해 궁금한게 있어요.
안녕하세요.
64비트 멀티코어책 한장한장 곱씹어가며 읽고 있던중 리얼모드에서 보호모드로 넘어가는 부분에서 왜 이런 결과가 나왔는지 알수없는 부분이 있어 질문을 올립니다.
1. 보호모드로 넘어가기위해 GDTR을 설정할때 GDT 크기를 GDTEND - GDT - 1 로 구하는데요. - 1을 왜 하는지 모르겠습니다.
http://pasm.pis.to/ 에서 데모 하는쪽 마지막줄에 db print - halt 코드를 넣으면 4를 출력합니다.
우연히 아래 사이트를 찾았습니다.
http://iplusu.tistory.com/entry/OS-%EA%B5%AC%ED%98%84-%EC%8B%A4%EC%8A%B5-32%EB%B9%84%ED%8A%B8-%EB%B3%B4%ED%98%B8%EB%AA%A8%EB%93%9C-mongii
'끝부분'으로 검색하면 나오는 문단에 왜 -1을 하는지 얘기가 나오는데 더 헷갈리네요. 심볼이 1바이트를 차지하는건가? 라는 상상도 했습니다...
2. 아래 예제에서 지역변수 iReturn 공간 할당을 위해 SP를 8만큼 빼는데 왜 빼는지 모르겠습니다.
어차피 마지막에 BP를 이용해서 스택에 저장하는데...
//test.c int Add(int iA, int iB, int iC) { return iA + iB + iC; } int main() { int iReturn; iReturn = Add(1, 2, 3); } //test.s Add: push ebp mov ebp, esp mov eax, dword[ebp + 8] .... main: push ebp mov ebp, esp sub esp, 8 ; 지역변수 iReturn을 위한 공간 할당 ... mov dword [ebp - 4], eax
알아보려고 발버둥 치다가 신기한걸 봤어요(저는 신기하더라구요...왜는 못찾았지만 과정은 신기방기 ㅎㅎ)
64bit gcc 4.8
//test1.c //지역변수 4개 int add(int x, int y, int z, int q) { return x + y + z + q; } int main() { int iReturn; int x = 0; int y = 0; int z = 0; iReturn = add(1, 2, 3, 4); return 0; } //test1.s ... subq $16, %rsp ... //test2.c 지역변수 5개 ... int main() { int iReturn; int i = 0; int x = 0; int y = 0; int z = 0; iReturn = add(1, 2, 3, 4); return 0; } //test2.s ... subq $32, %rsp ...
질문 : GDT사이즈를 구하는데 왜 -1을 하나요?, 함수 호출전에 지역 변수 공간 할당을 위해 SP 레지스터 값을 변경하는 이유
읽어주셔서 감사합니다
자답입니다
답까지는 아니고 제 나름대로 알아본 결과입니다. : ) (이게 맞는건지도 모르겠네요..)
http://wiki.osdev.org/Global_Descriptor_Table
16비트가 0~65,535 인데, 실제 GDT는 65,536(최대갯수 8192 * 8 byte) 이므로 -1을 해준다고 하네요
스택은 제가 잘못생각한게 지역변수를 실제 사용할때 스택에 넣는다라는 생각을 했네요.
p.392 마지막 문단
https://books.google.co.kr/books?id=EvWrAwAAQBAJ&pg=PA392&lpg=PA392&dq=%EC%8A%A4%ED%83%9D+%ED%8F%AC%EC%9D%B8%ED%84%B0+%EA%B3%B5%EA%B0%84+%ED%95%A0%EB%8B%B9&source=bl&ots=yV3RjGkNFg&sig=aVgHd8DcTUhMSUsPkfUkpvfCHI4&hl=en&sa=X&ei=bBH1VKfQGcLQmwXwgII4&ved=0CDIQ6AEwAw#v=onepage&q=%EC%8A%A4%ED%83%9D%20%ED%8F%AC%EC%9D%B8%ED%84%B0%20%EA%B3%B5%EA%B0%84%20%ED%95%A0%EB%8B%B9&f=false
댓글 달기