grub-mkrescue не может создать образ загрузочного CD

У меня есть этот iso образ, который, по-видимому, VirtualBox не может прочитать. Я в настоящее время использую GRUB и следующие этот учебник и в эпизоде ​​установки OS-VM. я записал на экран ошибку, поскольку я прошел через шаги здесь:

https://www.youtube.com/watch?v=ZGnPo34wOAw&Функция = youtu.be

вот мои файлы в настоящее время:

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

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

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

clean:
rm $(objects)
rm -rf iso

qemu_compile: all BoneOS.bin qemuqemu:
qemu-system-i386 -kernel BoneOS.bin

BoneOS.iso: BoneOS.bin
mkdir iso
mkdir iso/boot
mkdir iso/boot/grub
cp BoneOS.bin iso/boot/BoneOS.bin
echo 'set timeout=0'                      > iso/boot/grub/grub.cfg
echo 'set default=0'                     >> iso/boot/grub/grub.cfg
echo ''                                  >> iso/boot/grub/grub.cfg
echo 'menuentry "My Operating System" {' >> iso/boot/grub/grub.cfg
echo '  multiboot /boot/BoneOS.bin'    >> iso/boot/grub/grub.cfg
echo '  boot'                            >> iso/boot/grub/grub.cfg
echo '}'                                 >> iso/boot/grub/grub.cfg
grub-mkrescue -o BoneOS.iso iso

kernel.cc:

#define SWAP(a, b) do { typeof(a) temp = a; a = b; b = temp; } while (0)static  unsigned short* ViedoMemory =((unsigned short*)0xb8000);

typedef void (*constructor)();
extern "C" constructor start_ctors;
extern "C" constructor end_ctors;
extern "C" void callConstructors()
{
for(constructor* i = &start_ctors; i != &end_ctors; i++)
(*i)();
}class Foo
{
public:
Foo(int r)
{
x=r;
}

int getX()
{
return x;
}
private:
int x=0;
};

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

while (*dest!= '\0')
*dest++ ;
do
{
*dest++ = *src++;
}
while (*src != '\0') ;

return dest;
}

/* A utility function to reverse a string  */
void reverse(char str[], int length)
{
int start = 0;
int end = length -1;
while (start < end)
{
SWAP(*(str+start), *(str+end));
start++;
end--;
}
}

char* itoa(int num, char* str, int base)
{
int i = 0;
unsigned int isNegative = 0;

/* Handle 0 explicitely, otherwise empty string is printed for 0 */
if (num == 0)
{
str[i++] = '0';
str[i] = '\0';
return str;
}

/* In standard itoa(), negative numbers are handled only with
base 10. Otherwise numbers are considered unsigned. */
if (num < 0 && base == 10)
{
isNegative = 1;
num = -num;
}

/* Process individual digits */
while (num != 0)
{
int rem = num % base;
str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num = num/base;
}

/* If number is negative, append '-' */
if (isNegative)
str[i++] = '-';

str[i] = '\0'; /* Append string terminator */

/* Reverse the string */
reverse(str, i);

return str;
}

void printf(char *str)
{

for(int i=0;str[i]!='\0'; ++i)
ViedoMemory[i + 20 * 80]= (ViedoMemory[i + 20 * 80] & 0xFF00)|str[i];
}Foo bar(2);
extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber)
{

int *multiboot_struct_int = (int*)multiboot_structure;
char *str = "",*ram="RAM";
char* RAM_AM = itoa(*multiboot_struct_int,str,10);

printf(itoa(bar.getX(),str,10));
while(1);
}

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
.extern callConstructors
.globl loader

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

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

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)
}
}

ISO / загрузки / личинка / grub.cfg:

set timeout=0
set default=0

menuentry "My Operating System" {
multiboot /boot/BoneOS.bin
boot
}

Выше кода по какой-то причине при запуске через VirtualBox (видео выше показывает, как я это сделал), появляется сообщение об ошибке «Ошибка: не удалось прочитать с загрузочного носителя». Помощь будет оценена

редактировать

Улов здесь, хотя по какой-то причине он работает на QEMU, когда я делаю:

qemu-system-i386 -kernel BoneOS.bin

Но не показывает мне выбор меню

С Qemu

Когда я запускаю команду:

qemu-system-i386 -cdrom BoneOS.iso

Я не получаю загрузочное устройство, как Virtual Box, вот пример, иллюстрирующий его:

https://www.youtube.com/watch?v=8D6LtcMoztw&Функция = youtu.be

3

Решение

Задача ещё не решена.

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

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