我正在关注Bran的内核开发教程.在他的汇编代码中,他有以下代码块,他描述的不是那么重要,而是与GRUB有关.
; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4'
ALIGN 4
mboot:
; Multiboot macros to make a few lines later more readable
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end
; This is the GRUB Multiboot header. A boot signature
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
; AOUT kludge - …Run Code Online (Sandbox Code Playgroud) 我想用GRUB2启动一个自定义内核(非多启动),我读过我需要grub.cfg这样的:
menuentry "custom kernel" {
set root=(hd0,0)
chainloader +1
}
Run Code Online (Sandbox Code Playgroud)
所以,我有一些问题:
kernel /boot/kernel.bin)(hd0,0)是硬盘分区,如果我使用CD,我必须放什么?也许(cdrom0,0)?linux命令,我可以使用它来启动我的自定义内核(有一些更改)吗?Protected mode?这是由UEFI固件还是由GRUB grubx64.efi引导加载程序处理?
我看着https://wiki.osdev.org/UEFI声称:
UEFI固件...还准备了具有平面分段的保护模式环境,并为x86-64 CPU准备了具有身份映射分页的长模式环境。A20门也被启用。
但找不到任何官方资源来备份此信息。UEFI规范没有提及这一点。
linux内核提供了一个efi-stub,可以用作引导加载程序,但是在检查了其源之后,我看不到它是否启用了A20。因此,我仍然不知道它是UEFI固件的工作还是Bootloader的工作。
(我想为UEFI编写自己的引导程序,并想了解UEFI固件提供了“开箱即用”的设置以及我必须实现的部分)
我最近用Debian Wheezy双启动了一台Windows PC.安装顺利没有错误,但当我启动Debian时,我立即受到GRUB救援的欢迎:
Welcome to GRUB!
error: unknown filesystem.
Entering rescue mode...
Run Code Online (Sandbox Code Playgroud)
在使用该set命令进一步检查之后,我注意到它正在引导到错误的分区:
grub rescue> set
prefix=(hd0,gpt4)/boot/grub
root=hd0,gpt4
Run Code Online (Sandbox Code Playgroud)
这里指的(hd0,gpt4)是安装Debian的位置是什么时候(hd0,gpt5).所以,我做了一个快速修复,set用于将变量更改回应该是什么:
grub rescue> set prefix=(hd0,gpt5)/boot/grub
grub rescue> set root=gd0,gpt5
Run Code Online (Sandbox Code Playgroud)
在这样做之后,我只做了我记得应该做的事情来启动操作系统并运行:
grub rescue> insmod normal
Run Code Online (Sandbox Code Playgroud)
当我收到错误时,这就是事情开始出错的地方:
error: invalid arch independent ELF magic.
Run Code Online (Sandbox Code Playgroud)
然后我对这个问题做了一些研究,似乎常见的解决方案是从Live CD重新安装GRUB.所以,我启动了Debian的现场CD并执行以下操作:
sudo mount /dev/sda5 /mnt
sudo grub-install --root-directory=/mnt /dev/sda
Run Code Online (Sandbox Code Playgroud)
我收到错误的地方:
The file /mnt/boot/grub/stage1 not read correctly.
Run Code Online (Sandbox Code Playgroud)
虽然我可以保证这个文件确实存在并且可以编辑,因为我可以编辑它
sudo nano /mnt/boot/grub/stage1
Run Code Online (Sandbox Code Playgroud)
那可能是什么问题呢?
我正在学习操作系统制作的基础知识.我已经制作了一个兼容多引导头的.asm文件和一个.c文件..asm文件中的代码调用.c文件的主函数.
问题是QEMU无法从编译和链接.asm和.c文件后生成的文件启动.
它只是说它找不到可启动的设备.
虽然,我能够从一个简单的.asm文件启动,如: -
mov ax, 0x0e
mov al, 'H'
int 10h
times 510 - ($ - $$) db 0
jmp $
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
我还有什么需要做的吗?
有没有一种快速可靠的方法可以找出内存中 Multiboot 1 启动信息的总大小?
\n\n只是为了澄清:我不是在询问 EBX 寄存器中的值所指向的结构的大小,而是在询问内存中所有信息的总大小。
\n\n我目前正在开发 x86 Multiboot 1 兼容内核。该标准不保证 GRUB 将在何处放置此信息或其总大小。标准规定:
\n\n\n\n\n“Multiboot信息结构及其相关子结构可以由引导加载程序放置在内存中的任何位置(当然,为内核和引导模块保留的内存除外)。这是操作系统\xe2\x80\x99的责任以避免覆盖该内存,直到使用完毕为止。”
\n
实际上,这似乎总是在最低 1MB 内存中加载。\n到目前为止,在启动期间,我使用最低 1MB 的标识映射来初始化启动分页结构,以确保可以访问多重启动信息。找出这个结构的位置很简单,但我还没有找到任何关于找到准确尺寸的信息。(最好不要走遍整个结构)。
\n我在rc.local启动文件中犯了一个非常糟糕的错误.我在这个文件的列表中添加了一个带有infinte循环的进程,这样我的arch linux发行版就无法完全启动,因为这个进程阻止了进一步的启动过程.
有没有办法在grub中编辑这个rc.local文件,以便我可以删除这个过程?
我想学习linux内核编程,所以我从www.kernel.org下载了Linux内核3.7.6源代码.然而,在编辑任何内容之前,我尝试使用在线教程编译它.
在make花费大量的时间来编译和我还没有做到完全呢.有没有快速的方法来更改源代码并进行测试?因为我读过内核编译需要大约一个小时.
另外,如果可以在USB驱动器上复制和测试修改后的内核?是否可以在USB驱动器上安装GRUB,在USB上复制内核,在USB上配置GRUB然后运行它?如果是这样,请给我任何有相同步骤的资源.我的笔记本电脑上也安装了GRUB.如何在USB上设置新的GRUB而不会干扰我的笔记本电脑上的配置?
谢谢.. :)
在 CentOS 6 上,我们目前使用该选项加密 grub 密码password --md5,并且可以将其编写到我们的标准服务器构建中。
我们正忙于迁移到 CentOS 7,看来该password --md5选项已在 grub2 中删除并替换为grub2-mkpasswd-pbkdf2.
尽管我欢迎安全性的提高,但我找不到grub2-mkpasswd-pbkdf2通过标准输入将密码传递给命令的方法,而且 grub2 似乎已经删除了对 md5 的支持,这两者的结合破坏了我们的脚本构建自动化。
任何人都可以帮忙:
grub2-mkpasswd-pbkdf2?或者grub2-mkpasswd-pbkdf2?或者--md5?我正在 vps debian 9 上运行
\nmaster@vps726152:~$ cat /etc/os-release\nPRETTY_NAME="Debian GNU/Linux 9 (stretch)"\nNAME="Debian GNU/Linux"\nVERSION_ID="9"\nVERSION="9 (stretch)"\nVERSION_CODENAME=stretch\nID=debian\nRun Code Online (Sandbox Code Playgroud)\n当我尝试自动删除时,更新后开始出现错误(抱歉,它是法语)
\nmaster@vps726152:~$ sudo apt autoremove\nLecture des listes de paquets... Fait\nConstruction de l'arbre des d\xc3\xa9pendances\nLecture des informations d'\xc3\xa9tat... Fait\n0 mis \xc3\xa0 jour, 0 nouvellement install\xc3\xa9s, 0 \xc3\xa0 enlever et 0 non mis \xc3\xa0 jour.\n2 partiellement install\xc3\xa9s ou enlev\xc3\xa9s.\nApr\xc3\xa8s cette op\xc3\xa9ration, 0 o d'espace disque suppl\xc3\xa9mentaires seront utilis\xc3\xa9s.\nParam\xc3\xa9trage de linux-image-4.9.0-14-amd64 (4.9.246-2) ...\n/etc/kernel/postinst.d/initramfs-tools:\nupdate-initramfs: Generating /boot/initrd.img-4.9.0-14-amd64\n/etc/kernel/postinst.d/zz-update-grub:\n/usr/sbin/grub-mkconfig: 11: /etc/default/grub: systemd.unified_cgroup_hierarchy=0: not found\nrun-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 127\ndpkg: erreur …Run Code Online (Sandbox Code Playgroud)