пытаемся починить загрузку ISO
Re: пытаемся починить загрузку ISO
Ничего не трассируется, всё заканчивается на "OBERON Loading". возможные дальнейшие действия:
* ✓ проверить, работает ли запись CDROM в новой версии - вдруг дело в этом. Для этого записать образ от версии, которая загружалась, но новой записывалкой, и сравнить iso-файлы - да, работает. Образ из старых файлов, записанный в свежей ЯОС, загружается.
* почитать маны и понять смысл всех параметров
* попробовать отладить процесс загрузки после слов OBERON Loading в работающей CD-ROM версии, новой HDD версии и/или неработающей CDROM версии.
* ✓ проверить, работает ли запись CDROM в новой версии - вдруг дело в этом. Для этого записать образ от версии, которая загружалась, но новой записывалкой, и сравнить iso-файлы - да, работает. Образ из старых файлов, записанный в свежей ЯОС, загружается.
* почитать маны и понять смысл всех параметров
* попробовать отладить процесс загрузки после слов OBERON Loading в работающей CD-ROM версии, новой HDD версии и/или неработающей CDROM версии.
Re: пытаемся починить загрузку ISO
Вот вспомнил, Сергей Дурманов объяснял:
ну вот как поменяли формат объектных файлов и сценарий линковки. Там проблема вот в чем - раньше при линковке в образ записывалась программа, которая перемещала образ после загрузки, а сейчас нет, и эль-торито, загрузив образ передавал управление этой программе. сейчас это поломано. В принципе, эль-торито может загружать образы hdd(сейчас там эмуляция дискеты). Но там чего-то не хватат и образ hdd тоже не грузится, хотя загрузчик mbr запускается. дальше я не экспериментировал по причине отсутствия времени
...ну и MakeIso там простейшая реализация
...а, вроде вспомнил, при использовании эмуляции hdd, нужно в образ записывать соответствующую информацию, типа геометрии диска и т.д.
...в iso образ
Re: пытаемся починить загрузку ISO
В общем, ни черта не понимаю, попробую отладить. Прошлый опыт отладки - тут http://вече.программирование-по-русски. ... t=10#p3308
при срабатывании уж появилось "Booting from DVD/CD"
jmp 7c29 - похоже на "jmp short entry0" в OBLUnreal.Asm
ljmp 0xc88c, x7c0002e (боже, какая же абракадабра!)
попали на адрес 0x2e,
Дальше что-то, чему аналогии особо я не нашёл, дальше шагнул несколько раз по 100 раз и увидел на экране "OB". Находимся по адресу 0x7cd0.
Буковки выводит процедура Mark.
Код: Выделить всё
break *0x07c00
jmp 7c29 - похоже на "jmp short entry0" в OBLUnreal.Asm
ljmp 0xc88c, x7c0002e (боже, какая же абракадабра!)
попали на адрес 0x2e,
Дальше что-то, чему аналогии особо я не нашёл, дальше шагнул несколько раз по 100 раз и увидел на экране "OB". Находимся по адресу 0x7cd0.
Буковки выводит процедура Mark.
Re: пытаемся починить загрузку ISO
Так, я сделал точку прерывания на 0x7c00 , и потом два раза по si 100. На экране появилась надпись "О"
Но при этом раскрытый ассемблерный код как-то не так выглядит, как надо, почти никак он выглядит.
Похоже на это: https://stackoverflow.com/questions/329 ... it-gets-tr
и это
https://gitlab.com/qemu-project/qemu/-/issues/141
Не лучшая точка останова, но надо спать по ночам!
Но при этом раскрытый ассемблерный код как-то не так выглядит, как надо, почти никак он выглядит.
Похоже на это: https://stackoverflow.com/questions/329 ... it-gets-tr
и это
https://gitlab.com/qemu-project/qemu/-/issues/141
Не лучшая точка останова, но надо спать по ночам!
Re: пытаемся починить загрузку ISO
Итак. команды для запуска:
После срабатывания точки останова примерно si 100 выводит на букву "О". gdb 7.12.0, qemu-system-i386 2.8.1 . Это важно, потому что потом сломали.
Код: Выделить всё
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'
Re: пытаемся починить загрузку ISO
При работе с волшебным скриптом для реального режима иногда возникают левые точки останова и при вызове команды с никакого продвижения вперёд не происходит. Или, возможно, как-то возникают и не удаляются должным образом временные точки останова. Если забуксовали на точке останова, то нужно её удалить, (info break, del N), шагнуть вперёд на шаг (si) и поставить снова на том же месте (break *0xFAAA)
break *0x7ddb - останавливается после печати (процедура mark) - это ревизия 6498, образ собран мной, хотя вряд ли этот загрузчик много менялся. Нужно учесть, что в реальном режиме точка останова ставится на значение IP, а реальный адрес - это CS:IP, поэтому возможны ложные срабатывания.
break *0x7ddb - останавливается после печати (процедура mark) - это ревизия 6498, образ собран мной, хотя вряд ли этот загрузчик много менялся. Нужно учесть, что в реальном режиме точка останова ставится на значение IP, а реальный адрес - это CS:IP, поэтому возможны ложные срабатывания.
Re: пытаемся починить загрузку ISO
Не, и так не работает. Точнее сказатЬ, выводит только первую букву "O", наверное, дело в перемещении кода. Пойду от первой буквы О по шагам. Теперь надо было перешагнуть через int12h - она возвращает размер памяти и не передаёт управление, т.е. это именно вызов. Значит, нужно встать на адрес 07с0:003c = 0x7c3c, поскольку неясно, как ставить брекпойнт на него, я поставил оба - b *0x03c и b *0x7c3c. Сработал первый из них. Убираю оба (del)
Re: пытаемся починить загрузку ISO
Теперь попал в какой-то код, где есть int 12. Похоже, что этот код сейчас будет перемещать что-то, а именно бутлоадер, судя по комментарию в OblUnreal.Asm:
В ней и попробую понять, куда всё переедет, чтобы поставить новый брекпойнт в функции mark.
И наличию команды rep movs BYTE PTRS es:[di], BYTE PTR ds:[si]; 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)
В ней и попробую понять, куда всё переедет, чтобы поставить новый брекпойнт в функции mark.
Re: пытаемся починить загрузку ISO
007c0:0050 : es:[di] = 9d00:0000 , ds:si = 07c0:0000 . Нос - перёд, корма - зад, значит, мы переезжаем на 9d00. Попробую дошагать, может недалеко до вызова уже перемещённого кода. Цикл перемещения останавливается на каждый байт, поэтому b *0x052 помогает.
Re: пытаемся починить загрузку ISO
дошагал до места, похожего на entry1 (странно, мы вроде там уже были)
Дальше опять попадаем в mark,
b *0x1da
Код: Выделить всё
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
Код: Выделить всё
CS:IP: 9D00:01D7 (0x9D1D7)
Re: пытаемся починить загрузку ISO
Складывается впечатление, что брекпойнт на значение IP нужно ставить тогда, когда CS соответствует тому же, на который хотим поставить. Т.е. если у нас сейчас CS = АААА, а нужно поставить на CS = BBBB, IP = CCCC, то не сработает брекпойнт на CCCC. Нужно дождаться ситуации, когда CS = BBBB и уже тогда ставить.
Сценарий от начала:
Считаем, что мы в начале entry1, поскольку код выглядит так:
Сценарий от начала:
Код: Выделить всё
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
Код: Выделить всё
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
Re: пытаемся починить загрузку ISO
Но при этом часть кода вырезана и сразу после mov sp идёт кусок entry2:
Видимо, в этом и состоит магия перемещения.
Видимо, в этом и состоит магия перемещения.
Re: пытаемся починить загрузку ISO
Идём дальше
Теперь можно попробовать поставить точку останова после вывода буквы и она по идее должна сработать для остальных букв, если не будет новых перемещений. Рисковать не будем, пробуем обе.
Тут либо колесо сансары, либо пролетает до полной загрузки. Ну достало!
Код: Выделить всё
si 6 # дошагали до вызова mark
si # заходим в mark
Код: Выделить всё
b *0x01db
b *0x9d1db
# сработала на 0x01db, вывелось "B"
del
si
Re: пытаемся починить загрузку ISO
Переорганизовываем: .gdbinit, в него пишем
Он далее при запуске ругается и пишет, где нужно разрешить запуск этого скрипта - делаем это.
Теперь создаём commands.gdb, на данный момент - такой:
и запускаем его:
Код: Выделить всё
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
Re: пытаемся починить загрузку ISO
Файл постепенно растёт, дошагал до readsectors. Похоже надо ставить две точки останова и тогда срабатывает одна из них. Или он неверно пишет, какяа срабатывает. В общем, сыровато как-то это работает. Кроме тго, после срабатывания надо удалить все точки останова, сделать si и посавить заново, если надо вернуться в то же место.
Re: пытаемся починить загрузку ISO
Попробовал сделать stepo, стоя перед вызовом readsectors - не сработало.
Re: пытаемся починить загрузку ISO
Текущее состояние:
Код: Выделить всё
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
# остановились перед переходом по контрольной сумму.
Re: пытаемся починить загрузку ISO
для дизассемблирования нужно подать команды
После сопоставления c OBL.asm: получаем
Т.е. нас интересует адрес b *0x9d4e2
Код: Выделить всё
set logging file имя-файла
set logging on
x/1024i адрес-как-он-виден
set logging off
Код: Выделить всё
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
Re: пытаемся починить загрузку ISO
В общем, дошагал до перехода в ядро, но оно выглядит уныло. То ли там линкер что-то дописал, то ли дело в переключении архитектуры (я пользовался
https://stackoverflow.com/questions/142 ... isassamble этим советом),
но я не смог дошагать до (невнятной) процедуры (I386.Machine.Mod).PushBootValues, поэтому вставил в неё int 3. Посмотрим.
https://stackoverflow.com/questions/142 ... isassamble этим советом),
но я не смог дошагать до (невнятной) процедуры (I386.Machine.Mod).PushBootValues, поэтому вставил в неё int 3. Посмотрим.
Re: пытаемся починить загрузку ISO
Вставил - теперь машина перегружается. Не уверен, что это прям круто, но во всяком случае какая-то реакция на изменения. Отловить int 3 вроде нельзя
https://github.com/cirosantilli/linux-k ... /issues/37
Но вот есть прекрасный совет:
https://rwmj.wordpress.com/2016/04/21/t ... reakpoint/
Надо просто зациклить код, и тогда можно его остановить с помощью Ctrl-C. да, сработало:
В листинге показаны команды, с помощью которых нужно просматривать код для защищённого режима.
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.
Re: пытаемся починить загрузку ISO
Оказывается, по "прыжку в ядро" попадаем ровно в код релокации на адрес 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.
Re: пытаемся починить загрузку ISO
Ядро для CD уже в старой версии запускается с адреса 100000. Я нашёл код, который перемещает: он порождается линкером и генерируется побайтно процедурой Linker0.InitTable.
Re: пытаемся починить загрузку ISO
В общем, картина того, как загружается старая версия, более-менее ясна, в степени, достаточной для нашей задачи. Теперь надо понять, почему не загружается новая. Видимо, на это уйдёт ещё неделя, а вот насчёт починки - не берусь гадать. Во-первых, война уже начинается, чёрт его знает, что вообще завтра будет, может завтра уже и интернета никакого не будет. Во-вторых, самое страшное, что я могу себе представить - это то, что ядро стало слишком большим и куда-нибудь там не поместилось.
Чтобы выяснить, нужно прошагать загрузчик в новой версии так же, как в старой (к счастью, 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
Чтобы выяснить, нужно прошагать загрузчик в новой версии так же, как в старой (к счастью, 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
Re: пытаемся починить загрузку ISO
Выяснил, почему OBL.Bin используется для загрузки - потому что он прописан в виде константы по умолчанию в Partitions.Lib.
Соответственно, если ставим PartitionsLib.SetBootLoaderFile OBLUnreal.Bin ~
то вместо него идёт OBLUnreal.Bin
Соответственно, если ставим PartitionsLib.SetBootLoaderFile OBLUnreal.Bin ~
то вместо него идёт OBLUnreal.Bin
Re: пытаемся починить загрузку ISO
Данные по адресу 0x9d129 затираются - переполнение какого-то там буфера для конфигурационных строк.
Поставил watch на этот адрес и нашёл, что возврат должен произойти в адрес
SS:SP: 9D00:1FD6 (0x9EFD6) - надо доделать дизассемблирование.
Поставил watch на этот адрес и нашёл, что возврат должен произойти в адрес
SS:SP: 9D00:1FD6 (0x9EFD6) - надо доделать дизассемблирование.
Re: пытаемся починить загрузку ISO
После "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,
Re: пытаемся починить загрузку ISO
Запуски readsectors после OBERON loading (собственно загрузка ядра)
Думаю, что это уже неправильно. Но допустим. Во всяком случае, считывается ровно до конца 64кб сегмента
Следующий останов, т.е. делаем
получаем
затем
Код: Выделить всё
ax = 8 - номер стартового сектора
es:bx = 0100:0000 - адрес для начала загрузки (1000, уже вызывает сомнения)
cx = 78 - кво-секторов
Код: Выделить всё
>(+ #x1000 (* #x200 #x78))
65536
Код: Выделить всё
del
si
b *0x9d129
c
Код: Выделить всё
ax = 80
es:bx = 1000:0000
cx = 80
Re: пытаемся починить загрузку ISO
По совету с SO определяем функцию
И доходим до ситуации, когда нам предлагают запороть в т.ч. и текущий код.
теперь watch *0x9d129 и nextreadsectors - но watch не срабатывает, блин.
Код: Выделить всё
define nextreadsectors
>del
>si
>b *0x9d129
>c
>end
теперь watch *0x9d129 и nextreadsectors - но watch не срабатывает, блин.
Re: пытаемся починить загрузку ISO
Теперь сработал - надо было после чтения адреса 9000, вручную пройти последний этап, т.к. del внутри команды nextreadsectors сносил и аппаратную точку надзора. Таким образом, действительно при загрузке ядра сносится загрузчик. Теперь надо понять, что с этим сделать.
Re: пытаемся починить загрузку ISO
Итак, всё ясно - ядро тупо не поместилось.
Re: пытаемся починить загрузку ISO
* всегда читать только по 1 сектору
* b *0x8140 - jump to kernel
* b *0x8140 - jump to kernel
Re: пытаемся починить загрузку ISO
Выложил диск черновой сборки на https://disk.yandex.ru/d/JYTe90U0x5swaw
Re: пытаемся починить загрузку ISO
И ещё один:
https://disk.yandex.ru/d/52ehKmsTJBVjuA
Запустился в VirtualBox, QEMU, на hp nc8000, но не запустился на ASUS G771JW. Пишите, что у вас.
https://disk.yandex.ru/d/52ehKmsTJBVjuA
Запустился в VirtualBox, QEMU, на hp nc8000, но не запустился на ASUS G771JW. Пишите, что у вас.