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

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

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

Сообщение БудДен » 08.12.21 01:52

было AMD64.Machine.Mod - FirstAddress

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

	; relocate the bootfile from 0x1000 to target address 0x100000

	PUSH RAX
	PUSH RSI
	PUSH RDI

	MOV RSI,1000H
	MOV RDI,100000H
	MOV RCX, LastAddress
	SUB RCX, RDI
	CLD


	REP MOVSB
	POP RDI
	POP RSI
	POP RAX	



	; continue in relocated bootfile
	JMP DWORD 100000H - 1000H + Skip
Skip:


	; save arguments passed by bootloader
	MOV bootFlag, RAX
	MOV initRegs0,RSI
	MOV initRegs1, RDI

END FirstAddress;
А стало - да то же самое стало, но нет INITIAL, т.е. неясно, почему это будет вызываться.

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

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

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

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

cd /mnt/c/ob && xxd jaos/Win32/Test/A2mini.iso > new.hex && xxd jaos2/Test/A2mini.iso > old.hex && diff old.hex new.hex | less

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

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

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

Предположительно, в ревизии 2408 A2 была способна поставить себя с ISO диска.

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

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

Сообщение БудДен » 15.02.22 22:06

Та ревизия уж слишком старая. Ищем поновее, инструкции по сборке - в Build.Tool

2018-03-09 - rebuilt release - нативный релиз не собирается

2016-05-01 - rebuilt release - метка Hi - инсталлятор создаётся (без oberon* и *src.zip), запускается с ISO, A2 зависает при копировании файлов - отсюда уже растёт ветка яос-03-кандидат-1, залитая в итоге в ЯОС.

2015-10-21 - rebuilt release, 6498, самый поздний загрузчик с https://sourceforge.net/projects/a2oberon/ - собирается, устанавливается, во всяком случае, если выкинуть часть файлов. Ветка что-то последний инсталлятор (только у меня дома).

2015-09-09 - rebuilt release (binary object file based)
- работает, хотя сначала файлы не хотели копироваться на образ - пришлось урезать список (выкинул все исходники) - метка Mid

2014-03-01 rebuilt release - даже не собирается релиз

2013-12-20 rebuilt release - линкер падает также (на модуле systemtools) - работает, ставим метку Lo
Последний раз редактировалось БудДен 17.02.22 00:03, всего редактировалось 9 раз.

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

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

Сообщение БудДен » 16.02.22 00:41

-
Последний раз редактировалось БудДен 17.02.22 00:04, всего редактировалось 4 раза.

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

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

Сообщение БудДен » 16.02.22 21:07

Совет про образ HDD (тут не совсем в тему, но запишу, на всякий случай)

На дисках с WinPE обычно есть Paragon HDM
Им backup -им из ВМ и разворачиваем на железо

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

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

Сообщение БудДен » 17.02.22 00:19

IDE.bin не нужен для загрузки ISO образа - скорее всего он нужен для последующей установки системы. Значит, нас интересует CD.bin - надо разобраться, что в нём сломано.

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

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

Сообщение БудДен » 17.02.22 00:34

Смотрим по состоянию на 2015-10-21
* Kernel
* Traps
* ATADisks - видимо, отвечает за другие диски, а не за CD?
* DiskVolumes - какие-то там на дисках. Нужен для CD - то неведомо. Судя по наличию слов EL TORITO и GetOberonFS - скорее да.
* DiskFS - AOS Disk File System
* Loader - как я понял, отвечает за возможность подгрузки модулей
* BootConsole ~ читает конфигурацию и выполняет команды. А откуда берёт конфигурацию? - ага, видимо она заносится
командой Partitions.SetConfig!

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

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

Сообщение БудДен » 17.02.22 00:45

Из чтения конфигурации видно, что можно настроить трассировку через последовательный порт. Видимо, надо это сделать.
Кроме того, модуль DiskVolumes используется (данные из современной ЯОС, а не из той старой):
PartitionsLib.Mod FATScavenger.Mod Partitions.Mod DiskTests.Mod DiskBenchmark.Mod
Installer.Mod WMPartitionsComponents.Mod WMPartitions.Mod WMInstaller.Mod
CDRecordUtils.Mod CDRecordLib.Mod MakeIsoImages.Mod CDRecord.Mod
WMCDRecorder.Mod
Значит, можно отдельно протестировать способность читать диски, если вдруг дело в этом. Хотя лучше сначала всё же наладить трассировку, чем проверять
подряд всё - вдруг что-то всё же работает.

