Отдам этот сайт в добрые руки,желающие забрать его,пишите в личку,мой ник byferman
Коммуник • Просмотр темы - Портирование XIP
Untitled
Acer ASUS Gigabyte Glofiish HP HTC i-Mate LG Motorola O2 Qtek Rover Samsung Sony T-Mobile Toshiba
Искать в этом форуме:
Текущее время: 23 сен 2019, 00:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Портирование XIP
СообщениеДобавлено: 30 янв 2010, 03:56 
Аватара пользователя
Репутация
Добавить очки репутации« 14 » Уменьшить очки репутации

Администратор
Не в сети


Зарегистрирован: 19 дек 2009, 10:57
Сообщений: 1387
Cпасибо сказано: 2
Спасибо получено:
32 раз в 31 сообщениях
Мой кпк: ищу подходящий
Заслуги:
За хорошую репутацию За очень хорошую репутацию За 10 Сообщений За 50 Сообщений За 100 Сообщений За 500 Сообщений За 1000 Сообщений
ОБНОВЛЕНИЕ ЯДРА ОС.
Предисловие.
XIP (eXecute In Place – запуск с места, минуя оперативную память) - ядро ОС.

Содержимое XIP состоит из файлов и модулей и условно разделено на 2 части: аппаратозависимая часть (OEM, в которой находятся драйвера к железу КПК), и часть от Microsoft.

Для обновления XIP нам необходимо будет заменить MS часть, чтобы при этом не происходило наложение (пересечение) модулей друг на друга, иначе ОС с нашим новым XIP не загрузится.

В прошивке, как правило содержится 3 раздела:
  • Update Loader - загрузчик обновлений.

    Нужен при пакетном обновлении прошивки. При штатной работе ОС не используется.
  • XIP - собственно само ядро ОС, его мы и будем обновлять. [img]images/smilies/smile.gif[/img]
  • IMGFS - образ ОС.
Структура XIP.
Адресное пространство XIP состоит из 4-х слотов (в качестве примера указаны фрагменты карты XIP из прошивки для Dell Axim X51v):

слот00

В этом слоте располагаются секции модулей, открытые на чтение/запись(секции r/w).

Файл:
Код:
01fa01fe - 01fa01fe L00000000 Start: first DLL address
01fa01fe - 01fe0000 L0003fe02 NUL
01fe0000 - 01fe1000 L00001000 initialized data of region_1 busenum.dll
01fe1000 - 01fe2000 L00001000 initialized data of region_1 regenum.dll
01fe2000 - 01fe3000 L00001000 initialized data of region_1 pm.dll

/========================== часть пропущена ==========================/

01fef000 - 01ff0000 L00001000 initialized data of region_1 aximFsdspy.dll
01ff0000 - 01ff1000 L00001000 initialized data of region_2 cecompr.dll
01ff1000 - 01ff2000 L00001000 initialized data of region_1 ceddk.dll
01ff2000 - 02000000 L0000e000 initialized data of region_1 TrueFFS.dll
02000000 - 02000000 L00000000 End: last DLL address


слот01
В этом слоте раполагаются виртуальные образы модулей.

Файл:
Код:
02000000 - 03e1e000 L01e1e000 NUL
03e1e000 - 03e24000 L00006000 Virtual base address of busenum.dll
03e24000 - 03e28000 L00004000 Virtual base address of regenum.dll
03e28000 - 03e37000 L0000f000 Virtual base address of pm.dll

/========================== часть пропущена ==========================/

03fb0000 - 03fb6000 L00006000 Virtual base address of aximFsdspy.dll
03fb6000 - 03fbd000 L00007000 Virtual base address of cecompr.dll
03fbd000 - 03fc3000 L00006000 Virtual base address of ceddk.dll
03fc3000 - 04000000 L0003d000 Virtual base address of TrueFFS.dll
04000000 - 8c200000 L88200000 NUL

копия RAM
В этом слоте находятся физические данные: остальные секции модулей и файлы.

