initramfs 프로그램이 모든 메모리에 접근할 수 있나요? 리얼 모드 또는 보호 모드에서 실행 중입니까?

initramfs 프로그램이 모든 메모리에 접근할 수 있나요? 리얼 모드 또는 보호 모드에서 실행 중입니까?

이것은 현재 64비트 프로세서와 현재 Linux 커널(4.6.4를 사용하고 있습니다.)의 맥락 내에 있습니다.

커널 모듈이 아니더라도 부팅 시 기본 메모리 640k 이하를 확인할 수 있는 프로그램을 작성할 수 있나요?

InfiniBand 프로토콜 SRP를 사용하여 InfiniBand 네트워크를 통해 원격으로 볼륨을 부팅하려고 합니다. 이것은 iSCSI 부팅과 매우 비슷하지만 실제로 이 작업을 수행하는 것에 대해 공개된 내용은 없는 것 같습니다.

iPXE(네트워크 부팅 펌웨어)를 사용하고 있습니다. SRP 프로토콜을 사용하여 원격 볼륨에 연결할 수 있었고 커널과 initramfs를 성공적으로 로드했습니다. 그러나 실행이 커널로 전달되면 커널은 아직 원격 볼륨에 연결되어 있지 않으므로 이에 대해 알지 못하거나 볼 수 없습니다.

iPXE는 연결된 사람과 연결된 방법에 대한 정보를 sBFT(ACPI 테이블)라는 기본 메모리(< 640k)에 보관합니다.

iSCSI는 매우 유사한 기능을 수행합니다. 부트로더는 이 정보를 iBFT라는 ACPI 테이블에 보관하지만 iBFT 구조에 sysfs 인터페이스를 제공하는 커널 모듈 iscsi_ibft가 있습니다. ib_sbft 커널 모듈과 같은 InfiniBand sBFT에 해당하는 것을 본 적이 없습니다.

따라서 누군가(아마도 나)가 존재하지 않는 ib_sbft 커널 모듈을 작성해야 하는 경우 작동하기를 원하는지 궁금합니다.

또는 프로그램이 메모리 충돌 없이 기본(< 640k) 메모리에 액세스할 수 있는 방법이 있습니까? 그리고 (아마도) 다른 메모리에 의해 덮어쓰기 되기 전에요?

저는 mkinitcpio를 사용하여 초기 램디스크를 만들고 초기 부팅 중에 프로그램을 실행하는 Arch Linux를 사용하고 있지만 그때쯤이면 너무 늦어서 보호 모드에서 실행되고 있다고 생각합니다. (이것이 변경되지 않는 한 리얼 모드는 16비트에서 실행되며 16비트로 컴파일해야 하는 초기 램디스크 프로그램에 대한 정보를 본 적이 없어서 너무 늦었다고 생각하게 됩니다.)

답변1

initramfs모든 의도와 목적을 위해 파일 시스템은 로드된 또 다른 파일 시스템일 뿐이며 /여기에서 실행되는 프로그램은 다음에서 로드됩니다.사용자 공간실행 중인 커널 아래에 있습니다. 이는 다른 프로그램과 동일한 제한 사항이 있음을 의미합니다.

다음과 같은 방법으로 필요한 데이터를 찾을 수 있지만 /dev/mem특정 구현에 의존해서는 안 됩니다 iPXE. 다른 공급업체와 다른 PXEboot 프로세스 간에 상황이 쉽게 변경될 수 있습니다.

일반적으로 이 정보는 커널 호출 명령의 일부로 전달되어야 하므로 /proc/cmdline사용자 공간 프로그램이 이를 구문 분석하고 필요한 작업을 수행할 수 있는 위치에 표시됩니다.

답변2

initramfs에서 실행되는 프로그램은 완전히 정상적인 프로그램입니다. 다른 Linux 프로세스처럼 실행됩니다.

리얼 모드(32비트 x86 프로세서의 부팅 시 레거시 모드)에서 보호 모드(286 세대 이후 32비트 x86 프로세서의 일반 작동 모드)로의 전환은 Linux 커널 부팅 프로세스 초기에 발생합니다. 심지어 드라이버도 아직 시작하지 않았습니다.

주변 장치가 특정 물리적 주소에 무언가를 저장하는 경우 해당 장치를 통해 액세스할 수 있습니다 /dev/mem. 해당 범위의 물리적 주소를 사용하지 않도록 커널에 지시해야 합니다. 어떻게 해야 할지 모르겠습니다(IIRC에는 커널 명령줄 옵션이 있지만 지금은 찾을 수 없습니다).

그러나 필요한 것이 일반 ACPI 기능의 일부로 이미 존재할 수 있습니다. 즉, 원시 ACPI 데이터에 대한 액세스를 제공하지만 구문 분석된 데이터(예: iscsi_bft.

관련 정보