Linux 시스템으로 직접 부팅할 수 없다고 가정하면 부트스트랩을 어떻게 만드나요?

Linux 시스템으로 직접 부팅할 수 없다고 가정하면 부트스트랩을 어떻게 만드나요?

시스템에 메모리 매핑 장치를 설명하는 c 헤더 파일 세트가 있다고 가정할 때 초기 실행 커널을 만들기 위한 실제 단계는 무엇입니까? 나는 모두가 라이브 CD/USB Thumb 드라이브 등으로 부팅한다는 것을 알고 있습니다. 그런데 첫 번째 부트스트랩은 어떻게 만들어졌습니까?

편집: 제가 실제로 ARM 장치에 대해 이야기하고 있다는 점을 지적해야 합니다. 일반적인 컴퓨터에서 BIOS를 통해 로드하는 기본 사항을 알지만 사용자 지정 장치에 대해 이야기하고 있다고 가정해 보겠습니다.

답변1

첫 번째 부트스트랩은 어떻게 만들어졌나요?

부트스트랩 프로그램을 구축(작성 및 크로스 컴파일)하는 것은 당신이 제안한 것만큼 어렵지 않습니다.

나는 실제로 ARM 장치에 대해 이야기하고 있다는 점을 지적해야 합니다. 일반적인 컴퓨터에서 BIOS를 통해 로드하는 기본 사항을 알지만 사용자 정의 장치에 대해 이야기하고 있다고 가정해 보겠습니다.

귀하가 언급하는 BIOS는 본질적으로 PC 규칙입니다. (CP/M에도 BIOS가 있지만 반드시 비휘발성 메모리에 있을 필요는 없습니다.) ARM CPU에는 일반적으로 BIOS가 없거나 사용되지 않습니다.

오늘날 사용되는 일반적인 ARM 프로세서는 주변 장치와 함께 단일 IC에 통합되어 있습니다.SoC, 시스템 온 칩. 메인 메모리(예: DRAM)와 비휘발성 스토리지(예: NAND 플래시)는 일반적으로 최대 설계 유연성을 위해 SoC 외부에 있습니다. 그러나 일반적으로 부트스트랩 작업을 시작하기 위해 최소한의 시스템 구성 요소를 초기화하는 작은(약 128KB) 내장 ROM(읽기 전용 메모리)이 있습니다. 프로세서를 재설정하면 항상 이 부팅 ROM이 실행됩니다. (이 ROM은 읽기 전용이므로 수정할 수 없습니다. 코드는 칩 제조 중에 실리콘에 마스킹됩니다.)

각 SoC 공급업체에는 OS를 로드하고 실행하기 위한 자체 부트스트랩 방법이 있습니다. 일부는 GPIO 핀을 통해 읽은 하드웨어 스트래핑을 사용하여 부트스트랩 시퀀스의 다음 단계 소스를 결정합니다. 다른 벤더는 부트스트랩 프로그램을 조사하기 위해 정렬된 메모리 및 장치 목록을 사용할 수 있습니다. 또 다른 기술은 직접 실행할 수 있는(즉, XIP, 제자리에서 실행) NOR 플래시의 펌웨어로 분기하는 것입니다.

주 메모리로 DRAM을 사용하는 시스템을 부트스트래핑할 때 발생하는 문제 중 하나는 하드웨어 초기화입니다. 코드가 DRAM에 로드되어 실행되기 전에 DRAM 메모리 컨트롤러를 초기화해야 합니다. 그러면 이 초기화 코드는 주 메모리에 있을 수 없으므로 어디에 있습니까?
각 공급업체에는 자체 솔루션이 있습니다. 일부에서는 부트 ROM이 액세스할 수 있도록 메모리 구성 데이터를 비휘발성 메모리에 저장해야 합니다. 일부 SoC에는 작은 부트스트랩 프로그램을 실행하기 위해 SRAM(DRAM과 같은 초기화가 필요하지 않음)이 통합되어 있습니다. 일부 SoC는 NOR 플래시를 사용하여 XIP 부트스트랩 프로그램을 보유합니다.

