Вам нужно сначала загрузить ядро ​​Ошибка

Прямо сейчас, когда я выбираю Custom OS, и когда я запускаю свою ОС из меню в GRUB, я получаю фиолетовый фон:

error: secure boot forbids loading module from (hdo, gpt7)/boot/grub/x86_64-efi/multiboot.mod
error: You need to load your kernel first
Press any key to continue . . .

.. Я не обязательно понимаю, почему это происходит. позвольте мне показать вам мои файлы:

loader.S:

#Global MultiBoot Kernel Recongnzation
.set MAGIC, 0x1BADB002
.set FLAGS , (1<<0 | 1<<1)
.set CHECKSUM, -(MAGIC + FLAGS)

#Putting in object file
.section .multiboot
.long MAGIC
.long FLAGS
.long CHECKSUM.section .text

.extern kernelMain
.globl loader

loader:
mov $kernel_stack , %esp
push %eax
push %ebx
call kernelMain

_eof:
cli
hlt
jmp _eof.section .bss
.space 2*1024*1024 #2 MiB
kernel_stack:

Makefile:

GPPARAMS =  -m32 -Iinclude -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore -Wno-write-strings
ASPARAMS =  --32
LDPARAMS =  -melf_i386
objects = kernel.o loader.o

all:
g++ -m32 -Iinclude -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore -Wno-write-strings  -o kernel.o -c kernel.cc
as $(ASPARAMS) -o loader.o loader.S

mykernel.bin : linker.ld $(objects)
ld $(LDPARAMS) -T $< -o $@ $(objects)

install: mykernel.bin
sudo cp $< /boot/mykernel.bin

clean:
rm $(objects)

kernel.cc:

int strlen(char* str)
{
int l=0;
while(str[l]!='\0')l++;
return l;
}

void printf(char *str)
{
unsigned short* ViedoMemory = (unsigned short*)0xb8000;

for(int i=0; str[i]!='\0'; ++i)
ViedoMemory[i]= (ViedoMemory[i] & 0xFF00)|str[i];
}extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber)
{
printf("Hello World");
while(1);
}

linker.ld:

ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
. = 0x0100000;

.text :
{
*(.multiboot)
*(.text*)
*(.rodata)
}

.data  :
{
start_ctors = .;
KEEP(*( .init_array ));
KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )));
end_ctors = .;

*(.data)
}

.bss  :
{
*(.bss)
}

/DISCARD/ :
{
*(.fini_array*)
*(.comment)
}
}

Прямо сейчас, как я загружаю это сначала сделать makefile:

make
make mykernel.bin
make install

а затем конечно в /boot/grub/grub.cfg Я добавил это:

### BEGIN MYKERNEL
menuentry 'Operating System Tut'{
multiboot /boot/mykernel.bin
boot
}
### END MYKERNEL ###

Потом когда я sudo rebootи выберите Operating System Tut из выпадающего списка выдает ошибку, которую я описал ранее:

error: secure boot forbids loading module from (hdo, gpt7)/boot/grub/x86_64-efi/multiboot.mod

error: You need to load your kernel first

Press any key to continue . . .

Опять же, я не понимаю, почему ядро ​​не загружается в первую очередь … Помощь будет принята с благодарностью.

3

Решение

Попробуйте выключить Secure Boot вариант в вашем BIOS и посмотреть, если это даст вам другой результат. Когда эта опция включена, микропрограмма проверяет, подписан ли ваш загрузчик, и предотвращает его выполнение, если это не так, или его подпись не соответствует ключу, хранящемуся в NVRAM, или занесена в черный список в NVRAM.

Увидеть Управление загрузчиками EFI для Linux: работа с безопасной загрузкой.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]