메모리 관리(Segmentation + Paging) I Study+more

메모리 관리 정리.

KPROCESS.DirectoryTavleBase[2]에 CR3와 동일한 값을 저장.
프로세스 컨텍스트 스위칭 시 마다 KPROCESS의 내용으로 CR3갱신.
쓰레드들은 프로세스의 정보를 공유하기 때문에 쓰레드 컨텍스트 스위칭 시에는
CR3내용을 갱신하지 않음.

..정리한 내용이 없군하..- _;

Q&A.

1. 페이지 엔트리를 지정하기 위해서 가상 주소(VirtualAddress)를 3개로 나눈 이유는? 4개 이상으로 나누면 안되남?
:: 페이지 프레임의 크기를 4kb로 잡았기 때문에, offset은 12비트(2^12 = 4k)를 설정하고, 최대 4G(32비트 기준)을 엑세스 할수 있어야 함으로 10bit씩 나누어서 |10bit|10bit|12bit| 로 정함.
>>|5bit|5bit|5bit|5bit|12bit| 하면 안될 이유는 뭐냠?
>>|12bit|8bit|12bit| 해도 되는고만..

2. 페이지 테이블들이 동일한 페이지 프레임을 가리키지 않게 하는 방법은? (윈도우즈 인터널스 429페이지 하단.. 번역이..ㅠ_ㅜ)

3. 프로세스 컨텍스트 전환시 (메모리 관리에 한정지어서)바뀌는 내용은 무엇인가? (페이지 디렉토리의 시작주소, 세그먼트 등)

4. GDTR에서 Limit(16bit사이즈) 는 어디에 이용하는가?

5. CPL, DPL, RPL 의 특권레벨은 무엇을 의미하나?

6. 세그먼트 디스크립터의 속성 비트중에서 Base bit는 32bit의 영역을 지정할수 있다. 그렇다면 4Kb로 나뉘어진 페이지의 경계를
무시할수 있는가?

Microsoft (R) Windows Debugger Version 6.8.0004.0 X86
Copyright (c) Microsoft Corporation. All rights reserved.

Opened \\.\pipe\xcom1
Waiting to reconnect...
Connected to Windows 2000 2195 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: srv*C:\WebSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 2000 Kernel Version 2195 (Service Pack 4) UP Free x86 compatible
Product: WinNt
Kernel base = 0x80400000 PsLoadedModuleList = 0x8046e1b8
Debug session time: Tue Dec  4 16:57:43.151 2007 (GMT+9)
System Uptime: 0 days 0:03:17.113
WARNING: Inaccessible path: 'C:\WINDDK\Projects\call_stack'
Break instruction exception - code 80000003 (first chance)
*******************************************************************************
*                                                                             *
*   You are seeing this message because you pressed either                    *
*       CTRL+C (if you run kd.exe) or,                                        *
*       CTRL+BREAK (if you run WinDBG),                                       *
*   on your debugger machine's keyboard.                                      *
*                                                                             *
*                   THIS IS NOT A BUG OR A SYSTEM CRASH                       *
*                                                                             *
* If you did not intend to break into the debugger, press the "g" key, then   *
* press the "Enter" key now.  This message might immediately reappear.  If it *
* does, press "g" and "Enter" again.                                          *
*                                                                             *
*******************************************************************************
nt!RtlpBreakWithStatusInstruction:
80456488 cc              int     3
kd> bl

kd> bl

kd> bl

kd> bl

kd> lm
start    end        module name
80400000 805a3a00   nt         (pdb symbols)          C:\WebSymbols\ntoskrnl.pdb\3EE650B31\ntoskrnl.pdb