Также нужно не забывать про ограничение на 1.44 мб

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

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

Сообщение БудДен » 17.02.22 00:46

Итак, следующая цель - наладить QEMU так, чтобы загрузиться с образа за 2015-10-21 и увидеть отладочный вывод. Затем пытаемся сделать то же самое с новой версией.

Трассировка (и загрузка с CD) делается примерно так:

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

qemu-20200221\qemu-system-x86_64 -drive file=A2IDE.img,format=raw -m 1025 -machine pc -serial stdio -net nic,model=pcnet -net user -boot d -cdrom A2_Rev-6498_serial-trace.iso 
Чтобы убедиться, что загрузка идёт не с жёсткого диска, можно выкинуть аргумент -drive

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

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

Сообщение БудДен » 17.02.22 22:49

Ничего не трассируется, всё заканчивается на "OBERON Loading". возможные дальнейшие действия:

* ✓ проверить, работает ли запись CDROM в новой версии - вдруг дело в этом. Для этого записать образ от версии, которая загружалась, но новой записывалкой, и сравнить iso-файлы - да, работает. Образ из старых файлов, записанный в свежей ЯОС, загружается.

* почитать маны и понять смысл всех параметров

* попробовать отладить процесс загрузки после слов OBERON Loading в работающей CD-ROM версии, новой HDD версии и/или неработающей CDROM версии.

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

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

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

Вот вспомнил, Сергей Дурманов объяснял:
ну вот как поменяли формат объектных файлов и сценарий линковки. Там проблема вот в чем - раньше при линковке в образ записывалась программа, которая перемещала образ после загрузки, а сейчас нет, и эль-торито, загрузив образ передавал управление этой программе. сейчас это поломано. В принципе, эль-торито может загружать образы hdd(сейчас там эмуляция дискеты). Но там чего-то не хватат и образ hdd тоже не грузится, хотя загрузчик mbr запускается. дальше я не экспериментировал по причине отсутствия времени
...ну и MakeIso там простейшая реализация

...а, вроде вспомнил, при использовании эмуляции hdd, нужно в образ записывать соответствующую информацию, типа геометрии диска и т.д.

...в iso образ

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

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

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

В общем, ни черта не понимаю, попробую отладить. Прошлый опыт отладки - тут http://вече.программирование-по-русски. ... t=10#p3308

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

break *0x07c00
при срабатывании уж появилось "Booting from DVD/CD"

jmp 7c29 - похоже на "jmp short entry0" в OBLUnreal.Asm
ljmp 0xc88c, x7c0002e (боже, какая же абракадабра!)

попали на адрес 0x2e,

Дальше что-то, чему аналогии особо я не нашёл, дальше шагнул несколько раз по 100 раз и увидел на экране "OB". Находимся по адресу 0x7cd0.

Буковки выводит процедура Mark.

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

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

Сообщение БудДен » 18.02.22 00:13

Так, я сделал точку прерывания на 0x7c00 , и потом два раза по si 100. На экране появилась надпись "О"
Но при этом раскрытый ассемблерный код как-то не так выглядит, как надо, почти никак он выглядит.

Похоже на это: https://stackoverflow.com/questions/329 ... it-gets-tr

и это

https://gitlab.com/qemu-project/qemu/-/issues/141

Не лучшая точка останова, но надо спать по ночам!

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

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

Сообщение БудДен » 18.02.22 00:45

Итак. команды для запуска:

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

qemu-system-i386 -m 1025 -machine pc -serial stdio -net nic,model=pcnet -net user -boot d -cdrom A2.iso -s -S

gdb -ix gdb_init_real_mode.txt -ex 'target remote localhost:1234' -ex 'break *0x07c00' 
После срабатывания точки останова примерно si 100 выводит на букву "О". gdb 7.12.0, qemu-system-i386 2.8.1 . Это важно, потому что потом сломали.

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

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

