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

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 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. Пишите, что у вас.

Ответить