Файл:
Код:
8c200000 - 8c200000 L00000000 Start: first physical address
8c200000 - 8c201000 L00001000 RomLDR.PARTHDR
8c201000 - 8c262368 L00061368 o32 region_0 rva=00001000 vsize=00061368 real=8c201000
psize=00061368 f=60000020 for nk.exe
8c262368 - 8c263000 L00000c98 NUL
8c263000 - 8c2656f0 L000026f0 o32 region_3 rva=00063000 vsize=000026f0 real=8c263000
psize=000026f0 f=40000040 for nk.exe
8c2656f0 - 8c267000 L00001910 NUL
8c267000 - 8c26744e L0000044e o32 region_0 rva=00001000 vsize=0000044e real=8c267000
psize=00000450 f=60000020 for giisr.dll
8c26744e - 8c268000 L00000bb2 NUL
8c268000 - 8c268040 L00000040 o32 region_2 rva=00002000 vsize=00000040 real=8c268000
psize=00000040 f=40000040 for giisr.dll
8c268040 - 8c269000 L00000fc0 NUL
8c269000 - 8c294f73 L0002bf73 o32 region_0 rva=00001000 vsize=0002bf73 real=03fc4000
psize=0002bf74 f=68000020 for TrueFFS.dll

/========================== часть пропущена ==========================/

8c47aa08 - 8c4b6068 L0003b660 filedata DKLogo.dat
8c4b6068 - 8c4c0068 L0000a000 filedata boot.hv
8c4c0068 - 8c4c62d0 L00006268 filedata boot.rgu
8c4c62d0 - 8c4c9c75 L000039a5 filedata sysroots.p7b
8c4c9c78 - 8c4cac56 L00000fde filedata 723fb954-d931-4348-b672-82a188e587b5.dsm
8c4cac58 - 8c4cac58 L00000000 End: highest physical address

cлот RAM
В этом слоте располагаются модули, выполняемые с места. Оставшаяся часть слота отводится под доступную пользователю оперативную память.

Файл:

Код:
8c4e9000 - 8c4e9000 L00000000 Start: start of RAM
8c4e9000 - 8c4ea000 L00001000 initialized data of region_1 giisr.dll
8c4ea000 - 8c4f0000 L00006000 NUL
8c4f0000 - 8c4f6000 L00006000 uninitialized data of region_1 nk.exe
8c4f6000 - 8c539000 L00043000 initialized data of region_2 nk.exe
8c539000 - 8c539000 L00000000 ------ start of RAM free space
8c539000 - 8ff00000 L039c7000 NUL
8ff00000 - 8ff00000 L00000000 End: end of RAM

В слотах 00 и 01, над секциями модулей из XIP, располагаются секции модулей из IMGFS.


Обозначения на карте XIP.
Модули и файлы.

Файл:

Код:
адрес начала - адрес конца длина тип имя модуля

Например:
модуль в слоте 00

Файл:
Код:
01fe0000 - 01fe1000 L00001000 initialized data of region_1 busenum.dl

l


модуль в слоте 01

Файл:
Код:
03e1e000 - 03e24000 L00006000 Virtual base address of busenum.dll

файл

Файл:
Код:
8c47aa08 - 8c4b6068 L0003b660 filedata DKLogo.dat

Конфликты.
Если адрес начала секции одного модуля попадает в адресное пространство секции другого, то имеет место быть
конфликт. Тоже самое, впринципе, справедливо и для файлов.

Файл:
Код:
адрес начала конфликта - адрес конца конфликта длина конфликта обозначение конфликта

Например:

Файл:

Код:
8c520000 - 8c521000 L00001000 initialized data of region_1 giisr.dll
8c520000 - 8c521000 L00001000 !!!!!!!!!!!!!!!!!!
8c520000 - 8c526000 L00006000 uninitialized data of region_1 nk.exe

Пустые участки.

Файл:
Код:
адрес начала - адрес конца длина обозначение

Например:

Файл:
Код:
01fa01fe - 01fe0000 L0003fe02 NUL

Полезная информация.
Обновление с WM5 на более новые версии.
ПоказатьСкрытьЕсли при обновлении прошивки оригинальный XIP взят из WM5, то в секции S000 модуля nk.exe необходимо найти последовательность байт 0200001A0330D5E5010053E30A00008A

и заменить 1 на 2:
0200001A0330D5E5020053E30A00008A

SRPX-компрессия
ПоказатьСкрытьВстречаются xip со сжатием SRPX(сжатые XIP обычно встречаются у Asus, Eten, Samsung и др.).
Признак применения компрессии - наличие байтов SRPX в начале файла(проверить можно любым шестнадцатеричным редактором) и относительно малый размер XIP.
SRPX компрессия дает выигрыш в размере xip, несжатый XIP занимает порядка 3Мб в прошивке, в то время как сжатый - около 1.5Мб. Однако при этом уходит немного больше времени и оперативной памяти на распаковку xip при загрузке ОС.
При портировании XIP, перед какими-либо действиями, необходимо распаковать xip.bin, потому как утилиты наподобие XIPPort и DumpXIP немогут сдампить/собрать сжатый XIP.