Unloaded modules:
bcb37000 bcb5c000   kmixer.sys
bcdfb000 bce08000   DMusic.sys
bce0b000 bce19000   swmidi.sys
bd804000 bd819000   VGA.dll
bd801000 bd819000   vpc-s3.dll
f3d20000 f3d29000   redbook.sys
f3f78000 f3f7d000   Cdaudio.SYS
f40c4000 f40c7000   Sfloppy.SYS
//파일 생성 이벤트 발생시 break
kd> bu zwcreatefile
kd> g
Break instruction exception - code 80000003 (first chance)
*******************************************************************************
*                                                                             *
*   You are seeing this message because you pressed either                    *
*       CTRL+C (if you run kd.exe) or,                                        *
*       CTRL+BREAK (if you run WinDBG),                                       *
*   on your debugger machine's keyboard.                                      *
*                                                                             *
*                   THIS IS NOT A BUG OR A SYSTEM CRASH                       *
*                                                                             *
* If you did not intend to break into the debugger, press the "g" key, then   *
* press the "Enter" key now.  This message might immediately reappear.  If it *
* does, press "g" and "Enter" again.                                          *
*                                                                             *
*******************************************************************************
nt!RtlpBreakWithStatusInstruction:
80456488 cc              int     3
//노트패드에서 파일 저장시 break 걸림.
kd> bl
 0 e 80400a46     0001 (0001) nt!ZwCreateFile

kd> g
Breakpoint 0 hit
nt!ZwCreateFile:
80400a46 b820000000      mov     eax,20h

덧글

  • WERT 2007/12/11 21:29 # 답글

    윈디버거를 써보고 싶은데 인트라넷 컴퓨터에 윈디버거가 깔려봐야 심볼서버를 설정할 수 가 없으니 .. 안습이에요 ㅠ.ㅠ
  • 승네군 2007/12/12 08:48 # 삭제 답글

    아.. 밖으로 접속이 안되나? (접속이 되면.. 심볼을 통짜로 받아올수 있는걸로 아는데.. 웹 심볼 말고..)
  • 나쯔 2008/01/02 10:42 # 답글

    음.. 밥때가 되었나..

    윈디버거가 무슨 새로나온 버거이름인줄 알았다.
  • 승네군 2008/01/02 12:54 # 삭제 답글

    - _-.. 바람부는 버거...?!..인줄 알았단 말이냐.
    그나저나 31일은 어케 잘 지냈삼-0-?
  • wisdomtuya 2008/01/15 22:22 # 삭제 답글

    1. 가상주소를 나누는건 OS마다 다릅니다. 4개로 나누기도하고, 2개로 나누기도 합니다.
    4k는 디스크 관리 단위이기도 하며, 현재 가장 효율적으로 사용할수 있는 단위입니다.
    2. pass
    3. OS마다 다르지만 Intel 32bit process 하드웨어 기준으로보면 메모리와 별로 관계가 없는걸로 알고 있습니다.
    4. GDTR의 limit은 GDT의 byte Size입니다.
    5. CPL(Current Privilege Level) : 현재 실행주인 태스크의 특권 레벨입니다.
    DPL(Description Privilege Level) : 디스크립터를 통한 세크먼트영역의 특권 레벨입니다.
    RPL(Requested Privilege Level) : 유저 영역에서 커널 영역을 엑세스 할때 이전의 특권 레벨을 저장하고 무분별한 데이터 엑세스를 방지합니다.
    6. 무시한다는 개념을 넣을 수 없습니다. cr0 레지스터에 페이징의 시작이 체크되면 모든 주소는 VirtualAddress를 사용함으로 전부 페이징의 대상이 됩니다.
  • wisdomtuya 2008/01/15 22:22 # 삭제 답글

    다 맞는지 모르겠네욤 냠냠
  • 승네군 2008/01/16 08:57 # 삭제 답글

    천...천잿!
    1. 왜 효율적인가요? 32bit니까 4K라서-.-?
    4. GDTR의 리미트를 어디에 쓰는지가 궁금해서요. 어차피 셀렉터가 GDT의 인덱스를 가리키는데 리미트를 비교하고 가리키는것도 아닐테고..(설마.. 비교한 다음에 가리키는건가- _;)
    6. 페이징은 물리 메모리를 4K씩 나누는것....아!. 물리메모리가 페이징을 통해서 선형 주소로 바뀌고 그 선형 주소를 세그멘테이션을 통해서 가상 주소로 바뀌는 거였죠!.. 허걱.. 난 왜 가상 주소를 세그멘테이션을 통해서 물리 메모리로 바뀐다고 생각하고 있었던거지...=.=;

    도움 주셔서 감사 합니다.(__)
댓글 입력 영역