부트스트랩 프로그램이 DRAM을 초기화하면 메인 메모리를 사용하여 다음 부팅 단계를 로드할 수 있습니다. 이는 U-Boot와 같은 정교한 부팅 유틸리티이거나 (부트스트랩 프로그램이 가능한 경우) Linux 커널일 수 있습니다. 프로세서 재설정부터 OS 실행까지 수행되는 여러 부트스트랩 프로그램 또는 단계가 있을 수 있습니다.

Linux ARM 커널 부팅 요구 사항은 다음 문서에 설명되어 있습니다.http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
이전 버전의 Linux ARM은 ATAG 목록을 사용하여 기본 구성 정보를 커널에 전달했습니다. 최신 버전은 장치 트리의 컴파일된 바이너리를 사용하여 완전한 보드 구성을 제공합니다.

분명히 "부트스트랩을 어떻게 만드나요?"라는 질문이 있습니다. 어떤 자격 없이는 대답할 수 없습니다.

PC BIOS와 마찬가지로 SoC의 부팅 ROM은 독점적이며 릴리스되지 않습니다(NDA에 서명하지 않는 한). 그러나 대부분의 다른 부팅 코드는 GPL 또는 유사한 라이센스에 따라 릴리스되며 쉽게 얻을 수 있습니다.


부록

이제 Zynq 7000(Xilinx SoC 사용)을 사용하고 있다고 언급하셨으므로 Xilinx에 대한 비디오 튜토리얼이 있습니다.Linux 부팅 이미지를 빌드하는 방법.
해당 비디오는 내가 이미 작성한 내용을 확인시켜 줍니다.
1. Xilinx SoC에는 부팅 ROM이 내장되어 있습니다(기술적으로는 첫 번째 단계이지만 0단계로 무시되거나 설명되는 경우가 더 많습니다).
2. 다음 단계의 부트스트랩 프로그램 소스를 지정하는 "모드 핀"이 있습니다.
3. 부트 ROM은 FSBL이라고 불리는 부트스트랩 프로그램(기술적으로는 두 번째 단계이지만 종종 "첫 번째" 단계로 설명됨)을 임베디드 SRAM에 로드합니다. 이 프로그램은 DRAM을 초기화하고 다음 단계인 U-Boot를 로드합니다.
4. U-Boot는 DRAM에서 실행되고 Linux 커널을 로드합니다.

이 비디오는 Xilinx 사이트에서 FSBL 소스 코드를 다운로드하고 몇 단계를 거쳐 크로스 컴파일할 수 있음을 보여줍니다. 없다"장난"당신이 주장한대로. 빌드는 간단한 구성 및 크로스 컴파일로, 일반적인 애플리케이션 패키지보다 더 간단하고 쉽습니다.

아마도 여러분의 혼란은 부팅 매체의 모호성, 즉 부팅 이미지의 소스가 지정되지 않았기 때문일 것입니다. 영상에서는 가능한 부팅 장치로 NAND 플래시와 SD카드를 언급합니다.
부팅 ROM은 모드 핀으로 구성된 소스 매체에서 FSBL 이미지를 읽도록 지시됩니다.

FSBL(내가 사용한 다른 부트스트랩과 같은 경우)은 구성된 소스 매체에서 U-Boot를 읽도록 구축되었습니다. 런타임 대안은 없습니다.

U-Boot는 이름("universal")에 걸맞게 작동하려고 하며, 다양한 장치에서 이미지(및 스크립트)를 로드하도록 구성할 수 있습니다(환경 변수 사용). 대화형 옵션도 있습니다.

또한 Xilinx 위키를 참조하세요.징크 리눅스, "Zynq 부팅에 대한 전체 정보는기술 참조 매뉴얼".

관련 정보