Сообщение БудДен » 18.02.22 13:36

При работе с волшебным скриптом для реального режима иногда возникают левые точки останова и при вызове команды с никакого продвижения вперёд не происходит. Или, возможно, как-то возникают и не удаляются должным образом временные точки останова. Если забуксовали на точке останова, то нужно её удалить, (info break, del N), шагнуть вперёд на шаг (si) и поставить снова на том же месте (break *0xFAAA)

break *0x7ddb - останавливается после печати (процедура mark) - это ревизия 6498, образ собран мной, хотя вряд ли этот загрузчик много менялся. Нужно учесть, что в реальном режиме точка останова ставится на значение IP, а реальный адрес - это CS:IP, поэтому возможны ложные срабатывания.

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

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

Сообщение БудДен » 18.02.22 13:43

Не, и так не работает. Точнее сказатЬ, выводит только первую букву "O", наверное, дело в перемещении кода. Пойду от первой буквы О по шагам. Теперь надо было перешагнуть через int12h - она возвращает размер памяти и не передаёт управление, т.е. это именно вызов. Значит, нужно встать на адрес 07с0:003c = 0x7c3c, поскольку неясно, как ставить брекпойнт на него, я поставил оба - b *0x03c и b *0x7c3c. Сработал первый из них. Убираю оба (del)

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

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

Сообщение БудДен » 18.02.22 13:58

Теперь попал в какой-то код, где есть int 12. Похоже, что этот код сейчас будет перемещать что-то, а именно бутлоадер, судя по комментарию в OblUnreal.Asm:
; Boot loader is moved to 2nd last 4k page below memtop as returned by int 12h
; Top 2k (tablesize) of this page is used for the boot table
; Bottom 2k (lsize) of this page is used for the bootstrap loader
; The page above the bootstrap loader is reserved for the boot loader stack.
; The kernel can find the boot page by looking for the boot area (type 3)
И наличию команды rep movs BYTE PTRS es:[di], BYTE PTR ds:[si]

В ней и попробую понять, куда всё переедет, чтобы поставить новый брекпойнт в функции mark.

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

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

Сообщение БудДен » 18.02.22 14:03

007c0:0050 : es:[di] = 9d00:0000 , ds:si = 07c0:0000 . Нос - перёд, корма - зад, значит, мы переезжаем на 9d00. Попробую дошагать, может недалеко до вызова уже перемещённого кода. Цикл перемещения останавливается на каждый байт, поэтому b *0x052 помогает.

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

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

Сообщение БудДен » 18.02.22 14:10

дошагал до места, похожего на entry1 (странно, мы вроде там уже были)

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

CS:IP: 9D00:0059 (0x9D059)
---------------------------[ CODE ]----
   0x9d059:	mov    ax,cs
   0x9d05b:	mov    ds,ax
   0x9d05d:	mov    es,ax
   0x9d05f:	mov    ss,ax
   0x9d061:	mov    sp,0x2000
Дальше опять попадаем в mark,

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

CS:IP: 9D00:01D7 (0x9D1D7)
b *0x1da

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

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

Сообщение БудДен » 18.02.22 14:25

Складывается впечатление, что брекпойнт на значение IP нужно ставить тогда, когда CS соответствует тому же, на который хотим поставить. Т.е. если у нас сейчас CS = АААА, а нужно поставить на CS = BBBB, IP = CCCC, то не сработает брекпойнт на CCCC. Нужно дождаться ситуации, когда CS = BBBB и уже тогда ставить.

Сценарий от начала:

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

b *0x07c00
c
si 2
# CS:IP = 07C0:002E (0x07C2E)
b *0x7c3c
c
# напечаталась "O", CS = 07C0
del
b *0x7c52
c
# CS:IP: 07C0:0052
del
# теперь надо дошагать до entry1
si 3
# прошагнули возврат, теперь CS:IP: 9D00:0059
Считаем, что мы в начале entry1, поскольку код выглядит так:

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

CS:IP: 9D00:0059 (0x9D059)
---------------------------[ CODE ]----
   0x9d059:	mov    ax,cs
   0x9d05b:	mov    ds,ax
   0x9d05d:	mov    es,ax
   0x9d05f:	mov    ss,ax
   0x9d061:	mov    sp,0x2000
   0x9d064:	sti    
   0x9d065:	call   0x9d1cc

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

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

