English, French, German
Pocket-Viewer.ru for users and developers
Google
 
Web pocket-viewer.ru
Главная · Программы · Пользователям · Разработчикам · Конкурсы · Партнерство · Информация · Форум   
  Разработчику
Программирование
Периферия
Р-Документация
Р-БРАВО
Клуб разработчиков
Пожелания

Реклама :: NAEM.ru - всероссийский портал найма

Библиотека РАзных ВОпросов разработчику

Переключение банков памяти.

J. Steingraber
29 января 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.
Банки находятся по следующим адресам:

Размещение банков в адресном пространстве CPU
Bank 00000:0000
Bank 12000:0000
Bank 24000:0000
Bank 36000:0000
Bank 48000:0000
Bank 5A000:0000
Bank 6C000:0000

Стандартное распределение выглядит следующим образом:

Стандартное использование банков адресов
Bank 0128kB RAM
Bank 1128kB RAM (физически отсутствует)
Bank 2Системные приложения и системная библиотека
Bank 3Шрифты и графика (картинки, иконки)
Bank 4Модули или Загружаемые программы(Add-on)
Bank 5Модули
Bank 6BIOS

Распределение виртуального адресного пространства.
Если отобразить свободное дисковое пространство (RAM и Flash) в 32-битное адресное пространство, оно будет доступно в PV следующим образом:

RAM и Flash в виртуальном 32-битном адресном пространстве
00000000 - 00001FFF128kB RAM
01000000 - 010FFFFF1MB Flash (PVOS)
01100000 - 011FFFFF1MB Flash (Add-In) (Загружаемые программы)
01200000 - 012FFFFF1MB Flash (data) (данные)
01300000 - 013FFFFF1MB Flash (data) (данные)

Отдельные модули (программы) PVOS располагаются по следующим адресам
Размещение приложений PVOS
01000000BIOS
01020000System Tools
01030000System Library
01040000Fonts
01050000Graphics
01060000Scheduler
01080000Calendar
01090000Contacts
010A0000Expense
010B0000Clock
010BC000Secret
010C0000Memo
010C9A00Quick Memo
010D0000Conversion
010D9000Menu
010E0000Data communication
010F5000Game

Переключение банков при помощи 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: Лидер Вэб-Хостинга



Rambler's Top100 Rambler's Top100 Информационная Деловая Сеть