메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Memory: 두 판 사이의 차이

noriwiki
Pinkgo (토론 | 기여)
Pinkgo (토론 | 기여)
17번째 줄: 17번째 줄:
* word size는 CPU와 메모리간에 주고받을 수 있는 data의 가장 큰 data 크기이다.  
* word size는 CPU와 메모리간에 주고받을 수 있는 data의 가장 큰 data 크기이다.  
* word size는 메모지 address의 크기이다.
* word size는 메모지 address의 크기이다.
옛날에는 대부분의 machine은 32-bit word를 사용했다. 따라서 address또한 4byte로 구성되며, 그 범위는 0 ~2<sup>32</sup>-1에 해당한다.<ref>다른 말로 하면 해당 메모리 공간은 2<sup>32</sup>개의 byte를 저장할 수 있다.</ref>
옛날에는 대부분의 machine은 32-bit word를 사용했다. 따라서 address또한 4byte로 구성되며, 그 범위는 0 ~2<sup>32</sup>-1에 해당한다.<ref>다른 말로 하면 해당 메모리 공간은 2<sup>32</sup>개의 byte를 저장할 수 있다.</ref> 하지만 요즘은 대부분의 machine이 64-bit word를 사용한다. 따라서 address또한 8byte로 구성되며, 그 범위는 0 ~2<sup>64</sup>-1에 해당한다.<ref>다른 말로 하면 해당 메모리 공간은 2<sup>64</sup>개의 byte를 저장할 수 있다.</ref>
 
요즘은 대부분의 machine이 64-bit word를 사용한다. 따라서 address또한 8byte로 구성되며, 그 범위는 0 ~2<sup>64</sup>-1에 해당한다.<ref>다른 말로 하면 해당 메모리 공간은 2<sup>64</sup>개의 byte를 저장할 수 있다.</ref>


==Endianness==
==Endianness==

2025년 4월 20일 (일) 16:32 판

상위 문서: 컴퓨터 시스템

개요

파일:MemoryAddress.png

memory(메모리)는 개념적으로 a large array of bytes를 의미한다. 이때 각각의 byte는 그에 대한 address를 가지고 있다.[1] 또한 메모리에 있는 데이터는 CPU와 주고받아지며, 이를 통해 프로그램이 메모리에 address를 사용하여 접근할 수 있다. 이때 다음과 같은 특성을 가진다.

  • 프로그램은 다수의 byte에 동시에 접근할 수 있다. 예를 들어 0x200에서 시작하는 4개의 bytes 정보들을 로드할 수 있다.
  • C에서의 pointer 변수는 address 값을 의미한다.
  • 모든 address가 사용되는 것은 아니며, 사용되지 않는 주소값에 접근하면 오류가 발생한다.
  • 각각의 동작하는 프로그램은 private address space를 가지며, 해당 space에는 다른 프로그램이 접근할 수 없다.

Machine Word

파일:Size of Data types.png
Size of Data types

컴퓨터는 CPU가 가장 효율적으로 다룰 수 있는 data의 크기인 word size를 가지고 있다. 이는 다음 세가지 중요한 의미를 가진다.

  • word size는 CPU의 register 크기이다.
  • word size는 CPU와 메모리간에 주고받을 수 있는 data의 가장 큰 data 크기이다.
  • word size는 메모지 address의 크기이다.

옛날에는 대부분의 machine은 32-bit word를 사용했다. 따라서 address또한 4byte로 구성되며, 그 범위는 0 ~232-1에 해당한다.[2] 하지만 요즘은 대부분의 machine이 64-bit word를 사용한다. 따라서 address또한 8byte로 구성되며, 그 범위는 0 ~264-1에 해당한다.[3]

Endianness

컴퓨터가 bit들을 저장하는 byte ordering을 endianness라고 한다. 자세한 내용은 endianness를 참조하십시오.

push instruction

push Src는 특정값을 스택에 저장하는 함수이다.

push Src
  1. Src의 값을 계산한다.(해당 예제에서는 %rax 사용)
  2. %rsp를 8만큼 감소시킨다.
  3. %rsp가 가리키는 주소에 src의 값을 저장한다.

이때 %rsp는 스택 포인터이기 때문에, push 연산을 통해서 스택에 접근하여 값을 쓸 수 있다. 예를 들어 %rsp = 0x2000, %rax = 0x10일 때 다음과 같은 코드가 주어진다면,

push %rax
  1. %rsp는 0x1ff8로 감소하고
  2. 0x10이 0x1ff8 주소에 저장된다.

pop instruction

pop Reg는 스택에서 값을 꺼내오고, 이를 레지스터에 저장하는 함수이다.

pop Reg
  1. %rsp가 가리키는 주소에서 값을 읽는다.
  2. %rsp를 8만큼 증가시킨다.
  3. 읽은 값을 Reg에 저장한다.

이때 %rsp는 스택 포인터이기 때문에, pop 연산을 통해서 stack에 접근하여 값을 읽을(쓸) 수 있다. 예를 들어 %rsp = 0x2000, 이고 해당 주소에 0x100이 저장되어 있을 때 다음과 같은 코드가 주어진다면,

push %rbx
  1. %rsp는 0x2008로 증가하고
  2. %rbx는 0x100이 된다.

각주

  1. 즉, address는 메모리의 array의 index에 해당한다.
  2. 다른 말로 하면 해당 메모리 공간은 232개의 byte를 저장할 수 있다.
  3. 다른 말로 하면 해당 메모리 공간은 264개의 byte를 저장할 수 있다.