64비트 멀티코어 OS 원리와 구조 진행기록 & 백업

Posted by ORANG(오랑)
2014.10.23 03:42
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

리눅스 프로세스 메모리 구조

Posted by ORANG ORANG(오랑)
2014.10.20 03:31 운영체제



env, etc & argc, argv 도 스택의 일부분


이 댓글을 비밀 댓글로

x86_64(64비트) 모드, 주소 변환 과정

Posted by ORANG ORANG(오랑)
2014.10.20 03:30 운영체제


64비트 모드 주소 변환 과정

 

 64비트 모드 세그먼테이션 과정은 32비트 모드와 동일하게 진행되는데, 차이점으로 주소 공간이 확장되어 세그먼트 디스크립터에 설정된 기준 주소와 크기에 관계없이 모든 세그먼트가 기준 주소는 0, 크기는 64비트 전체로 설정됩니다.

 선형 주소의 주소 영역 자체가 0부터 64비트 전체가 되는 것이죠

 

 

페이징 기법을 통한 주소 변환

 

5단계 페이징 기법을 예로 보겠습니다. 

 


 

 

글자가 길어서 헷갈리므로 그냥 편의상

페이지 맵 레벨 4 = PML4

페이지 디렉토리 포인터 = PDP

페이지 디렉토리 = PD

페이지 테이블 = PT라 하면

 

  1. CR3 레지스터가 PML4 테이블의 기준 주소를 가리킵니다.
  2. PML4 테이블 기준 주소 + 선형 주소의 PML4 오프셋 = PML4 엔트리
  3. PML4 엔트리가 PDP 테이블의 기준 주소를 가리킵니다.
  4. PDP 테이블 기준 주소 + 선형주소의 PDP 테이블 오프셋 = PDP 엔트리
  5. PDP 엔트리가 PD 테이블의 기준주소를 가리킵니다.
  6. PD의 기준주소 + 선형주소의 PD 오프셋 = PD 엔트리
  7. PD엔트리가 PT의 기준 주소를 가리키고
  8. PT의 기준 주소 + 선형주소의 PT 오프셋 = PT 엔트리
  9. PT 엔트리가 페이지의 기준 주소를 가리키고
  10.  페이지의 기준 주소 + 선형 주소의 오프셋 = 물리 주소 가 됩니다.

 



이 댓글을 비밀 댓글로

x86(32비트) 모드, 주소 변환 과정

Posted by ORANG ORANG(오랑)
2014.10.20 03:28 운영체제

32비트 모드에서의 가상 주소 -> 선형 주소 -> 물리 주소 변환 과정

 

 

가상 주소를 선형 주소로 변환하는 과정(세그먼테이션)

 

GDTR 레지스터 -> GDT의 크기 필드와 기준 주소 필드로 구성 -> GDT의 기준 주소

세그먼트 셀렉터의 구조 



index는 GDT 또는 LDT 상에서의 위치를 나타내고,TI 비트는 GDT인지 LDT인지를 구분합니다.

 

GDTR로부터 GDT의 기준 주소와 세그먼트 셀렉터의 index를 통해 -> 세그먼트 디스크립터에 접근합니다.

세그먼트 디스크립터에는 세그먼트 기준 주소와 기타 정보가 포함되어있는데

세그먼트 기준 주소 + 논리주소값(오프셋) = 선형주소 가 됩니다.

 






 

 

 

선형 주소를 물리 주소로 변환하는 과정(페이징) 

  1. CR3 레지스터가 페이지 디렉터리 테이블의 기준 주소를 가리킨다.
  2. 페이지 디렉토리 테이블의 기준 주소 + 선형주소의 페이지 디렉토리 오프셋 = 페이지 디렉터리 엔트리
  3. 페이지 디렉터리 엔트리가 페이지 테이블의 기준 주소를 가리키고
  4. 페이지 테이블의 기준 주소 + 선형 주소의 페이지 테이블 오프셋 = 페이지 테이블 엔트리
  5. 페이지 테이블 엔트리는 페이지 기준 주소를 가리킨다.
  6. 페이지 기준 주소 + 선형주소의 오프셋 = 물리주소 가 됩니다.

 

 

 

전체적인 그림을 보면… 

 

 

  


이 댓글을 비밀 댓글로

64비트 주소를 상위 32/하위 32비트로 나누어 표현

Posted by ORANG ORANG(오랑)
2014.10.20 03:26 운영체제

64비트 주소를 상위 32비트/하위 32비트로 나누어 표현하는 방법


코드로 볼 때는 헷갈렷는데.. 정리하고나니 너무 간단하네요 

메모리를 읽을때 2진수로 읽는 건 알아보기 힘들고 비효율적이므로 2진수 숫자 4개를 묶어 16진수로 표현한 후, 16진수로 읽습니다. 1바이트는 8비트이므로, 1바이트당 16진수 2개로 표현할 수 있겠네요

 

64비트는 8바이트가 됩니다. 1바이트씩 나누어 표현해서 그림과 함께 보겠습니다.

상위 32비트 / 하위 32비트는 각각 4바이트가 되겠네요





 

음.. 1바이트는 8비트이고 4비트씩 16진수 한개로 묶어 16진수 2개로 표현한다고 했습니다.

그럼 바이트 단위로 보았을때,  256 = 16^2 = 2^8만큼 차이가 나겠죠?

간단한 것이지만 예를 들어보자면.. 0x01과 0x0100 처럼 말이죠

 

 

 

 

 

간단하게, 같은 원리 입니다.

 

 

하위 32비트와 상위 32비트는 2^32 차이가 나겠죠?

 

64비트 주소값 = (하위 32비트 주소값 + 상위 32비트 주소값 * 2^32) 가 됩니다.

반대로 생각하면.. 

상위 32비트 주소값 = 64비트 주소값/2^32 = 64비트 주소값>>32 가 됩니다.

 

32비트 주소값을 하위 16비트, 상위16비트로 표현하는 것도 같은 원리입니다. 



이 댓글을 비밀 댓글로