또 한가지 배웠습니다...그런데 제가 질문을 제대로 못한것 같습니다.
제가 구하고자 하는 답변을 정확히 다시 올리면...
1. 먼저 테스트용 프로그램을 비베로 만들어 임의 변수의 주소를 표시,
확인을 해 보니 제 컴에서는 그 변수의 실제주소값이 "0x15f1d0"이고,
이주소의 물리주소라고 하나요(?) 디버거 화면에서 "0x404700"으로 나왔는데,
"0x404700"이라는 이주소 값이 실행시 어떤 계산으로 실제의 "0x15f1d0"주소가
되는지 입니다.
2. 제대로 이해 못한점 죄송합니다.
혼자서 몇일을 해 봐도 도저히 저값이 나오지 않습니다.
번거러우시더라도 자세한 설명 한번 더 부타드림니다.
Visual Basic으로 만들어진 실행 파일은 P-Code라고 하는 중간 단계의 기계어 코드를
사용합니다. 따라서 Visual Basic 내에서 사용하는 주소 값이 실제 주소 영역과 매칭
되는 것을 보장하지 않습니다. Visual Basic으로는 원하는 결과를 얻으실 수 없을 듯
합니다.
0x15f1d0는 아마 Visual Basic Runtime Interpreter가 사용하는 주소영역에서의 옵셋
일 듯 합니다. 이 값은 CPU에서 바라보는 물리주소나 논리주소와는 아무 관계가 없습
니다.
질문이 이거였군요.
디버거에서 구할 방법은 직접 디버깅 중에 읽어보시면 되고요. (...)
실제 코드 수행중에는 다음과 같이 확인할 수 있습니다.
1. Code Selector의 값 (AX에 Code Selector가 들어감):
xor eax, eax
mov ax, cs
2. Offset:
lea eax, aStrpublic_0
Flat memory model이므로 CS는 Code Segment가 아닌 Code Selector로 정의하며
Selector에 대한 Descriptor Table을 참조해야 실제 물리 메모리 영역에 대한
매핑을 알 수 있습니다.
답변 감사합니다...그런데
또 한가지 배웠습니다...그런데 제가 질문을 제대로 못한것 같습니다.
제가 구하고자 하는 답변을 정확히 다시 올리면...
1. 먼저 테스트용 프로그램을 비베로 만들어 임의 변수의 주소를 표시,
확인을 해 보니 제 컴에서는 그 변수의 실제주소값이 "0x15f1d0"이고,
이주소의 물리주소라고 하나요(?) 디버거 화면에서 "0x404700"으로 나왔는데,
"0x404700"이라는 이주소 값이 실행시 어떤 계산으로 실제의 "0x15f1d0"주소가
되는지 입니다.
2. 제대로 이해 못한점 죄송합니다.
혼자서 몇일을 해 봐도 도저히 저값이 나오지 않습니다.
번거러우시더라도 자세한 설명 한번 더 부타드림니다.
Visual Basic의 경우 실제 주소 영역이 표시되지는 않을겁니다.
Visual Basic으로 만들어진 실행 파일은 P-Code라고 하는 중간 단계의 기계어 코드를
사용합니다. 따라서 Visual Basic 내에서 사용하는 주소 값이 실제 주소 영역과 매칭
되는 것을 보장하지 않습니다. Visual Basic으로는 원하는 결과를 얻으실 수 없을 듯
합니다.
0x15f1d0는 아마 Visual Basic Runtime Interpreter가 사용하는 주소영역에서의 옵셋
일 듯 합니다. 이 값은 CPU에서 바라보는 물리주소나 논리주소와는 아무 관계가 없습
니다.
ia32 기준으로
ia32 기준으로 햇을때
gdt나 ldt에 있는 descriptor를 통해서 거기에 있는 offset 값과 인덱스, 포인터 등등의 레지스터의 값을 더한후에 이것을 page를 통해서 다시 실제적인 물리주소를 구합니다.
intel 메뉴얼에 잘 나와있습니다. 시스템프로그래밍 어쩌구 저쩌구 1, 2권 이렇게 2권 나뉘어져있는데 1권만 보셔도 상관없고요
댓글 달기