Сообщение БудДен » 18.02.22 14:39

Но при этом часть кода вырезана и сразу после mov sp идёт кусок entry2:
Видимо, в этом и состоит магия перемещения.

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

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

Сообщение БудДен » 18.02.22 14:43

Идём дальше

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

si 6 # дошагали до вызова mark
si # заходим в mark
Теперь можно попробовать поставить точку останова после вывода буквы и она по идее должна сработать для остальных букв, если не будет новых перемещений. Рисковать не будем, пробуем обе.

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

b *0x01db
b *0x9d1db
# сработала на 0x01db, вывелось "B"
del
si 
Тут либо колесо сансары, либо пролетает до полной загрузки. Ну достало!

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

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

Сообщение БудДен » 18.02.22 15:03

Переорганизовываем: .gdbinit, в него пишем

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

source gdb_init_real_mode.txt
Он далее при запуске ругается и пишет, где нужно разрешить запуск этого скрипта - делаем это.
Теперь создаём commands.gdb, на данный момент - такой:

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

target remote localhost:1234
b *0x07c00
c
si 2
# CS:IP = 07C0:002E (0x07C2E)
b *0x7c3c
c
# напечаталась "O", CS = 07C0
del
b *0x7c52
c
# CS:IP: 07C0:0052
del
# теперь надо дошагать до entry1
si 3
# прошагнули возврат, теперь CS:IP: 9D00:0059
si 6 
# дошагали до вызова mark, сейчас зайдём в него
si 
и запускаем его:

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

gdb --command=commands.gdb

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

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

Сообщение БудДен » 18.02.22 15:19

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

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

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

Сообщение БудДен » 18.02.22 15:20

Попробовал сделать stepo, стоя перед вызовом readsectors - не сработало.

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

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

Сообщение БудДен » 18.02.22 17:34

Текущее состояние:

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

target remote localhost:1234
b *0x07c00
c
si 2
# CS:IP = 07C0:002E (0x07C2E)
b *0x7c3c
c
# напечаталась "O", CS = 07C0
del
b *0x7c52
c
# CS:IP: 07C0:0052
del
# теперь надо дошагать до entry1
si 3
# прошагнули возврат, теперь CS:IP: 9D00:0059
si 6 
# дошагали до вызова mark, сейчас зайдём в него
si 
# чушь какая-то, срабатывает одна, если ставлю обе, или какой-то рандом :(
b *0x01db
b *0x9d1db
c
del
si 2
# вернулиь из mark в место с комментарием в OBLUnreal.Asm
si 9 
## стоим прямо перед вызовом readsectors
b *0x9d0cc
b *0x0cc
c
del
# стоим перед вызовом locatekernel
b *0x09d0dd
b *0x0dd
c
del
# стоим перед переходом после метки rk2
si
# шагнули (переход н произошёл)
# CS:IP: 9D00:00DF (0x9D0DF)
b *0x09d0f1
b *0x0f1
c
del
# стоим перед переходом после метки rk3
si
# переход не произошёл, CS:IP: 9D00:00F3 (0x9D0F3)
si 5
# дошагали до call readsectors после rk4
b *0x103
b *0x09d103
c
# вернулиcь из readsectors
si 6
# дошли до развилки после rk5, там цикл
# примерно CS:IP: 9D00:0112 (0x9D112)
b *0x0125
b *0x9d125
# дошли до jmp word nexsector
# AX: 1000 BX: 0F00 CX: 0078 DX: 0002
# SI: 0814 DI: 0001 SP: 1FFA BP: 0000
# CS: 9D00 DS: 9D00 ES: 1000 SS: 9D00

# IP: 0125 EIP:00000125
# CS:IP: 9D00:0125 (0x9D125)
# SS:SP: 9D00:1FFA (0x9EFFA)
# SS:BP: 9D00:0000 (0x9D000)
c
del
si
# перешли на nextsector, CS:IP: 9D00:024E (0x9D24E)
# похоже, сейчас вернёмся до rk2, попробуем выйти из цикла
b *0x09d26b
b *0x26b
c
del
# остановились перед переходом по контрольной сумму.

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

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

