286에 리눅스?


15

나는 286을 소유하지 않으며 Linux를 실행할 계획도 없다. 그러나 286에는 보호 모드가 있기 때문에 Linux에 386 CPU 이상이 필요하다고 자주 언급되는 이유는 무엇입니까?

에서 http://tuxmobil.org/286_mobile.html 정확, 리눅스의 ELKS 버전이 286에서 실행할 수있는 것 같습니다? 커널이 286 CPU에서 실행될 수 있도록 어떤 부분이 수정 되었습니까?

이제 분명히 386 용으로 컴파일 된 커널은 16 비트 인 286 CPU에서 실행할 수 없다는 것을 이해합니다. 내 질문은 왜 표준 Linux 커널을 286 용으로 컴파일 한 다음 286에서 실행할 수 없습니까? Linux에는 하드웨어 VM86 지원이 필요합니까?


6
16 비트는 과잉입니다. Linux를 실행하기에 8 비트이면 충분합니다. Dmitry Grinberg의 프로젝트를
Marco


Minix는 8086 (8 비트, 128KiB RAM IIRC)에서 실행되었습니다. Microsoft의 Xenix는 80286에서 실행되었습니다. 일부 악의적 인 영혼은 Linux를 8086으로 도약하려고 시도했습니다 (일부 성공). 그러나 그러한 제한된 머신에서는 "전체 Linux 환경"을 사용할 수 없습니다.
vonbrand

매우 제한된 장치에서 Linux를 실행할 수 있습니다. 그러나 이것은 예를 들어 데스크탑 시스템으로 유용하지는 않습니다. 목표를 명시하지 않으면 'Linux on 286'이 적합한 지 말하기 어렵다.
9000

답변:


4

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 PM으로 작업하는 것이 더 복잡해졌습니다. 많은 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 비트 소프트웨어를 실행하는 경우에도 거의 동일한 방식으로 작동합니다.


3

커널에는 어셈블리로 작성된 부분이 있으며 286을 지원하기 위해 다시 작성해야합니다.

ELKS와 관련하여 FAQ에서 그들은 Linux 커널의 하위 집합임을 나타내므로 절대적인 필요성 만 포팅했을 것입니다.


1
286, 80287을위한 수학 보조 프로세서가있었습니다.
Renan

3

내 질문에 대한 진정한 대답은 다음과 같습니다.

모든 주요 CPU 아키텍처 (또는 주요 개정판)에는 C 코드 외에 일부 어셈블리 지원 코드가 필요합니다.

Linux 커널을 16 비트 286 기계 코드로 컴파일하도록 GCC에 액세스 한 경우에도 필수 16 비트 286 호환 어셈블리 코드가 여전히 없습니다.

다시 말해, 커널은 기껏해야 부분적으로 만 빌드 될 것입니다. 아키텍처 별 어셈블리 코드는 해당 아키텍처 용으로 작성되지 않았기 때문에 어셈블 할 수 없습니다.

이를 기반으로 나는 이것이 286 또는 다른 아키텍처에서 Linux를 구현할 때 ELKS 및 유사한 프로젝트가 수행하는 것과 정확히 일치한다고 가정합니다. 누락 된 어셈블리 지원 코드를 구현합니다.


3

80386은 메모리 세그먼테이션 외에도 페이징을 지원하는 반면 286은 메모리 세그먼테이션 만 지원합니다. 리눅스는 페이징 지원에 크게 의존합니다. 즉, 기본적으로 모든 세그먼트 레지스터를 0으로 설정하고 페이징을 사용하여 응용 프로그램을 관리하는 플랫 메모리 체계를 사용합니다. 리눅스를 286으로 포팅하기 위해서는 기본 메모리 관리자가 페이징없이 세그먼트 모드에서 작동하기 위해 완전한 재 설계가 필요합니다.


2

Linux에는 하드웨어 VM86 지원이 필요합니까?

내가 조립 사람을 모르겠지만,에 따라 :

8086 아키텍처의 32 비트 확장의 원래 구현 인 80386 명령어 세트, 프로그래밍 모델 및 이진 인코딩은 여전히 ​​모든 32 비트 x86 프로세서의 공통 분모입니다.이를 x86, IA-32 또는 i386이라고합니다. 상황에 따라-아키텍처.