После портирования новый XIP также будет необходимо сжать перед записью его в OS.nb.payload

Распаковка/запаковка производится при помощи SRPX Tools(в аттаче).
Распаковка:
1)переименовываем файл в xip.bin и кладем в папку SRPX
2)запускаем 1. Unpack.bat.

Запаковка:
1)переименовываем файл в xip.bin и кладем в папку SRPX
2)запускаем 2. Pack.bat.



Методики портирования XIP.
Портирование с помощью XIPPort, M'Reloc и M'Reloc_Nk (портирование вручную).

1. Оригинальный и донорский XIP поочередно разбираются при помощи XIPPort;

2. В оригинальный XIP подсаживается MS часть из донорского XIP;

3. Если возникают пересечения модулей, они устраняются перемещением конфликтующих модулей на другие адреса. Для перемещения модулей в слотах 00 и 01 используется утилита M'Reloc, для модулей из RAM - M'Reloc_NK; для ликвидации конфликтов в слоте с физическими данными выполняется перераспределение данных в этом слоте с помощью XIPPort (кнопка realloc P). Если по каким-либо причинам места в этом слоте нехватает, программа сообщает о нехватке места.

4. Строятся и просматриваются карты на предмет отсутствия конфликтов.


5. Выполняется сборка нового XIP и последующая запись его в прошивку-шаблон, на основе которой будут собиратся новые прошивки.

На некоторых устройствах от Asus, Dell, Eten, GSmart, Rover, Toshiba, и других, в RAM встречается особенный модуль giisr.dll, заслуживающий отдельного внимания.

Файл:
Код:
8c4e9000 - 8c4e9000 L00000000 Start: start of RAM
8c4e9000 - 8c4ea000 L00001000 initialized data of region_1 giisr.dll
8c4ea000 - 8c4f0000 L00006000 NUL
8c4f0000 - 8c4f6000 L00006000 uninitialized data of region_1 nk.exe
8c4f6000 - 8c539000 L00043000 initialized data of region_2 nk.exe
8c539000 - 8c539000 L00000000 ------ start of RAM free space
8c539000 - 8ff00000 L039c7000 NUL
8ff00000 - 8ff00000 L00000000 End: end of RAM


Данный модуль перемещать крайне не рекомендуется, так как при его переносе на другое место, он перестает работать(на Dell, например, это чревато невозможностью работы с CompactFlash картами и общей нестабильностью системы) что ведет к возникновению различных багов.

На некоторых моделях Samsung данный модуль также встречается, но там его секции расположены в слотах 00 и 01, и вполне успешно поддаются перемещению.

При обновлении ядра, содержащего giisr.dll в слоте RAM, при нехватке места в слоте с физическими данными придется сбрасывать часть малополезного "балласта": некоторые файлы/модули удалять, некоторые переносить в IMGFS(см. ниже), так как в случае нехватки места переместить границу слота с физическими данными и слота RAM нам не позволит размещенный там giisr.dll.


Портирование XIP с помощью BuildXIP
1.Подготовка.
Распаковываем архив XIPKitchen из аттача.


Определяем аппарато-зависимые(OEM) файлы/модули:
1) Кладем в папку рядом с XIPPort оригинальный xip.bin.
2) Делаем дамп XIP, нажав кнопку "dump xip.bin"
Появится папка OUT с папками FILES и MODULES и с текстовыми файлами PARTHDR и ROMHDR.
3) Разбиваем дамп на пакеты, нажав кнопку "make pkgs"
В папках FILES и MODULES появятся пакеты. LangDB, MSXIPKernel, MSXIPKernelLTK, OEMXIPKernel и WinCENLS.
4) Удаляем все пакеты кроме OEMXIPKernel.
5) Разбираем пакеты обратно в "плоский" дамп, нажав кнопку "Undo".

6) Сохраняем эту папку/записываем список файлов и модулей. Она нам пригодится позже.

Определяем файлы/модули, принадлежащие к MS части:
1) повторяем пункты 1...6 над XIP-донором, но в этот раз оставляем MS-пакеты MSXIPKernel и WinCENLS.

В зависимости от языка ОС, в данном случае это IMGFS, с которым предстоит работать новому XIP, в boot.rgu в ключах правим dword-значения:

Файл:

Код:
[HKEY_LOCAL_MACHINE\MUI]
   "SysLang"=dword:419
