C++ 您需要首先加载内核错误
现在,当我选择自定义操作系统时,当我从GRUB中的菜单执行操作系统时,我会得到一个紫色背景:C++ 您需要首先加载内核错误,c++,x86,gnu-assembler,osdev,grub,C++,X86,Gnu Assembler,Osdev,Grub,现在,当我选择自定义操作系统时,当我从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 . . . 。。我不一定明白为什么会这样。让我向您展示我的文件: 加载器
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 . . .
。。我不一定明白为什么会这样。让我向您展示我的文件:
加载器S:
linker.ld:
现在我加载它的方式是首先通过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重新启动时
,并从下拉列表中选择操作系统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 . . .
同样,我不明白为什么内核没有先加载。。。非常感谢您的帮助。尝试关闭BIOS中的
安全引导
选项,看看这是否会给您带来不同的结果。启用此选项后,固件会检查引导加载程序是否已签名,如果未签名,则会阻止其执行,或者其签名是否与存储在NVRAM中的密钥不对应,或者是否已在NVRAM中列入黑名单
请参阅。先生,我可以问您如何进入BIOS吗?@Dsafds当您打开计算机时,您应该会看到主板制造商的启动屏幕,同时在该屏幕上按delete键(有时会有所不同,取决于品牌-您可以查一下)进入BIOS。该键取决于制造商,但它通常是DEL或F2。好的,我设法从BIOS禁用了安全引导。但现在它给了我一个空的紫色屏幕。。它假设给我一个HeloWord,你可以看到C++文件的启动了吗?现在的问题似乎是您的
printf
实现,或者其他一些问题。它不会在引导时卡住。看看屏幕的左上角。它说你好世界
。我认为你的问题更多地与GRUB配置有关,但也可能是与硬件的一些交互作用,但这确实很难说。这些问题超出了问题的范围。你不妨看看。您可以编写一个循环,只需在当前屏幕的所有单元格中放置一个带有适当属性的空格。在80x25文本显示器上,有2000个单元,每个单元有2个字节。至于写入另一个位置viedomery[row*80+col+i]=(viedomery[row*80+col+i]&0xFF00)| str[i]代码>指定行和列的位置。80是列数。如果你在文本模式下使用不同的列数,你必须改变这一点。我不喜欢-Wno write strings
。我建议您不要使用它,只需将函数strlen
和printf
修改为使用const char*str
,而不是char*str
您问了一个如何确定行数的问题,我回答了这个问题,我回答了一个问题,即必须进行地址计算才能将事情放在一个特定的位置行/列。那个视频太简单了。你现在想做的事情远比那个视频复杂(是的,我之前看过)。和几乎所有其他模式相比,使用视频模式工作非常容易。当您处于保护模式时,事情并不容易。我曾尝试在QEmu上运行该内核,但没有成功。。。视频2演示了如何在VirtualBox中运行它:-)
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)
}
}
make
make mykernel.bin
make install
### BEGIN MYKERNEL
menuentry 'Operating System Tut'{
multiboot /boot/mykernel.bin
boot
}
### END MYKERNEL ###
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 . . .