386은 286에서 확장 된 명령어 세트 를 나타내 므로 누가 포트가 어려운지 알 수 있습니다. 아마도 아무도 그것을 시도하려고 귀찮게하지 않았을 것입니다 ... ELKS 사람들에게 그것에 대해 물어볼 수 있다고 생각합니다.


2

가장 큰 이유는 원래 GNU 프로젝트가 더 작은 것을 지원하기보다는 32 비트 시스템 (1980 년대 중반 Unix 작업 통계와 같은)을 목표로하기 때문에 전체 GNU 툴체인이 16 비트 코드 생성에 적합하지 않기 때문입니다. GCC가 286 개의 보호 모드 코드를 생성 할 수 있다면 Linux 커널을 사용하여 초기에 어셈블리를 많이 사용하는 세그먼트를 286으로 포팅하는 것이 다른 포팅 대상보다 쉬웠을 것입니다. 그러나 GCC를 286 보호 모드로 목표로하는 것은 오래된 프로세서를 지원하는 거대한 프로젝트였습니다.


1

최근 리눅스 커널은 지원되는 플랫폼으로 386을 버리고 리눅스 커널은 인텔 286 프로세서를 지원 하지 않습니다 .80286은 부팅에 필요한 32 비트 CPU가 아닙니다.


5
리눅스는 원래 1991 년 386 년에 썼다. 그때까지 286은 이미 오래되었고, 메인 커널 트리는 286을 지원하는 백 포트 코드를 가지고 있지 않았다.
Flukas88

그럴 수도 있지만 문제는 여전히 그렇습니다. 286/386에 대한 지원을 중단하기로 결정한 이유는 아니지만 (이것은 분명합니다) 이전 프로세서를 쉽게 지원할 수없는 기술적 이유는 무엇입니까? 즉, 커널에 32 비트 CPU가 필요한 이유는 무엇입니까? 커널을 286로 컴파일 할 수없는 이유는 무엇입니까?
ioctlvoid

커널은 또한 필요에 따라 산술 코 프로세서를 가지고 있지 않습니까?
Bonsi Scott

아닙니다. 커널은 수학 에뮬레이션을 지원합니다. 적어도 전에는 그랬습니다. 따라서 FPU가 손상된 CPU에서 Linux 커널을 실행할 수도 있습니다. 그러나 286은 여전히 ​​수학 보조 프로세서 인 80287을 지원했습니다.
ioctlvoid

내 답변의 편집 부분에서 나는 에뮬레이션이 Linux 커널에서 구현된다는 것을 나타 냈습니다. 포팅 할 때 부동 소수점 단위가 없었기 때문에 Linux를 S / 390 (일명 IBM 메인 프레임)으로 포팅하는 데에도 사용되었습니다.
Didi Kohen 2016 년

1

Linux x86은 16 비트 프로세서이고 Linux x86에는 32 비트 프로세서가 필요하기 때문에 80286으로 쉽게 백 포트 할 수 없습니다.

보다 구체적으로, 286의 레지스터는 여전히 16 비트 폭이었습니다. 사용 가능한 EX 레지스터가 없습니다. 또한 메모리 세그먼트와 오프셋은 여전히 ​​16 비트 길이였습니다. 프로그램은 여전히 ​​근거리 / 원거리 코드 및 데이터를 처리해야했습니다.

이는 Linux / 286이 Linux / 386과 완전히 다른 커널 및 사용자 API를 필요로한다는 것을 의미합니다. 모든 어셈블리 소스 파일과 많은 C 소스 파일을 다시 작성해야합니다. Win16과 Win32의 프로그래밍의 차이점과 같습니다.

간단히 말해 GCC에게 다른 CPU를 위해 컴파일하도록 지시 할 수는 없습니다. 16 비트 환경에서는 모든 코드를 다시 작성해야합니다.


1
가독성을 높이기 위해 마크 다운 사용을 고려하십시오 .
lord.garbage 8

0

필자가 80286에서 Linux를 실행하는 표준 방법은 가상 머신 내에서 실행하는 것입니다. 이 파브리스 벨라 드 한 일이다 여기 . 가상 머신을 직접 구현하거나 포트해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.