| English, French, German |
|
|
| Главная · Программы · Пользователям · Разработчикам · Конкурсы · Партнерство · Информация · Форум |
|
Библиотека РАзных ВОпросов разработчикуПереключение банков памяти.J. Steingraber29 января 2001 перевод Олега Шаталова, sov-dusik@mail.ru В устройстве Pocket Viewer существует несколько способов переключения банков памяти. Эта статья описывает как распределяется RAM и Flash-память и как она переключается в адресном пространстве CPU (процессора). "Контакты" ("Contacts") и GET OSКогда я начал подумывать о создании патчей ("заплаток") для S-серии, я обнаружил проблему: интересующий меня модуль ("Contacts"("Контакты")) из моего устройства PV оказался более новым, чем в SDK. Мне потребовалась извлечь его из PV. Выяснилось, что программа извлечения и "Контакты" занимают в точности одно и то же место в памяти. Если запускалась моя программа, "Контакты" не обнаруживались в памяти, и наоборот, при запуске "Контактов" моя программа была недоступна.Как разрешить эту дилемму? Я написал программу, которая ожидала в оперативной памяти (RAM) факта нажатия "ESC", и затем могла передать текущую программу через последовательный интерфейс. Позднее я обнаружил подпрограмму в PVOS (прим.пер. Вообще-то это не подпрограмма ОС а одна из функций BIOS), которая загружает различные программы в адресное пространство процессора (CPU). Я изменил первоначальную программу, которая теперь не ждала "ESC", а вставляла (подключала, подгружала) непосредственно требуемый модуль и могла передать его в PV (прим.пер. возможно, это опечатка автора и речь идет о передачи программы в PC). GET OS родился! В конце концов, я научился вставлять модули из Flash-памяти в различные места в адресном пространстве. Моя программа больше не требовала запуска в оперативной памяти (прим.пер. имеется ввиду, что программа запускается один раз), так была разработана программа GET OS - 2. Во время работы над GET OS я узнал кое-что о распределении адресного пространства, распределении Flash-памяти и переключении банков памяти. Это мое субъективное представление (видение) данного вопроса. Адресные банки PVВ PV имеется 7 банков адресов. Размер каждого банка - 128kB.Банки находятся по следующим адресам:
Стандартное распределение выглядит следующим образом:
Распределение виртуального адресного пространства. Если отобразить свободное дисковое пространство (RAM и Flash) в 32-битное адресное пространство, оно будет доступно в PV следующим образом:
Отдельные модули (программы) PVOS располагаются по следующим адресам
Переключение банков при помощи BIOS PVOS содержит процедуру BANK BIO (INT 0xC8), которая управляет вводом и выводом (преобразованием) виртуальных адресов в адресное пространство процессора (CPU). Таким образом, BIOS за два вызова преобразует А31-А16 биты адреса и номер нужного банка сначала старшему байту, а затем младшему байту адресных битов. Пример 1 содержит ассемблерный листинг, в котором вызывается прерывание 0xC8 с правильными (нужными) значениями, в AX - адресные биты А31-А16, и в BL требуемый банк. Пример 1 (Assembler) ; switch banks ; ; A32-A16 in ax ; bank nr in bl ; mov bh,al ; save A23-A16 mov al,ah ; set A31-A24 first mov ah,bl ; for this bank or ah,80h ; mark as high byte int c8 mov al,bh ; set A24-A16 mov ah,bl ; for this bank int c8 В программу на C эта процедура может быть вставлена следующим образом: Пример 2 (C с Inline ассемблерной вставкой) /* * SwitchBank * * делает доступной RAM или FLASH-память в нужном банке * * addr A31-A16 адрес источника (должен быть четным) * используйте 0000 - 00FE для RAM (только 0000 будет работать) * используйте 0100 - 010E для Flash-а программ (1-й MB, PVOS) * используйте 0110 - 011E для Flash-а программ (2-й MB, Add-In) * используйте 0120 - 013E для Flash-а данных (4MB data) * * bank банк назначения * используйте 0 для адресного пространства 0000:0000 (forbidden) * используйте 1 для адресного пространства 2000:0000 * используйте 2 для адресного пространства 4000:0000 * используйте 3 для адресного пространства 6000:0000 * используйте 4 для адресного пространства 8000:0000 (forbidden) * используйте 5 для адресного пространства A000:0000 * используйте 6 для адресного пространства C000:0000 (forbidden) * * Примечание: * вы не можете переключать банки 0, 4 и 6, так как это приведет * к краху вашей PV; банк 0 содержит векторы прерываний, и все программы * ожидают найти здесь RAM; банк 4 содержит ваши Add-In (загружаемые * программы), следовательно переключение этого банка приведет к тому, * что ваши программы исчезнут; банк 6 содержит BIOS, ваш(а) PV не сможет * работать без него. * * Пример: * * SwitchBank(0x0000,3); * сделает 128kB RAM доступными по адресу 6000:0000 так, что RAM * будет доступна и по 0000:0000 и по 6000:0000 одновременно (что * возможно, но глупо, у вас все равно останется только 128kB RAM) * * SwitchBank(0x0104,5); * сделает Fonts доступным по адресу A000:0000 и Graphics * доступным по адресу B000:0000 * * SwitchBank(0x0120,1); * сделает первые 128kB flash данных доступными по адресу 2000:0000 * */ void _asm_switchbank(char *,int,int); #define SwitchBank(addr,bank) _asm_switchbank("\n MOV BH,AL\n MOV AL,AH\n MOV AH,BL\n OR AH,80h\n INT 0C8h\n MOV AL,BH\n MOV AH,BL\n INT 0C8h\n",addr,bank); Надеюсь, что эта маленькая подпрограмма будет Вам так или иначе полезна... продолжение следует ;-) Идея принадлежит Michael D. (OrganiZer), www.pocket-viewer.de |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Все права связанные с торговыми марками, упоминаемыми на страницах этого ресурса, принадлежат их владельцам. Полное или частичное воспроизведение любых материалов, содержащихся на этом сайте, допускается только с условием размещения ссылки на этот сайт. |
||
| Пишите нам: admin@pocket-viewer.ru | © Алексей Ананьев-Миляр, 2001 www.melar.ru |
Hosted by valueHOST: Лидер Вэб-Хостинга |
|
|