작업하는 동안 테스트 환경을 설정하는 가장 좋은 방법은 무엇입니까리눅스 장치 드라이버?
x86_64_defconfig를 사용하여 최신 Linux 소스에서 x86용 bzImage를 컴파일했습니다.
나는 팔로우했다젠투 사용자 정의 initramfs 튜토리얼이를 통해 Busybox 기반의 격리된 파일 시스템으로 부팅할 수 있습니다. 나는 그들이 사용하는 것과 똑같은 초기화 파일을 사용합니다. 내가 하는 일과 그들이 하는 일의 유일한 차이점은 내가 우분투에서 실행하고 이머지를 사용하는 대신 최신 Busybox x86_64 바이너리를 다운로드한다는 것입니다.
내 Ubuntu 16.04 시스템에서 실행 중입니다.
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -append "console=ttyS0" -initrd custom-initramfs.cpio.gz -nographic
이는 custom-initramfs.cpio.gz
젠투 튜토리얼에서 제가 만들고 압축한 initramfs를 나타냅니다.
이 모든 것을 실행했지만 아래와 같이 여전히 커널 오류가 발생했습니다.
[ 2.893799] md: Waiting for all devices to be available before autodetect
[ 2.894724] md: If you don't use raid, use raid=noautodetect
[ 2.913768] md: Autodetecting RAID arrays.
[ 2.914465] md: Scanned 0 and added 0 devices.
[ 2.914879] md: autorun ...
[ 2.915478] md: ... autorun DONE.
[ 2.920719] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[ 2.921465] Please append a correct "root=" boot option; here are the available partitions:
[ 2.922493] 0b00 1048575 sr0 driver: sr
[ 2.923069] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 2.923101] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.8.0-rc1+ #18
[ 2.923101] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
[ 2.923101] 0000000000000000 ffff8800070ffde0 ffffffff81328158 ffff8800066aa000
[ 2.923101] ffffffff81b98e58 ffff8800070ffe60 ffffffff81124120 0000000000000010
[ 2.923101] ffff8800070ffe70 ffff8800070ffe08 ffffffff8112441e ffff8800070ffe78
[ 2.923101] Call Trace:
[ 2.923101] [<ffffffff81328158>] dump_stack+0x4d/0x65
[ 2.923101] [<ffffffff81124120>] panic+0xca/0x1fc
[ 2.923101] [<ffffffff8112441e>] ? printk+0x43/0x4b
[ 2.923101] [<ffffffff81f4a364>] mount_block_root+0x175/0x229
[ 2.923101] [<ffffffff81f4a519>] mount_root+0x101/0x10a
[ 2.923101] [<ffffffff81f4a653>] prepare_namespace+0x131/0x169
[ 2.923101] [<ffffffff81f4a03c>] kernel_init_freeable+0x1c0/0x1d5
[ 2.923101] [<ffffffff818e7669>] kernel_init+0x9/0x100
[ 2.923101] [<ffffffff818ed30f>] ret_from_fork+0x1f/0x40
[ 2.923101] [<ffffffff818e7660>] ? rest_init+0x80/0x80
[ 2.923101] Kernel Offset: disabled
[ 2.923101] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
그러나 QEMU를 사용하지 않고 로컬로 부팅하는 경우 initramfs로 부팅할 수 있습니다. 이 grub 메뉴 옵션은 작동합니다
menuentry 'linux latest' {
linux /boot/bzImage-latest
initrd /boot/custom-initramfs.cpio.gz
}
여기서 bzImage 및 initramfs는 동일한 기본 x86_64 구성 커널 이미지와 이전에 빌드된 사용자 정의 initramfs를 참조합니다.
문제는 QEMU가 /dev
로컬 시스템과 동일한 장치 액세스 권한을 갖고 있지 않기 때문에 발생하는 것 같습니다.
QEMU 환경에서 작동하려면 무엇을 수정해야 합니까? 내 목표는 커널 부팅을 완료하고 일종의 최소한의 파일 시스템에 들어가는 것입니다.
방금 직장에서 첫 번째 장치 드라이버 패치를 만들었습니다. 정말 흥미롭고 계속해서 더 배우고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다!
답변1
여기 독학한 커널 해커가 있습니다(아직도 그 중 작은 부분을 유지하고 있습니다).
아마도 명확한 답이 많지 않을 수도 있지만 먼저 Raspberry Pi와 같은 작은 임베디드 보드를 사용하는 것이 좋습니다. 조만간 커널 개발 중에 물리적 하드웨어를 사용해야 하기 때문입니다. 소프트웨어 시뮬레이션과 가상 머신은 사용하지 않습니다. 물리적 하드웨어 프로그램 및 코드와 동일한 드라이버를 사용하거나 이미 충분히 복잡한 것이 어떻게 작동하는지 알아내려고 할 때 복잡성의 추가 계층을 추가합니다.
그러나 보조 임베디드 시스템에서 작업하려면 크로스 컴파일러를 사용해야 하므로 문제가 발생할 수도 있습니다. 오래된 x86 시스템이 있다면 이를 사용하십시오. 조만간 싫증이 나기 때문에 시스템을 처음부터 설정하는 데 익숙해지십시오. 실제 커널 개발에는 작업이 수반되므로 나쁜 일이 아닙니다. 덜 안정적인 시스템에서 개발합니다(왁싱/왁싱...).
해킹할 보조 시스템이 없으면 메인 시스템을 듀얼 부팅하고 보조 시스템을 업무용으로 사용하세요. 하지만 만일의 경우를 대비해 모든 것을 백업해 두세요.
아, 그리고 마지막으로 생각해볼 점은 Ubuntu, Fedora 또는 업데이트 사이에 사용자 공간이 변경될 수 있는 배포판을 사용하지 마세요. 그렇지 않으면 고스트 문제를 디버깅하게 될 것입니다. 최소한 그러한 문제를 본능적으로 발견할 수 있을 때까지는 Debian, centos 또는 기타 안정적인 사용자 공간을 사용하십시오.