Сообщение БудДен » 19.02.22 00:24

для дизассемблирования нужно подать команды

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

set logging file имя-файла
set logging on
x/1024i адрес-как-он-виден
set logging off
После сопоставления c OBL.asm: получаем

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

   locatekernel:
   0x9d202:	mov    si,0x800
   fk1:
   0x9d205:	mov    al,BYTE PTR [si]
   0x9d207:	inc    al
   0x9d209:	je     0x9d209
   0x9d20b:	cmp    al,0x8
   0x9d20d:	je     0x9d214
   0x9d20f:	add    si,WORD PTR [si+0x4]
   0x9d212:	jmp    0x9d205 ; fk1
   fk2:
   0x9d214:	mov    eax,DWORD PTR [si+0x10]
   0x9d218:	mov    ds:0x31,eax
   0x9d21c:	push   si
   0x9d21d:	mov    si,WORD PTR ds:0x27
   0x9d221:	call   0x9d243
   0x9d224:	mov    si,0x757
   0x9d227:	call   0x9d243
   0x9d22a:	pop    si
   0x9d22b:	mov    bl,BYTE PTR [si+0xe]
   0x9d22e:	mov    BYTE PTR ds:0x25,bl
   0x9d232:	mov    di,WORD PTR [si+0xc]
   0x9d235:	mov    eax,DWORD PTR [si+0x8]
   0x9d239:	shr    eax,0x4
   0x9d23d:	mov    es,ax
   0x9d23f:	add    si,0x14
   0x9d242:	ret   
   writestring: 
   0x9d243:	lods   al,BYTE PTR ds:[si]
   0x9d244:	cmp    al,0x0
   0x9d246:	je     0x9d24d
   0x9d248:	call   0x9d1d6
   0x9d24b:	jmp    0x9d243
   wsend:
   0x9d24d:	ret    
   nextsector:
   0x9d24e:	sub    WORD PTR [si+0x4],cx
   0x9d251:	jne    0x9d0d5 ; rk2
   0x9d255:	pop    WORD PTR [si+0x4]
   0x9d258:	pop    DWORD PTR [si]
   0x9d25b:	add    si,0x8
   0x9d25e:	dec    di
   0x9d25f:	jne    0x9d0cf ; rk1
   0x9d263:	mov    si,0x76c
   0x9d266:	cmp    BYTE PTR ds:0x25,0x0
   0x9d26b:	jne    0x9d1ab ; rs7 
   0x9d26f:	mov    si,0x800
   fe0:
   0x9d272:	mov    al,BYTE PTR [si]
   0x9d274:	cmp    al,0x8
   0x9d276:	jne    0x9d288
   0x9d278:	lea    bx,[si+0x8]
   0x9d27b:	mov    WORD PTR ds:0x748,bx
   0x9d27f:	mov    bx,WORD PTR [si+0x4]
   0x9d282:	add    bx,si
   0x9d284:	mov    WORD PTR ds:0x35,bx
   fe2:
   0x9d288:	inc    al
   0x9d28a:	je     0x9d291 ; fe1
   0x9d28c:	add    si,WORD PTR [si+0x4]
   0x9d28f:	jmp    0x9d272 ; fe0
   fe1:
   0x9d291:	mov    DWORD PTR [si],0x3
   0x9d298:	mov    DWORD PTR [si+0x4],0x10
   0x9d2a0:	xor    eax,eax
   0x9d2a3:	mov    ax,cs
   0x9d2a5:	shl    eax,0x4
   0x9d2a9:	mov    DWORD PTR [si+0x8],eax
   0x9d2ad:	mov    DWORD PTR [si+0xc],0x2000
   0x9d2b5:	add    si,WORD PTR [si+0x4]
   0x9d2b8:	mov    ah,0x88
   0x9d2ba:	int    0x15
   0x9d2bc:	and    eax,0xffff
   0x9d2c2:	mov    DWORD PTR [si],0x4
   0x9d2c9:	mov    DWORD PTR [si+0x4],0x10
   0x9d2d1:	mov    DWORD PTR [si+0x8],0x100000
   0x9d2d9:	shl    eax,0xa
   0x9d2dd:	mov    DWORD PTR [si+0xc],eax
   0x9d2e1:	add    si,WORD PTR [si+0x4]
   bt1: ?
   0x9d2e4:	cld    
   0x9d2e5:	push   ds
   0x9d2e6:	pop    es
   0x9d2e7:	mov    DWORD PTR [si],0xffffffff
   0x9d2ee:	mov    DWORD PTR [si+0x4],0x0
   0x9d2f6:	lea    bx,[si+0x8]
   0x9d2f9:	mov    WORD PTR ds:0x37,bx
   0x9d2fd:	call   0x9d67f
   0x9d300:	cmp    BYTE PTR ds:0xa,0x0
   0x9d305:	jne    0x9d366
   0x9d307:	push   ds
   0x9d308:	mov    ax,0x0
   0x9d30b:	mov    ds,ax
   0x9d30d:	mov    al,ds:0x417
   0x9d310:	pop    ds
   0x9d311:	test   BYTE PTR ds:0xa,al
   0x9d315:	jne    0x9d366
   0x9d317:	jmp    0x9d3c8
   ee20:
   0x9d31a:	mov    al,ds:0x58
   0x9d31d:	and    al,0xdf
   ee27:
   0x9d31f:	cmp    al,0x43 ; 'C' 
   0x9d321:	je     0x9d3c8 ; eend
   0x9d325:	cmp    al,0x0
   0x9d327:	je     0x9d366
   0x9d329:	cmp    al,0x57 ; 'W'
   0x9d32b:	je     0x9d332
   0x9d32d:	mov    si,0x778
   0x9d330:	jmp    0x9d38e

   ; write boot table
   ee22:
   0x9d332:	mov    si,0x800
   ee24:
   0x9d335:	cmp    BYTE PTR [si],0x3
   0x9d338:	je     0x9d33f
   0x9d33a:	add    si,WORD PTR [si+0x4]
   0x9d33d:	jmp    0x9d335 ; ee24
   ee23:
   0x9d33f:	mov    DWORD PTR [si],0xffffffff
   0x9d346:	mov    eax,ds:0x39
   0x9d34a:	mov    bx,0x800
   0x9d34d:	mov    cx,0x4
   0x9d350:	mov    WORD PTR ds:0x3f,0x4300
   0x9d356:	call   0x9d12f ; writesectors
   0x9d359:	mov    DWORD PTR [si],0x3
   0x9d360:	mov    si,0x764
   0x9d363:	call   0x9d243 ; writestring
   ee0: 
   0x9d366:	call   0x9d67f ; InitVal
   0x9d369:	mov    si,WORD PTR ds:0x748
   0x9d36d:	lods   al,BYTE PTR ds:[si]
   0x9d36e:	cmp    al,0x0
   0x9d370:	je     0x9d38b
   0x9d372:	push   ax
   0x9d373:	push   si
   0x9d374:	mov    si,0x769
   0x9d377:	call   0x9d243
   0x9d37a:	pop    si
   0x9d37b:	pop    ax
   0x9d37c:	call   0x9d1d6
   0x9d37f:	lods   al,BYTE PTR ds:[si]
   0x9d380:	cmp    al,0x0
   0x9d382:	jne    0x9d37c
   0x9d384:	mov    al,0x3d
   0x9d386:	call   0x9d248
   0x9d389:	jmp    0x9d36d
   0x9d38b:	mov    si,0x7b7
   0x9d38e:	call   0x9d243
   0x9d391:	mov    di,0x58
   0x9d394:	mov    ah,0x0
   0x9d396:	int    0x16
   0x9d398:	cmp    al,0x0
   0x9d39a:	je     0x9d394
   0x9d39c:	cmp    al,0xd
   0x9d39e:	je     0x9d3c0
   0x9d3a0:	cmp    al,0x8
   0x9d3a2:	jne    0x9d3b2
   0x9d3a4:	cmp    di,0x58
   0x9d3a7:	je     0x9d394
   0x9d3a9:	dec    di
   0x9d3aa:	mov    si,0x760
   0x9d3ad:	call   0x9d243
   0x9d3b0:	jmp    0x9d394
   0x9d3b2:	cmp    di,0x128
   0x9d3b6:	je     0x9d394
   0x9d3b8:	mov    BYTE PTR [di],al
   0x9d3ba:	inc    di
   0x9d3bb:	call   0x9d1d6
   0x9d3be:	jmp    0x9d394
   0x9d3c0:	mov    BYTE PTR [di],0x0
   0x9d3c3:	call   0x9d517
   0x9d3c6:	jmp    0x9d366
   eend:
   0x9d3c8:	mov    bx,WORD PTR ds:0x41
   0x9d3cc:	cmp    bx,0x0
   0x9d3cf:	je     0x9d3dc ; oldInit
   0x9d3d1:	or     bx,0x4000
   0x9d3d5:	mov    ax,0x4f02
   0x9d3d8:	int    0x10
   0x9d3da:	jmp    0x9d410  ; apm
   oldInit:
   0x9d3dc:	call   0x9d674
   0x9d3df:	mov    si,0x58
   in1:
   0x9d3e2:	call   0x9d640
   0x9d3e5:	jae    0x9d3f8
   0x9d3e7:	mov    ah,al
   0x9d3e9:	shl    ah,0x4
   0x9d3ec:	call   0x9d640
   0x9d3ef:	jae    0x9d3f8
   0x9d3f1:	or     ah,al
   0x9d3f3:	mov    BYTE PTR [si],ah
   0x9d3f5:	inc    si
   0x9d3f6:	jmp    0x9d3e2
   in6:
   0x9d3f8:	mov    BYTE PTR [si],0xc3
   0x9d3fb:	pusha  
   0x9d3fc:	push   ds
   0x9d3fd:	push   es
   0x9d3fe:	mov    ax,cs
   0x9d400:	sub    ax,0x40
   0x9d403:	mov    es,ax
   0x9d405:	xor    di,di
   0x9d407:	call   0x9d058
   0x9d40a:	pop    es
   0x9d40b:	pop    ds
   0x9d40c:	call   0x9d507 ; passkpar
   0x9d40f:	popa   
   apm:
   0x9d410:	mov    ax,0x5300
   0x9d413:	xor    bx,bx
   0x9d415:	int    0x15
   0x9d417:	jb     0x9d46c
   0x9d419:	mov    ax,0x5303
   0x9d41c:	xor    bx,bx
   0x9d41e:	int    0x15
   0x9d420:	jb     0x9d46c
   0x9d422:	shl    eax,0x4
   0x9d426:	mov    ds:0x7da,ax
   0x9d429:	shr    eax,0x10
   0x9d42d:	and    al,0xf
   0x9d42f:	mov    ds:0x7dc,al
   0x9d432:	shl    ecx,0x4
   0x9d436:	mov    WORD PTR ds:0x7e2,cx
   0x9d43a:	shr    ecx,0x10
   0x9d43e:	and    cl,0xf
   0x9d441:	mov    ds:0x7e4,al
   0x9d444:	shl    edx,0x4
   0x9d448:	mov    WORD PTR ds:0x7ea,dx
   0x9d44c:	shr    edx,0x10
   0x9d450:	and    dl,0xf
   0x9d453:	mov    BYTE PTR ds:0x7ec,dl
   0x9d457:	mov    DWORD PTR ds:0x7f0,ebx
   0x9d45c:	mov    ax,0x530e
   0x9d45f:	xor    bx,bx
   0x9d461:	mov    cx,0x101
   0x9d464:	int    0x15
   0x9d466:	mov    WORD PTR ds:0x7f4,0x2f
   apmend:
   0x9d46c:	mov    dx,0x3f2
   0x9d46f:	mov    al,0xc
   0x9d471:	out    dx,al
   0x9d472:	cli    
   0x9d473:	call   0x9d639 ; empty8042
   0x9d476:	mov    al,0xd1
   0x9d478:	out    0x64,al
   0x9d47a:	call   0x9d639 ; empty8042
   0x9d47d:	mov    al,0xdf
   0x9d47f:	out    0x60,al
   0x9d481:	call   0x9d639 ; empty8042
   0x9d484:	mov    al,0xff
   0x9d486:	out    0x21,al
   0x9d488:	out    0xa1,al
   0x9d48a:	mov    ax,0x1020
   di1:
   0x9d48d:	out    0x20,al
   0x9d48f:	xor    cx,cx
   0x9d491:	loop   0x9d491
   0x9d493:	dec    ah
   0x9d495:	jne    0x9d48d
   0x9d497:	lidtw  ds:0x7fa
   0x9d49c:	xor    eax,eax
   0x9d49f:	mov    ax,cs
   0x9d4a1:	shl    eax,0x4
   0x9d4a5:	add    eax,0x7c0
   0x9d4ab:	mov    ds:0x7f6,eax
   0x9d4af:	lgdtw  ds:0x7f4
   ; здесь где-то db66h ; temporary fix
   0x9d4b4:	push   0x8
   0x9d4b7:	push   DWORD PTR ds:0x31 ; kentry
   0x9d4bc:	xor    edx,edx
   0x9d4bf:	mov    dx,ss
   0x9d4c1:	shl    edx,0x4
   0x9d4c5:	mov    eax,edx
   0x9d4c8:	add    eax,0x800
   0x9d4ce:	push   eax
   0x9d4d0:	push   DWORD PTR ds:0x29
