많은 사람들이 이미 그렇게 하고 있기 때문에 이는 이론적인 질문은 아니지만 기본 프로세스에 대한 정보는 거의 없습니다.
저는 맞춤형 MIPS 기반 프로세서를 개발 중이며 여기서 Ubuntu를 실행하고 싶습니다. 명령어 세트와 컴퓨터 아키텍처 자체를 디자인한 후, 다음에 무엇을 해야 할지 매우 혼란스럽습니다. 커널과 운영 체제를 실행할 수 있어야 하는데, 이 모든 것이 어떻게 결합됩니까?
현재 저는 적절한 어셈블리 언어를 생성하기 위해 Linux 커널용 컴파일러를 설계하는 작업을 하고 있습니다. 이것이 좋은 접근 방식입니까? 다음에 무엇을 해야 합니까?
답변1
아키텍처 측면에서는 단순한 명령어 세트와 컴퓨터 아키텍처 이상의 것이 필요합니다. 또한 다음이 필요합니다.
- 일부 형태의 CPU(시뮬레이터, FPGA, 실리콘...).
- 프로세서 시작 방법: 시작 시 프로세서가 실행되는 메모리에 운영 체제를 배치하는 방법입니다. 대부분의 프로세서는 일종의 플래시 메모리를 열고 분기하거나 일부 저장 매체의 일부 코드를 RAM으로 로드하여 분기하는 ROM에 저장된 코드로 부팅됩니다. 다음 단계는 운영 체제 부트 로더입니다.
- 일부 주변 장치 - 최소한 RAM, 일종의 메모리 컨트롤러 및 일부 입/출력 장치.
소프트웨어 측면에서 다음이 필요합니다.
- 컴파일러. MIPS 아키텍처를 사용하고 있으므로 기존 MIPS용 컴파일러로 충분합니다. 명령어 세트가 기본 MIPS 명령어 세트를 확장하는 경우(예: 추가 레지스터 사용) 이에 따라 어셈블러를 확장해야 할 수도 있습니다.
- 커널. MIPS용 Linux가 이미 존재합니다. 아키텍처에 부팅, MMU 등 사용자 정의 항목에 대한 지원을 추가해야 합니다.
- 운전사. 기성품이 아닌 모든 컴퓨터 아키텍처에 대한 드라이버를 작성해야 합니다.
- 부트로더. 일반적으로 부트로더에는 일부 아키텍처 관련 항목이 있지만, 예를 들어 머신 정의를 추가하여 기존 부트로더에 필요한 지원을 추가할 수도 있습니다.USB 부팅.
- 이게 다야. 커널과 부트로더가 있으면 사용자 영역 프로그램이 제대로 작동할 것입니다. 기존 배포판에서 커널과 부트로더를 패치하고 크로스 컴파일한 후 PC에 설치하세요. 우분투는 MIPS를 지원하지 않지만더반하다(밉스 또는 밉셀바이트 순서에 따라 다름)
답변2
와, 이 일에 많은 노력을 기울인 것 같아요(저한테 물어보면 다년간의 프로젝트처럼 들리네요). 당신은 실제로 그 모든 것을 하지 않을 것입니다, 그렇죠?
예, 다음 단계는 일종의 컴파일러를 작성(또는 더 좋게는: 포트)하는 것입니다(먼저 현재 PC에 있는 크로스 컴파일러를 사용하고 싶을 것 같습니다).
내 생각엔 gcc와 같은 기존 컴파일러를 포팅하는 것이 더 쉬운 작업일 수 있을 것 같습니다. (이미 많은 아키텍처를 지원하지만 저는 그런 일을 해본 적이 없습니다. 아마도GCC 내부 문서너를 도울 것이다).
컴파일러를 설치하고 실행한 후에는 기본적인 마이크로 컨트롤러와 유사한 프로그램(예: 데이터 포트의 LED 깜박임 등)과 일부 테스트 프로그램을 시도하여 모든 것이 예상대로 작동하는지 확인합니다.
다음 단계는 최종적으로 커널을 로드하는 부트로더를 구현하는 것일 수 있습니다. 귀하의 아키텍처가 BIOS/EFI 또는 이와 유사한 것을 사용할지는 모르겠지만 부트로더를 설계할 때 고려해야 할 또 다른 사항입니다.
그 다음에는 커널에 들어갈 차례입니다. 최소한의 커널 구성으로 시작하여 실행해 보십시오. 커널을 아키텍처에 이식해야 합니다(모든 아키텍처 종속 헤더 구성, 하드웨어에 액세스하기 위한 모듈 작성, 셸에 액세스할 수 있도록 직렬 드라이버 등 포함). 이는 다시 상당히 광범위한 프로세스입니다.
참고: 귀하의 아키텍처에 메모리 매핑 장치가 있기를 바랍니다. 그렇지 않으면 나중에 심각한 문제에 직면하게 될 것입니다(조사하지 않으면).µClinuxmmu가 없는 커널을 실행할 수 있지만 전체 데스크톱 OS를 실행할 수 있을지는 심각하게 의심됩니다.
임베디드 장치에서 실행되는 Android 또는 OpenWRT 커널을 살펴보고 싶을 수도 있습니다.
커널이 포팅되면(직접 포팅하려는 경우 몇 년 후) 사용자 공간을 계속 사용하게 됩니다. 먼저 비지박스, 컴파일러, 그리고 openssh, cron 등과 같은 몇 가지 기본 유닉스 도구를 포팅했습니다.
그런 다음(시스템에 작동하는 GPU가 연결되어 있다고 가정) GPU 드라이버를 작성하고X 서버(또는 대체웨이랜드). Ubuntu 데스크탑을 시작하고 실행하려면 2D/3D 가속을 구현해야 한다는 점을 명심하십시오.
결국, 작업은 가능한 한 많은 우분투 패키지를 플랫폼에 포팅하는 것입니다.
요약하자면, 여러분은 CPU 아키텍처를 개발하는 데 많은 시간을 보냈지만 이제 막 본격적인 Linux 배포판을 실행하기 시작했습니다. 실제로 수행하는 대신 프로세스에 대한 책을 쓰기를 바랍니다. 왜냐하면 앞으로 몇 년 동안 과중한 작업량에 대비해야 하기 때문입니다.
하지만 프로세스에 대한 간략한 개요를 알려드릴 수 있기를 바랍니다. (그리고 중요한 내용을 놓치지 않았으면 좋겠습니다.) 행운을 빌어요.