
나는 Linux(커널 3.10)를 부팅하려고 하는 ARM 프로세서 클론을 기반으로 FPGA에 구현된 맞춤형 SoC를 가지고 있습니다.
사용자 정의 주변 장치(USART, 인터럽트 컨트롤러 및 타이머)에 대한 지원을 성공적으로 추가하여 루트 파일 시스템을 마운트하려고 시도하는 시점까지 커널에 의해 표시되는 printk 메시지를 볼 수 있습니다.
나는 2GB의 맞춤형 비휘발성 메모리, 무작위 액세스, 읽기 쓰기, 부트로더가 실행되는 주소 0에서 0x7FFFFFFF로 매핑되고 커널과 파일 시스템 파티션을 포함하고 있습니다. 부트로더는 커널을 RAM(256Mb, 0x80000000에서 0x8FFFFFFFF)에 복사한 다음 Linux에 제어권을 전달합니다. 이는 다음 지점에서 실패합니다. "커널 패닉 - 동기화되지 않음: VFS: 알 수 없는 블록(0,0)에 루트 fs를 마운트할 수 없습니다. ".
디버깅 및 인터넷 검색에 따르면 커널이 비휘발성 메모리를 인식할 수 없어 파일 시스템을 마운트할 수 없는 것 같습니다.
해당 메모리에서 부팅해야 한다는 것과 커널에 어떤 코드를 추가해야 하는지 커널에 어떻게 알릴 수 있나요? 예를 들어 커널이 내 메모리가 Nand라고 생각하도록 만들고 Nand 드라이버를 수정하여 메모리에 올바르게 액세스할 수 있습니까?
모든 도움과 제안에 미리 감사드립니다.
답변1
"파일 시스템 파티션"에 대해 지금 무엇을 하고 있는지 잘 모르겠습니다. 그러나 RAM처럼 보이거나 작동하는 비휘발성 저장소에 initrd를 배치한 다음 부트로더가 Linux에게 initrd를 사용하도록 지시하도록 할 수 있습니다.
대부분의 initrd는 몇 가지 설정을 수행한 다음 블록 장치에 루트 파일 시스템을 다시 마운트하려고 시도합니다. 귀하의 경우 initrd는 실제 루트 파일 시스템이 되며 initrd에 쉘 등과 같은 유틸리티를 배치해야 합니다.
U-Boot를 사용하여 ARM에서 부팅할 때 기본적으로 부팅 명령은 커널과 initrd를 저장 장치에서 고정된 RAM 위치로 로드한 다음 initrd의 주소를 명령줄 매개변수로 커널에 전달하여 주소를 지정합니다.
make menuconfig
음, MTD 드라이버는 읽기/쓰기 가능한 블록 장치가 정말로 필요한 경우 RAM의 한 섹션(MTD 드라이버에 "물리적 시스템 RAM" 옵션이 있음)을 가져와 블록 장치로 전환할 수 있습니다 . 예를 들어 그래픽 카드 RAM을 작은 스왑 파티션으로 마운트하는 데 사용할 수 있습니다. 이것 좀 봐.
modprobe phram phram=0x00100000;256MiB
메모리 위치 0x00100000에 256MByte 파일 시스템이 있는 경우 이를 수행하는 명령은 다음과 같습니다 . 그런 modprobe mtdblock
다음 /dev/mtdblock0
. 그런 다음 다음과 같은 작업을 수행할 수 있습니다 mount /dev/mtdblock0
. 따라서 위의 fsck /dev/mtdblock0
작업을 수행한 다음 init
프로세스 1을 시작하는 initrd에 작은 스크립트가 필요합니다 .
커널 명령줄에서 이 모든 것을 어떻게든 지정할 수도 있지만 그것이 지원되는지는 확실하지 않습니다. 유연성을 위해 어쨌든 작은 initrd를 사용하고 싶을 수도 있습니다.