[HKEY_CURRENT_USER\MUI]
   "CurLang"=dword:419

409 - для английской ОС
419 - для русской ОС

2.Портирование:
1) Помещаем в папку DumpXIP и переименовываем оригинальный и донорский XIP в xip.orig.bin и в xip.donor.bin соответственно.
2) Запускаем DumpXIP.bat
Появится папка XIP со сдампленным оригинальным XIP, заголовочный файл romhdr.bin и сдампленный донорский XIP в папке XIP.donor.
3) В папке XIP удаляем файлы/модули, кроме OEM.

4) В папке XIP.donor удаляем файлы/модули, кроме MS.
5) Смотрим пакет WinCENLS и переносим такие же файлы(файлы *dsm и WinCE.nls) из XIP.donor в папку WinCENLS в SYS, с которым будет работать наш XIP.
6) Перемещаем содержимое папки XIP.donor в папку XIP и перемещаем ее с файлом romhdr.bin в XIPKitchen\BuildXIP\ROM.
7) Удаляем в XIPKitchen\BuildXIP\ROM\XIP модуль mencfilt.dll(или encfilt.dll, если портируется WM6), он отвечает за шифрование карт памяти, модули osaxst0.dll, osaxst1.dll и hd.dll - это отладочные модули, при штатной работе ОС не используются, но при этом занимают место.
8) В папку XIPKitchen\BuildXIP\Temp\Dump копируем модули .ROM и .VM из SYS.
9) Запускаем BuildXIP.bat
Появится новый xip.bin.
10) Записываем новый XIP в болванку OS.nb.payload и копируем из XIPKitchen\BuildXIP\Temp\Dump модули .ROM и .VM в SYS взамен старых.
11)Копируем *.dll модули и boot.rgu из XIPKitchen\BuildXIP\ROM\XIP в папку ROM в кухне.

Готово! Прошиваемся, и ловим баги, если таковые имеются [img]images/smilies/biggrin.gif[/img]

Капля дегтя в бочке меда...
Однако данная утилита не может правильно обработать giisr.dll и совершает ошибку: происходит ряд конфликтов в слоте с этим модулем:

Файл:
Код:
8c4cb000 - 8c4cb000 L00000000 Start: start of RAM
8c4cb000 - 8c50e000 L00043000 initialized data of region_2 nk.exe
8c50e000 - 8c520000 L00012000 NUL
8c520000 - 8c521000 L00001000 initialized data of region_1 giisr.dll
8c520000 - 8c521000 L00001000 !!!!!!!!!!!!!!!!!!
8c520000 - 8c526000 L00006000 uninitialized data of region_1 nk.exe
8c521000 - 8c526000 L00005000 !!!!!!!!!!!!!!!!!!
8c521000 - 8c521000 L00000000 ------ start of RAM free space
8c521000 - 8ff00000 L039df000 NUL
8ff00000 - 8ff00000 L00000000 End: end of RAM


З.ы. Утилита впринципе изначально предназначена для работы в связке с BuildOS.
Сначала отрабатывает BuildOS, собирая OEM и SYS в плоский дамп в Temp\Dump -> BuildXIP собирает новый XIP в папке ROM\XIP и правит границы раздела XIP-IMGFS в модулях .ROM и .VM в Temp\Dump -> новый XIP записывается в болванку os.nb.payload, в которую потом записывается новый IMGFS.


--- вы должны быть зарегистрированным пользователем, чтобы прочитать это содержимое ---


Портирование комбинированным способом.
Ниже описан комбинированный метод обновления ядра в 2 захода:
1. портирование XIP с помощью BuildXIP, с целью устранения конфликтов модулей в слотах 00 и 01;
2. замена заголовочных файлов и модулей из RAM в портированном XIP на оригинальные.

Недостаток данного метода портирования - мы заперты в границах слота с физическими данными, границы которого нам не даст раздвинуть модуль giisr.dll, расположенный в RAM.

Подготовка OEM части.
Прежде всего нам необходимо извлечь оригинальный XIP из файла-шаблона, на основе которого производится сборка новых прошивок.

1. Открываем OS.nb0 в WinHEX и включаем режим отображения файла как диска:
Specialist->Interpret Image File As Disk. Видим 3 раздела, двойным щелчком открываем 2-й раздел(откроется в новом окне) и сохраняем в папку XIPKitchen под именем xip.bin.
2. Запускаем XIPPort и делаем дамп, нажав кнопку dump xip.bin, строим карты - write maps и сортируем плоский дамп на пакеты - make pkgs.
В итоге дожна получиться следующая структура папок:
OUT
OUT\FILES
OUT\FILES\MSXIPKernel
OUT\FILES\OEMXIPKernel