; pass the 32-bit physical address of the frame buffer to
; Machine.Mod and AosDisplayLinear.Mod   
   0x9d4d5:	push   DWORD PTR ds:0x2d
   0x9d4da:	xor    eax,eax
   0x9d4dd:	mov    ebp,eax
   0x9d4e0:	mov    ax,sp
   0x9d4e2:	add    edx,eax

; Enter 80286 protected mode

   0x9d4e5:	smsw   ax
   0x9d4e8:	or     al,0x1
   0x9d4ea:	lmsw   ax
   0x9d4ed:	jmp    0x9d4ef ; kd0, flush instruction (prefecth) queue
   kd0: ; kernel data segment selector
   0x9d4ef:	mov    ax,0x10
   0x9d4f2:	mov    ss,ax
   0x9d4f4:	mov    ds,ax
   0x9d4f6:	mov    es,ax
   0x9d4f8:	mov    fs,ax
   0x9d4fa:	mov    gs,ax

   ; jump to kernel
   0x9d4fc:	mov    esp,edx
   0x9d4ff:	pop    edi ; kpar1
   0x9d501:	pop    esi ; kpar0
   0x9d503:	pop    eax
   ; здесь db066h
   0x9d505:	retf ; jump to kernel via Machine.Mod as 1st module  
   passkpar: 
   0x9d507:	mov    ds:0x29,ax
   0x9d50a:	mov    WORD PTR ds:0x2b,bx
   0x9d50e:	mov    WORD PTR ds:0x2d,cx
   0x9d512:	mov    WORD PTR ds:0x2f,dx
   0x9d516:	ret    
   0x9d517:	mov    di,0x58
   0x9d51a:	cmp    BYTE PTR [di],0x0
