пытаемся починить загрузку ISO

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 19.02.22 02:13

Оказывается, по "прыжку в ядро" попадаем ровно в код релокации на адрес 100000. Откуда он тут?

Код: Выделить всё

real-mode-gdb$ disassemble 0x1000, +100
Dump of assembler code from 0x1000 to 0x1064:
=> 0x00001000:	pusha  
   0x00001001:	mov    esi,0x1000
   0x00001006:	mov    edi,0x100000
   0x0000100b:	mov    ecx,0x21008
   0x00001010:	cld    
   0x00001011:	rep movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
   0x00001013:	popa   
   0x00001014:	call   0x183f80
real-mode-gdb$ b *0x1014
Breakpoint 19 at 0x1014
real-mode-gdb$ del
real-mode-gdb$ si
0x00183f80 in ?? ()
real-mode-gdb$ disassemble 0x0183f80, +100
Dump of assembler code from 0x183f80 to 0x183fe4:
=> 0x00183f80:	call   0x111f90
   0x00183f85:	call   0x110c70
   0x00183f8a:	call   0x11c8b0
   0x00183f8f:	call   0x12a330
   0x00183f94:	call   0x130730
   0x00183f99:	call   0x134db0
   0x00183f9e:	call   0x10fc50
   0x00183fa3:	call   0x141030
   0x00183fa8:	call   0x142690
   0x00183fad:	call   0x148a90
   0x00183fb2:	call   0x14c170
   0x00183fb7:	call   0x13d4b0
   0x00183fbc:	call   0x159930
   0x00183fc1:	call   0x15b250
   0x00183fc6:	call   0x15f330
   0x00183fcb:	call   0x14e210
   0x00183fd0:	call   0x1655d0
   0x00183fd5:	call   0x16d3b0
   0x00183fda:	call   0x167010
   0x00183fdf:	call   0x1633f0
End of assembler dump.

; и если дальше шагать, то через некоторое время доходим досюда:


0x0011c8b3 in ?? ()
real-mode-gdb$ disassemble 0x011c8b3, +10
Dump of assembler code from 0x11c8b3 to 0x11c8bd:
=> 0x0011c8b3:	jmp    0x11c8b3
   0x0011c8b5:	push   edi
   0x0011c8b6:	push   esi
   0x0011c8b7:	push   eax
   0x0011c8b8:	pop    eax
   0x0011c8b9:	mov    edi,eax
   0x0011c8bb:	mov    DWORD PTR ds:0x11bc58,edi
End of assembler dump.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 19.02.22 02:16

Ядро для CD уже в старой версии запускается с адреса 100000. Я нашёл код, который перемещает: он порождается линкером и генерируется побайтно процедурой Linker0.InitTable.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 19.02.22 02:31

В общем, картина того, как загружается старая версия, более-менее ясна, в степени, достаточной для нашей задачи. Теперь надо понять, почему не загружается новая. Видимо, на это уйдёт ещё неделя, а вот насчёт починки - не берусь гадать. Во-первых, война уже начинается, чёрт его знает, что вообще завтра будет, может завтра уже и интернета никакого не будет. Во-вторых, самое страшное, что я могу себе представить - это то, что ядро стало слишком большим и куда-нибудь там не поместилось.

Чтобы выяснить, нужно прошагать загрузчик в новой версии так же, как в старой (к счастью, OBL.Asm не изменился, если не сломан сам ассемблер, конечно), и посмотреть, что же будет при "прыжке в ядро".

Крайняя команда QEMU - qemu-system-i386 -m 1025 -machine pc -serial stdio -net nic,model=pcnet -net user -s -S -boot d -cdrom A2-infinite-loop.iso

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 21.02.22 23:44

Выяснил, почему OBL.Bin используется для загрузки - потому что он прописан в виде константы по умолчанию в Partitions.Lib.

Соответственно, если ставим PartitionsLib.SetBootLoaderFile OBLUnreal.Bin ~
то вместо него идёт OBLUnreal.Bin

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 20:43

Данные по адресу 0x9d129 затираются - переполнение какого-то там буфера для конфигурационных строк.
Поставил watch на этот адрес и нашёл, что возврат должен произойти в адрес

SS:SP: 9D00:1FD6 (0x9EFD6) - надо доделать дизассемблирование.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 21:45

После "ER" там что-то появляется, но непохоже на OBL.bin - там подряд идёт 5 add-ов. На строку тоже непохоже

Код: Выделить всё

; ===== procedure: readsectors - rs. entry points
; in: eax = start sector number, es:bx = buffer,
; reserve bx for the sole use of the buffer address !!
;      cx = number of sectors to process (<128) thus precisely in cl
; mod: ax,bx,cx,dx,high(edi)
; note: it is the caller's responsibility that the transfer will not
; exceed a 64k address boundary.  if es:bx is page aligned, and cl <= 8,

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 23:23

Запуски readsectors после OBERON loading (собственно загрузка ядра)

Код: Выделить всё

ax = 8 - номер стартового сектора
es:bx = 0100:0000 - адрес для начала загрузки (1000, уже вызывает сомнения)
cx = 78 - кво-секторов
Думаю, что это уже неправильно. Но допустим. Во всяком случае, считывается ровно до конца 64кб сегмента

Код: Выделить всё

>(+ #x1000 (* #x200 #x78))
65536
Следующий останов, т.е. делаем

Код: Выделить всё

del
si
b *0x9d129
c
получаем

Код: Выделить всё

ax = 80
es:bx = 1000:0000
cx = 80
затем

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 23:35

По совету с SO определяем функцию

Код: Выделить всё

define nextreadsectors
>del
>si
>b *0x9d129
>c
>end
И доходим до ситуации, когда нам предлагают запороть в т.ч. и текущий код.
теперь watch *0x9d129 и nextreadsectors - но watch не срабатывает, блин.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 23:44

Теперь сработал - надо было после чтения адреса 9000, вручную пройти последний этап, т.к. del внутри команды nextreadsectors сносил и аппаратную точку надзора. Таким образом, действительно при загрузке ядра сносится загрузчик. Теперь надо понять, что с этим сделать.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 22.02.22 23:54

Итак, всё ясно - ядро тупо не поместилось.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 23.02.22 03:05

* всегда читать только по 1 сектору
* b *0x8140 - jump to kernel

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 23.02.22 03:29

Выложил диск черновой сборки на https://disk.yandex.ru/d/JYTe90U0x5swaw

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: пытаемся починить загрузку ISO

Сообщение БудДен » 23.02.22 15:14

И ещё один:

https://disk.yandex.ru/d/52ehKmsTJBVjuA

Запустился в VirtualBox, QEMU, на hp nc8000, но не запустился на ASUS G771JW. Пишите, что у вас.

Ответить