簡體   English   中英

為什么自定義 init 在自定義 linux 系統上失敗並顯示錯誤代碼 -8?

[英]Why does a custom init fail with error code -8 on a custom linux system?

我正在為 linux 系統(用於瘦客戶端)(目前通過 qemu 模擬)構建自定義 init。 我正在編譯我的可執行文件:

$ gcc -fpic -static -nostdlib init.c -o init

出於某種原因,當這個可執行文件被放在 /bin/ 上時,系統拒絕啟動並吐出一個非常無用的錯誤代碼 (-8)。 根據一些谷歌搜索,這似乎對應於信號 8,即 SIGFPE,但奇怪的是,在代碼或檢查的復雜程序集中的任何位置都沒有發生與不可能的數學相關的事情,例如除以零。 源代碼根本不重要,任何來源都無法構建,但這里有一個失敗的例子。

size_t strlen(const char* s) {
    for(unsigned i = 0; ; ++i) if(s[i] == 0) return i;
}
void puts(char* s) {
    asm("mov %0, %%r11" :: "r"(s));
    asm("mov %0, %%r14" :: "r"(strlen(s)));
    asm("mov $1, %rax\n"
        "mov  %r11, %rsi\n"
        "mov %r14, %rdx\n"
        "mov $1, %rdi\n"
        "syscall");
}
int _start() {
    puts("test");






    asm volatile(
        "mov $60, %rax\n"
        "push %r11\n"
        "mov %r11, %rdi\n"
        "pop %r11\n"
        "syscall"
    );
    return 0;
}

bin/init 失敗,退出狀態代碼為 -8

Run /bin/init as init process
Kernel panic - not syncing: Requested init /bin/init failed (error -8).

Kernel Offset: disabled

如果您在編譯 kernel 之前忘記在配置中切換 64 位 kernel,則會發生此問題,這也可能是由於使用了錯誤的編譯器,例如不是用於 Linux 而是為其他 unix 生成 elf 可執行文件的編譯器。 代碼使用 64 位寄存器,而 kernel 只有 32 位。

另一個原因可能是制作不當的 initramfs。 在閱讀非常有幫助的手冊之前,我遇到了 cpio 文件的問題:

使用初始 RAM 磁盤 (initrd)

雖然不相關,但也不要在 init 進程上很好地使用 exit 系統調用,因為 Init 應該運行到系統關閉,退出 init 將導致 kernel 恐慌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM