Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 您需要首先加载内核错误_C++_X86_Gnu Assembler_Osdev_Grub - Fatal编程技术网

C++ 您需要首先加载内核错误

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 . . . 。。我不一定明白为什么会这样。让我向您展示我的文件: 加载器

现在,当我选择自定义操作系统时,当我从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 . . .
。。我不一定明白为什么会这样。让我向您展示我的文件:

加载器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 . . .