Т.е. нас интересует адрес b *0x9d4e2

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

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

Сообщение БудДен » 19.02.22 00:59

В общем, дошагал до перехода в ядро, но оно выглядит уныло. То ли там линкер что-то дописал, то ли дело в переключении архитектуры (я пользовался
https://stackoverflow.com/questions/142 ... isassamble этим советом),

но я не смог дошагать до (невнятной) процедуры (I386.Machine.Mod).PushBootValues, поэтому вставил в неё int 3. Посмотрим.

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

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

Сообщение БудДен » 19.02.22 01:34

Вставил - теперь машина перегружается. Не уверен, что это прям круто, но во всяком случае какая-то реакция на изменения. Отловить int 3 вроде нельзя

https://github.com/cirosantilli/linux-k ... /issues/37

Но вот есть прекрасный совет:

https://rwmj.wordpress.com/2016/04/21/t ... reakpoint/

Надо просто зациклить код, и тогда можно его остановить с помощью Ctrl-C. да, сработало:

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

   0xc943:	add    BYTE PTR [bx+si],al
   0xc945:	add    BYTE PTR [bx+si],al
0x0011c8b3 in ?? ()
real-mode-gdb$ set arch i386
The target architecture is assumed to be i386
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: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. Пишите, что у вас.

Ответить