<aside> 💡 목차


</aside>

실제 사용 가능 메모리 범위

<aside> 💡 왜 MIPS메모리 사용 가능 범위는 ffff ffff 가 아니라 7fff ffff 까지임?


→ 전체 주소 내에선 여러가지 rom,I/O 등이 메모리 내에 맵핑이 되어서, 순수하게 메모리로만 사용하는 번지는 실제보다 적을 수 밖에 없다

$sp 7fff ffff Stack 재미있는 사실. 스택 포인터는 메모리상에서 -값을 가진다
⬇️ push 할때마다 메모리가 줄어든다
💥 두 영역이 겹치면 이제 overflow발생!!!
⬆️ malloc같이 사용할때마다 메모리가 증가든
Dynamic data 변수값 (함수가 종료되면 메모리에서 사라짐) (다시 쓸 일 없어서)
$gp 1000 8000 Static data 변하지 않는 상수들
1000 0000 Text 프로그램 code를 말함.. 실행하는 코드 바이너리
pc 0040 0000 Reserved 운영체제가 쓰려고 예약해둔 영역
0000 0000 ex) rom,입출력장치
</aside>

<aside> 💡 이유

MIPS 메모리 사용 가능 범위 = 32비트 주소 공간 크기 - 커널 공간 크기
MIPS 아키텍처는 32비트 아키텍처입니다. 즉, 32비트 주소를 사용하여 메모리에 액세스합니다. 32비트 아키텍처에서 메모리 주소는 32비트 이진수로 표시되므로 2^32개의 고유 메모리 주소 범위가 허용됩니다.

가능한 가장 높은 32비트 이진수는 이진수로 1111 1111 1111 1111 1111 1111 1111 1111이며 이는 16진수로 0xFFFFFFFF와 같습니다. 이는 가능한 최대 32비트 주소를 나타내며 메모리에서 주소 지정이 가능한 가장 높은 위치에 해당합니다.

언급한 범위 "7FFFFFFF"는 16진수로 표시되는 가장 높은 양의 32비트 부호 있는 정수입니다. MIPS 및 기타 여러 아키텍처에서는 32비트 이진수의 최상위 비트가 2의 보수 표현의 부호 비트로 사용됩니다. 부호 비트가 1로 설정되면 음수를 나타냅니다. 2의 보수에서 32비트 부호 있는 정수의 범위는 -2,147,483,648(0x80000000)부터 2,147,483,647(0x7FFFFFFFF)까지입니다.

따라서 MIPS 아키텍처의 맥락에서 "7FFFFFFF"는 32비트 주소 공간에서 주소 지정이 가능한 가장 높은 메모리 위치를 나타냅니다. "FFFFFFFF"를 메모리 주소로 사용하는 경우 매우 큰 음수 주소로 처리되며 대부분의 실제 시나리오에서 유효한 메모리 액세스에 일반적으로 사용되지 않습니다.

MIPS와 같은 32비트 아키텍처에서는 메모리 주소가 32비트를 사용하여 표현됩니다. 각 비트는 0 또는 1일 수 있으며 이러한 32비트의 조합으로 다양한 메모리 주소를 사용할 수 있습니다.

다음은 32비트 이진수의 예입니다.

0111 1111 1111 1111 1111 1111 1111 1111

이는 2의 보수 표현에서 가장 큰 양의 32비트 부호 있는 정수입니다. 이 표현에서 최상위 비트(가장 왼쪽)는 부호 비트이고 나머지 31비트는 크기를 나타냅니다. 따라서 "7FFFFFFF"는 10진수 값 2,147,483,647을 나타내며, 이는 가장 큰 양의 32비트 정수입니다.

32비트 바이너리인 "FFFFFFFF"를 2진수로 살펴보겠습니다.

1111 1111 1111 1111 1111 1111 1111 1111

이 이진수는 부호 없는 정수로 해석될 때 실제로 최대 32비트 값입니다. 그러나 메모리 주소 및 메모리 관리 측면에서는 일반적으로 부호 있는 정수를 사용하여 작업합니다. 이는 메모리 주소가 일반적으로 부호 있는 값으로 처리되기 때문입니다. 즉, 양수 또는 음수일 수 있습니다.

2의 보수 표현에서 가장 높은 양의 32비트 부호 있는 정수는 "7FFFFFFFF"(2,147,483,647)이고 가장 낮은 음의 32비트 부호 있는 정수는 "80000000"(-2,147,483,648)입니다.

서명된 컨텍스트에서 "FFFFFFFF"를 메모리 주소로 사용하는 경우 -1로 해석되며 일반적으로 유효한 메모리 액세스에 사용되지 않습니다. 메모리 주소는 부호 없는 값으로 처리되지만 실용적인 목적을 위해 여전히 "00000000"에서 "7FFFFFFFF"까지 32비트 주소 지정 가능 범위 내에 있습니다.

아! 결국 7fff ffff 인 이유는 음수 를 만들기 위해서 2진법에서 최상단 비트를 비워두니, 16진수로 봤을땐 다음처럼 보인거구나!

</aside>

<aside> 💡 MIPS 메인 메모리의 범위는 0x00000000 부터 0xFFFFFFFF까지이다.

하지만 사용자의 프로그램과 데이터는 첫 $2^{31}$ 바이트에만 저장될수 있도록 제한됨

→ 최상위 1비트는 음수 표현을 위해서

나머지 반은 운영체제와 특수 목적에 쓰인다.

![MIPS Memory Allocation

MIPS 메모리는 2^32바이트로 이루어진 배열이다.

각각의 바이트는 32비트의 주소를 가지고 있다.

각각의 바이트는 1개의 8비트 패턴을 담고 있다.

담겨진 비트 패턴은 8비트로 표현될 수 있는 256개의 패턴중에 하나이다. ](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/e55dae0f-1d64-40e4-be42-b8b57985654d/Untitled.png)

MIPS Memory Allocation

MIPS 메모리는 2^32바이트로 이루어진 배열이다.

각각의 바이트는 32비트의 주소를 가지고 있다.

각각의 바이트는 1개의 8비트 패턴을 담고 있다.

담겨진 비트 패턴은 8비트로 표현될 수 있는 256개의 패턴중에 하나이다.

</aside>