0xFFFFFFF0
x86 호환 CPU는 전원이 켜질 때 명령어 실행을 시작하는 곳입니다. 이는 하드웨어의 하드웨어 연결없이 하드 와이어 방식으로 변경되며 다른 유형의 CPU는 다르게 동작합니다.
첫 번째 BIOS 명령어가 4GB RAM의 "맨 위"에있는 이유는 무엇입니까?
4GB 주소 공간 의 "맨 위"에 있으며 전원을 켜면 BIOS 또는 UEFI ROM이 해당 주소의 읽기에 응답하도록 설정됩니다.
이것이 왜인지에 대한 나의 이론 :
프로그래밍의 거의 모든 것이 인접한 주소로 더 잘 작동합니다. CPU 설계자는 시스템 빌더가 CPU로 무엇을하고 싶은지 알지 못하므로, CPU가 공간의 중간에 주소를 다양한 목적으로 요구하도록 요구하는 것은 나쁜 생각입니다. 주소 공간의 맨 위나 맨 아래에 "비정형"상태를 유지하는 것이 좋습니다. 물론이 결정은 MMU 가없는 8086이 새로 만들어 졌을 때 이루어졌습니다 .
8086에서 인터럽트 벡터는 메모리 위치 0 이상에 존재했습니다. 인터럽트 벡터는 알려진 주소에 있어야하고 유연성을 위해 RAM에 있어야했지만 CPU 디자이너는 시스템에 얼마나 많은 RAM이 있는지 알 수 없었습니다. 따라서 80에서 발명 된 1978 년에 시스템에 4GB의 RAM이 없으므로 RAM이 0xFFFFFFF0에있을 것으로 기대하는 것은 좋은 생각이 아니기 때문에 0부터 시작하여 그에 대한 작업이 합리적이었습니다. 상단 경계에서.
물론 최소 80286부터 인터럽트 벡터를 0이 아닌 다른 시작 위치로 옮길 수는 있지만 최신 64 비트 x86 CPU는 여전히 8086 모드로 부팅되므로 모든 것이 여전히 낡은 방식으로 호환됩니다 (어리석게도) 2015 년에도 DOS를 실행할 수있는 x86 CPU가 필요하다는 소리가납니다).
따라서 인터럽트 벡터는 0에서 시작하여 위로 작동하므로 ROM은 위에서 시작하여 아래로 작동해야합니다.
컴퓨터에 1GB의 RAM 만 있으면 어떻게됩니까?
32 비트 CPU에는 4,294,967,296 개의 주소가 있으며 0 (0x00000000)부터 4294967295 (0xFFFFFFFF)까지 번호가 매겨집니다. ROM은 일부 주소에있을 수 있고 RAM은 다른 주소에있을 수 있습니다. CPU의 MMU를 사용하면 즉시 전환 할 수도 있습니다. RAM이 모든 주소에서 작동 할 필요는 없습니다.
1GB의 RAM 만 있으면 일부 주소는 읽거나 쓸 때 응답이 없습니다. 이로 인해 해당 주소에 액세스하거나 시스템이 잠길 때 유효하지 않은 데이터를 읽을 수 있습니다.
RAM이 4GB를 초과하는 시스템 (예 : 8GB, 16GB 등)은 어떻습니까?
약간 단순하게 유지 : 64 비트 CPU는 더 많은 주소 (예를 들어 0x0000000000000000에서 0xFFFFFFFFFFFFFFFFFF로 64 비트를 만드는 것 중 하나)를 가지므로 여분의 RAM이 "적합"합니다. CPU가 긴 모드 라고 가정 합니다 . 그때까지는 RAM이 존재할 수 있으며 주소 지정이 불가능합니다.
스택이 어떤 값으로 초기화되는 이유 (이 경우 0xFFFFFFF0에있는 값)?
전원을 켤 때 x86이 스택 포인터를 할당하는 항목에서 즉시 아무것도 찾을 수 없지만 일단 루틴이 시스템에 얼마나 많은 RAM이 있는지 알게되면 초기화 루틴에 의해 다시 할당되어야합니다. (아래 의견의 @Eric Towers는 전원을 켤 때 0으로 설정되어 있다고보고합니다.)