Почему ОС не запускается на Virtual box, а на QEMU запускаеться?
-enable-kvm
, то оно тоже не будет работать.ret
в реализацию GDT::load_gdt()
и не вызывать load_tss()
то оно начинает в qemu-kvm работать:diff --git a/src/GDT/GDT_impl.s b/src/GDT/GDT_impl.s
index 4f69835abd9d..5476837f3d0a 100644
--- a/src/GDT/GDT_impl.s
+++ b/src/GDT/GDT_impl.s
@@ -2,6 +2,7 @@
.extern _ZN8SimpleOS3GDT7gdt_ptrE
_ZN8SimpleOS3GDT8load_gdtEv:
lgdt _ZN8SimpleOS3GDT7gdt_ptrE
+ ret
.global _ZN8SimpleOS3GDT8load_tssEv
_ZN8SimpleOS3GDT8load_tssEv:
зачем там реализуют разные модули, типа кеша, вроде в каком-то даже увидел конвеер исполнения команд, предсказатели переходов. И прочие. К примеру кеш, тлб, зачем он там нужен. если все как бы просиходит внутри машины?
Зачем адрес куда-то в кеш записывать, если этот кеш 3 уровня, или регистр лежит с точки зрения внешней среды, там же где и ram и доступ должен быть одинаковым.
Ассоциативная память. Если там внутри делается таблица адресов, виртуальных адресов. То к примеру для адресного пространства 4гб, будет 2^32 это будет в 32 раза дольше.
Короче, в итоге для поиска адреса в супер жесткой виртуальной машине, будет до 32 операции сравнений по словарю, потом суммарно где же в кешах каждого уровня, куча прочих проверок .... .
qemu-img dd -O raw if=file.qcow2 of=file.raw
.mkdir fs ; sudo mount file.raw fs
. Если там таблица разделов, можно каким-нибудь kpartx создать устройства для каждого из разделов и примонтировать нужные:$ mkdir fs ; sudo kpartx -av file.raw
add map loop0p1 (254:4): 0 65536 linear 7:0 2048
add map loop0p2 (254:5): 0 2029568 linear 7:0 67584
$ sudo mount /dev/mapper/loop0p2 fs
Как добавить поддержку vdi в qemu-img?
--enable-vdi
. Построить. Типа того:$ wget https://download.qemu.org/qemu-5.2.0.tar.xz
$ tar -xf qemu-5.2.0.tar.xz
$ mkdir build
$ cd build
$ ../qemu-5.2.0/configure --prefix=`pwd`/root --enable-vdi --enable-tools --disable-user --disable-system
$ make && make install
$ root/bin/qemu-img --help | grep vdi
Supported formats: blkdebug blklogwrites blkverify bochs cloop compress copy-on-read dmg file ftp ftps host_cdrom host_device http https luks nbd null-aio null-co nvme parallels qcow qcow2 qed quorum raw replication throttle vdi vhdx vmdk vpc vvfat
пытаюсь понять, почему qemu не хочет запускать ядро....
MAGIC equ 0x1BADB002
...
grubBoot:
dd MAGIC
dd FLAGS
; dd 0
dd (end_grubBoot - grubBoot)
dd -(MAGIC + FLAGS + (end_grubBoot - grubBoot))
; dd -(MAGIC + 0 + (end_grubBoot - grubBoot))
; dw 0
; dw FLAGS
; dd 8
end_grubBoot:
MAGIC equ 0x1BADB002
dd MAGIC
dd FLAGS
dd -(MAGIC + FLAGS)
...
Trace 0: 0x7f2a71e084c0 [00000000/000caa1a/0xb0]
----------------
IN:
0x00102060: 9b wait
0x00102061: db e3 fninit
0x00102063: bc 44 23 10 00 movl $0x102344, %esp
0x00102068: 53 pushl %ebx
0x00102069: 50 pushl %eax
0x0010206a: e8 68 00 00 00 calll 0x1020d7
Trace 0: 0x7f2a71e08800 [00000000/00102060/0xb0]
----------------
IN:
0x001020d7: 55 pushl %ebp
0x001020d8: 89 e5 movl %esp, %ebp
0x001020da: 68 00 10 10 00 pushl $0x101000
0x001020df: e8 8d ff ff ff calll 0x102071
Linking TBs 0x7f2a71e08800 [00102060] index 0 -> 0x7f2a71e08a40 [001020d7]
Trace 0: 0x7f2a71e08a40 [00000000/001020d7/0xb0]
----------------
IN:
0x00102071: 55 pushl %ebp
0x00102072: 89 e5 movl %esp, %ebp
0x00102074: 53 pushl %ebx
0x00102075: 83 ec 10 subl $0x10, %esp
0x00102078: c7 45 f4 00 80 0b 00 movl $0xb8000, -0xc(%ebp)
0x0010207f: c7 45 f8 00 00 00 00 movl $0, -8(%ebp)
0x00102086: eb 35 jmp 0x1020bd
Linking TBs 0x7f2a71e08a40 [001020d7] index 0 -> 0x7f2a71e08c80 [00102071]
Trace 0: 0x7f2a71e08c80 [00000000/00102071/0xb0]
----------------
IN:
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08c80 [00102071] index 0 -> 0x7f2a71e08f00 [001020bd]
Trace 0: 0x7f2a71e08f00 [00000000/001020bd/0xb0]
----------------
IN:
0x00102088: 8b 45 f8 movl -8(%ebp), %eax
0x0010208b: 8d 14 00 leal (%eax, %eax), %edx
0x0010208e: 8b 45 f4 movl -0xc(%ebp), %eax
0x00102091: 01 d0 addl %edx, %eax
0x00102093: 8b 55 f8 movl -8(%ebp), %edx
0x00102096: 8d 0c 12 leal (%edx, %edx), %ecx
0x00102099: 8b 55 f4 movl -0xc(%ebp), %edx
0x0010209c: 01 ca addl %ecx, %edx
0x0010209e: 0f b7 12 movzwl (%edx), %edx
0x001020a1: 89 d3 movl %edx, %ebx
0x001020a3: b3 00 movb $0, %bl
0x001020a5: 8b 4d f8 movl -8(%ebp), %ecx
0x001020a8: 8b 55 08 movl 8(%ebp), %edx
0x001020ab: 01 ca addl %ecx, %edx
0x001020ad: 0f b6 12 movzbl (%edx), %edx
0x001020b0: 66 0f be d2 movsbw %dl, %dx
0x001020b4: 09 da orl %ebx, %edx
0x001020b6: 66 89 10 movw %dx, (%eax)
0x001020b9: 83 45 f8 01 addl $1, -8(%ebp)
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08f00 [001020bd] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
Linking TBs 0x7f2a71e091c0 [00102088] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
----------------
IN:
0x001020d0: 90 nop
0x001020d1: 83 c4 10 addl $0x10, %esp
0x001020d4: 5b popl %ebx
0x001020d5: 5d popl %ebp
0x001020d6: c3 retl
Linking TBs 0x7f2a71e091c0 [00102088] index 0 -> 0x7f2a71e098c0 [001020d0]
Trace 0: 0x7f2a71e098c0 [00000000/001020d0/0xb0]
----------------
IN:
0x001020e4: 83 c4 04 addl $4, %esp
0x001020e7: eb fe jmp 0x1020e7
Trace 0: 0x7f2a71e09b00 [00000000/001020e4/0xb0]
----------------
IN:
0x001020e7: eb fe jmp 0x1020e7
Linking TBs 0x7f2a71e09b00 [001020e4] index 0 -> 0x7f2a71e09c40 [001020e7]
Trace 0: 0x7f2a71e09c40 [00000000/001020e7/0xb0]
Linking TBs 0x7f2a71e09c40 [001020e7] index 0 -> 0x7f2a71e09c40 [001020e7]
...
LDEMU=-melf_i386
kernel: $(CSOURCES) $(NASMSOURCES) $(LDFILE)
$(CC) $(CEMU) -std=c$(CSTD) -c $(CSOURCES) -ffreestanding -nostdlib -nostdinc -fno-pic
$(ASM) $(NASMSOURCES)
$(LD) $(LDEMU) --nmagic -T$(LDFILE) -o kernel *.o
Пробовал еще так: -net tap,vlan=0,ifname=tap0,script=no,downscript=no, назнал адреса хосту и гостевой, но не работает, хост даже не пингуется!
для иследовательских целей хотелось бы запустить не сжатое ядро системы, кто может что подсказать
но при вызове ... я увидел только адреса в памяти на консоли
Как это сделать правильно