OUT\MODULES
OUT\MODULES\MSXIPKernel
OUT\MODULES\OEMXIPKernel

Пакеты OEMXIPKernel содержат аппаратнозависиую часть; MSXIPKernel – Microsoft часть.

3. Удаляем пакеты MSXIPKernel
4. Разбираем пакеты в плоский дамп, нажав кнопку undo.
5. Открываем boot.rgu и ищем значения:

[HKEY_CURRENT_USER\MUI]
"CurLang"=dword:419
[HKEY_LOCAL_MACHINE\MUI]
"SysLang"=dword:419

Эти значения, коды локализации, зависят от языковых ресурсов в разделе IMGFS.
Меняем оба значения в зависимости от локализации нашей прошивки:
409 - английский язык;

419 - русский язык.

6. Переименовываем папку OUT в OUT.OEM
Куда-нибудь ее сохраняем, чтобы в следующий раз не повторять вышеуказанные действия.
7. Переносим xip.bin в папку DumpXIP и запускаем DumpXIP.bat.
8. В полученной папке XIP удаляем все файлы и модули, кроме тех, что относятся к OEM.

Подготовка Microsoft части.

1. Помещаем донорский файл xip.bin в папку XIPKitchen
2. Делаем дамп, нажав кнопку dump xip.bin, строим карты - write maps и сортируем «плоский» дамп на пакеты - make pkgs.
3. Пакет WinCENLS_WWE из OUT\FILES переносим в какую-нибудь папку и удаляем текстовые файлы в нем, данный пакет переезжает в IMGFS.
4. Файл mxip_lang.vol из MSXIPKernel переносим в кухню с заменой в пакет OEM\OEM_Lang_04xx.
5. Удаляем все пакеты кроме MSXIPKernel
6. В OUT\FILES\MSXIPKernel удаляем файлы 723fb954-d931-4348-b672-82a188e587b5.rgu, boot_ms.rgu и текстовые файлы к ним.

В OUT\MODULES\MSXIPKernel удаляем модули cachefilt.dll, hd.dll, initvmmap.exe, mencfilt.dll, osaxst0.dll и текстовые файлы к ним:
•hd.dll и osaxst0.dll - т.н. отладочные, при штатной работе ОС они не используются.
•cachefilt.dll предназначен для работы с кэшем ФС. В принципе его можно перенести в IMGFS.
•initvmmap.exe служит для управления загрузкой модулей в память.
•mencfilt.dll(в WM6.0 – encfilt.dll) - отвечает за шифрование карт памяти.

7. Разбираем пакеты в плоский дамп.
8. Переименовываем папку OUT в OUT.Donor


Обновление.
1. Копируем папку XIP и файл romhdr.bin в папку ROM.
2. Копируем модули и файлы, без текстовых файлов к ним, из OUT.Donor в ROM\XIP.
3. Запускаем BuildXIP.bat
4. Полученный файл xip.bin переносим в XIPKitchen и дампим его с помощью XIPPort.
5. Удаляем в OUT\MODULES модули nk.exe, nk.exe.txt, giisr.dll и giisr.dll.txt, в OUT удаляем заголовочные файлы PARTHDR.txt и ROMHDR.txt.
6. Взамен удаленных модулей/файлов копируем их из OUT.OEM.
7. Выполняем realloc P, нажав на соответствующую кнопку.
8. Строим карты.
9. Открываем карту map.txt и смотрим ее на предмет отсутствия конфликтов.
10. Собираем новый XIP, нажав кнопку build xip_out.bin.
11. Помещаем OS.nb0 из основной кухни рядом с xip_out.bin
12. В XIPPort в поле адреса, по которому будет записан новый XIP, взамен 00310000 вводим 00010000. В поле имени прошивки, куда будет записан новый XIP, взамен nk.nb вводим имя OS.nb0 и выполняем запись нового XIP, нажав на кнопку write xip_out.bin to:.
13. Помещаем OS.nb0 обратно в кухню, в папку ROM.

Автор:Dynamite

--- вы должны быть зарегистрированным пользователем, чтобы прочитать это содержимое ---

_________________
Извините, что я говорю, когда вы перебиваете.


Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Искать в этом форуме:
Перейти:  
Рейтинг@Mail.ru Rambler's Top100
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB