나는 286을 가지고 있지 않으며 그것에서 Linux를 실행할 계획도 없습니다. 하지만 286에는 보호 모드가 있는데 왜 Linux에는 386 이상의 CPU가 필요하다고 자주 말합니까?
~에서http://tuxmobil.org/286_mobile.htmlELKS 버전의 Linux는 286에서 실행될 수 있는 것 같습니다. 이것이 맞습니까? 커널이 286 CPU에서 실행될 수 있도록 어떤 수정이 이루어졌습니까?
이제 나는 386용으로 컴파일된 커널이 16비트 286 CPU에서 실행될 수 없다는 것을 분명히 이해합니다. 그래서 내 질문은, 표준 Linux 커널을 286용으로 컴파일한 다음 286에서 실행할 수 없는 이유는 무엇입니까? Linux에는 하드웨어 VM86 지원이 필요합니까?
답변1
286 보호 모드(PM)는 386에서 제공하는 기능과 근본적으로 다릅니다. 286 PM을 프로토타입으로 생각해 보세요. 단점이 너무 많아서 거의 아무도 사용하지 않았으며 전체 시스템이 386에 맞게 완전히 재설계되었습니다.
플랫 메모리 모델을 사용하는 대신 리얼 모드와 같은 세그먼트 모델을 사용합니다. 즉, 한 번에 64kB 블록에 걸쳐 메모리에 액세스해야 함을 의미합니다.
당시 사용 가능한 모든(MS-DOS) 프로그램과 완전히 호환되지 않았기 때문에 PM에 들어가면 익숙한 프로그램을 사용할 수 없었습니다.
또한 PC를 다시 시작하지 않고는 보호 모드를 다시 종료할 수 없기 때문에 제조업체에서는 RAM에 플래그를 배치하고 키보드 컨트롤러에 마법 값을 쓰는 등의 창의적인 솔루션을 고안했습니다. 그러면 CPU의 키가 재설정됩니다. 컴퓨터를 다시 시작합니다. 기계. BIOS가 수행하는 첫 번째 작업은 이전에 설정된 플래그를 감지하고 POST 루틴을 실행하는 대신 원래 프로그램으로 다시 점프하여 PM을 "종료"한 후에도 원래 프로그램이 계속 실행되도록 하는 것입니다.
즉, 286 PM을 사용하면 많은 트릭 없이는 일반 DOS 프로그램을 실행할 수 없습니다. DOS 프로그램만 있던 시절에는 PM을 사용하는 것이 전혀 가치가 없었습니다.
따라서 286 PM을 사용하는 것은 이를 사용하지 않고 EMS 및 XMS를 사용하여 추가 메모리에 액세스하는 것보다 더 복잡합니다. 많은 286 마더보드에는 EMS용 칩셋이 지원되므로 PM 없이 추가 시스템 메모리를 모두 사용할 수 있습니다.
인텔은 이러한 단점을 인식하고 386에서 완전히 다른 새롭고 완전히 다른 PM을 제작했습니다. 플랫 메모리 모델을 사용하면 최대 4GB의 메모리 블록에 쉽게 액세스할 수 있습니다. CPU는 몇 가지 명령으로 PM에 들어가고 나갈 수 있으므로 서투른 재시작 프로토콜이 필요하지 않습니다. VM86은 대부분의 경우 PM을 종료할 필요가 없으며 PM에서 DOS 프로그램을 실행할 수 있음을 의미합니다.
이러한 모든 개선 사항은 386 PM이 더 강력할 뿐만 아니라 훨씬 더 호환성이 높다는 것을 의미합니다.
즉, 286과 386 보호 모드의 유일한 공통점은 이름입니다. 이것이 PM 운영 체제가 일반적으로 버전 386 이상인 이유입니다. 286 PM에 대한 지원을 추가하는 것은 완전히 다른 386 PM과 공유되는 코드가 거의 또는 전혀 없는 완전히 별개의 노력입니다.
이에 비해 386 PM은 마지막 32비트 CPU까지 거의 동일한 방식으로 작동했으며, 64비트 CPU에서 32비트 소프트웨어를 실행하는 경우에도 마찬가지였습니다.
답변2
커널의 일부는 어셈블리 언어로 작성되었으며 286을 지원하려면 다시 작성해야 했습니다.
ELKS와 관련하여 FAQ에서는 이것이 Linux 커널의 하위 집합임을 지적하므로 꼭 필요한 부분만 포팅했을 수도 있습니다.
답변3
내 질문에 대한 실제 대답은 다음과 같습니다.
C 코드 외에도 모든 주요 CPU 아키텍처(또는 주요 개정판)에는 일부 어셈블리 지원 코드가 필요합니다.
GCC가 Linux 커널을 16비트 286 기계 코드로 컴파일하도록 허용하더라도 여전히 필요한 16비트 286 호환 어셈블리 코드가 누락됩니다.
즉, 커널은 기껏해야 부품만 만들 수 있습니다. 아키텍처별 어셈블리 코드는 단순히 해당 아키텍처용으로 작성되지 않았기 때문에 어셈블되지 않습니다.
이를 바탕으로 나는 이것이 정확히 ELKS 및 유사한 프로젝트가 286 또는 기타 아키텍처에서 Linux를 구현할 때 수행하는 작업이라고 가정합니다. 이들은 누락된 어셈블리 지원 코드를 구현합니다.