Отмените кеширование, установив для этого бит CD в регистре CR0.
Для записи в буфер заполнения кеша:
Загрузите регистр TR5 значением поля Выбора Элемента, которое адресует одно из четырех двойных слов в буфере заполнения кеша. Значение поля Управление должно быть равно 00 (двоичному).
Загрузите регистр TR3 данными, подлежащими записи в буфер заполнения кеша. Запись в буфер запускается при загрузке данного регистра.
Повторите шаги 1 и 2 для каждого из трех остальных двойных слов в буфере заполнения кеша. Таблица 10-3. Кодировка битов Управления тестирования кеша
-----------------------------------------------------------------Биты управленияБит 1 Бит 0 Описание----------------------------------------------------------------- 00 Запись в буфер заполнения кеша или чтение из буфера чтения кеша 01 Выполнение записи в кеш 10 Выполнение чтения из кеша 11 Очистить кеш (пометить все элементы как недостоверные)-----------------------------------------------------------------
Для записи в кеш:
Загрузите буфер заполнения кеша, как было описано выше.
Загрузите регистр TR4 тегом (биты 11..31) и битом Достоверности (бит 10). Прочие биты регистра TR4 (биты 0..9) не влияют на запись в кеш.
Загрузите в регистр TR5 значения полей Управления, Выбора Элемента и Выбора Набора. Значение в поле Управления должно быть равно 01 (двоичное). Запись в кеш запускается при загрузке данного регистра.
Для чтения из кеша:
Загрузите в регистр TR5 значения полей Управления, Выбора Элемента и Выбора Набора. Значение поля Управления должно быть равно 10 (двоичное). Чтение из кеша запускается при загрузке данного регистра. Чтение из кеша загружает в регистр TR4 тег для считанного элемента, а также биты LRU и Достоверности для всего считанного набора. Считывание кеша загружает буфер чтения кеша 128 битами данных. Буфер может быть считан при помощи следующей процедуры:
Для чтения из буфера чтения кеша:
· Загрузите регистр TR5 значениями полей Управления и Выбора Элемента. Значение Выбора элемента адресует одно из четырех двойных слов в буфере чтения кеша. Значение в поле Управления должно быть равно 00 (двоичное).
· Прочитайте двойное слово из буфера чтения кеша, выгрузив для этого регистр TR3. Чтение из буфера запускается при выгрузке этого регистра.
· Повторите шаги 1 и 2 для каждого из трех оставшихся двойных слов в буфере чтения кеша.
Для очистки кеша:
Загрузите в регистр TR5 значение поля Управления. Это значение должно быть равно 11 (двоичное). Ни одно из значений остальных полей в таком случае значения не имеет. Очистка буфера запускается при загрузке данного регистра. Все биты LRU и Достоверности очищаются.
Пример инициализации
Следующие шаблоны программ обеспечиваются Intel для вашего удобства при разработке программного обеспечения для процессора i486:
; simpinit.asm; Пример кода инициализации для простой плоской (линейной) модели;; ***************************************************************;; Версия 2.0; Авторские права Intel Corp., 1988; Данный шаблон должен помочь вам при разработке прикладных/; системных программных средств с использованием микропроцессоров; семейства Intel i486 (TM) или Intel386(TM). Intel дает вам; разрешение на любые модификации и использование данных; шаблонов по необходимости.;;;***************************************************************;; Это пример кода инициализации, который переводит процессоры; i486, 386 DX, 386 SX или 376 в режим плоской модели адресации.; Вся память рассматривается как простая линейная область RAM.; Подпрограмм прерывания нет. Построитель создает алиас GDT и; алиас IDT и помещает их по умолчанию в GDT[1] и GDT[2].; После входа в защищенный режим данный код выполняет переход к; подпрограмме начальных действий для прикладной программы на Си.; Вы можете изменить адрес перехода (команды JMP) на ваш; собственный код или сделать в вашем коде метку C_STARTUP. NAME simpstart ; имя объектного модуляEXTERN c_startup:near ; это метка перехода после init_code pe_flag equ 1 ; для установки бита PEdata_selc equ 20H ; смещение _phantom_data_ в GDT (GDT[4])CODEMACRO opprefx ; макрос для изменения размера операнда db 66H ; по умолчаниюEMDM init_code SEGMENT ER PUBLIC; GDT_DESC это общее символическое имя, на которое имеется ссылка; в файле, создаваемом построителем. Определение LOCATION в разделе; TABLE файла построителя указывает на данную метку; построитель; хранит и базу, и границу для указанной таблицы в этой позиции; оперативной памяти. PUBLIC gdt_descgdt_desc dp ?; START это метка, указывающая на истинное начало нашего; исполняемого кода. Управление самозагрузкой BOOTSTRAP заставляет; построитель поместить в вектор сброса компонента короткий переход; к названной метке (в данном случае, START).PUBLIC start; Поскольку этот код инициализиует процессоры i486, 386 DX, 386 SX; или 376 в защищенный режим, то первые команды в START проверяют; тип компонента. Процессоры i486, либо 386 DX или 386 SX при; сбросе в реальном режиме или режиме совместимости: бит PE очищен,; а бит D для CS не установлен. Команды выполняются в их; 16-битовой форме. Процессор 376 при сбросе имеет установленный; бит PE и бит D, поэтому команды выполняются в их 32-битовой; форме. nop ; Команды NOP для инициализации процессо- nop ; ров i486 или 386 DS или SXstart: cld ; Очистить флаг направления smsw bx ; Проверить тип процессора при сбросе test bl,1 ; для скорости использовать SMSW, а не inz pestart ; MOV ; Загрузка GDTR в REALSTART или PESTART зависит от того, возвращает; ли аппаратное обеспечение пользователя READY при попытке записи; в ПЗУrealstart: ; Это процессор i486 или 386 DX или opprefx ; 386 SX в 16-битовом реальном режиме, mov eax,offset gdt_desc ; Для получения 32-битового адреса ; указателя GDT используйте префикс ; операнда opprefx ; Для получения адреса относительно and eax,0ffffh ; области сброса используйте префикс ; операнда lgdtw cs:[eax] ; Загрузка в GDTR 24 битов базы mov ax,bx ; Копирование слова состояния машины or al,pe_flag ; Установка бита PE lmsw ax ; Загрузка слова состояния машины при ; установленном бите PE jmp next ; Очистка очереди выборки команд pestart: ; Это процессор 376 в 32-битовом защищен- ; ном режимеmode mov eax,offset gdt_desc ; Получение 32-битового адреса ; указателя GDT and eax,0ffffh ; Получение адреса относительно области ; сброса lgdt cs:[eax] ; Загрузка 32 битов базы в GDTRnext: xor eax,eax ; Инициализация селекторов данных mov al,data_selc ; GDT[4] это _phantom_data_ mov ds,ax mov ss,ax mov es,ax mov fs,ax mov gs,ax test bl,1 jnz pejump opprefx ; Используйте префикс операнда дляpejump: ; перехода к процессору i486, либо ; 386 DX или 386 SX jmp far ptr c_startup ; Первый дальний переход переводит A31-20 ; в низкое состояниеinit_code ENDSEND ; cstart.asm; Модуль ASM386/486 для инициализации стека и вызова прикладной; программы на Си;; ***************************************************************;; Версия 2.0; Авторские права Intel Corp., 1988; Данный шаблон должен помочь вам при разработке прикладных/; системных программных средств с использованием микропроцессоров; семейства Intel i486 (TM) или Intel386(TM). Intel дает вам; разрешение на любые модификации и использование данных; шаблонов по необходимости.;; ***************************************************************;;NAME cstart ; имя объектного модуляEXTRN main:near ; метка вызываемой прикладной Си-программыPUBLIC c_startup ; общее символическое имя, используемое в ; коде инициализации процессора stack STACKSEG 1024 data SEGMENT RW PUBLICdata ENDScode32 SEGMENT ER PUBLIC c_startup: mov esp,stackstart stack ; Инициализация указателя стека call main ; Вызов прикладной Си-программы hlt ; останов процессора code32 ENDS /* simple.cКод прикладной программы C386/486(TM) для примера простой плоскоймодели *************************************************************** Версия 2.0Авторские права Intel Corp., 1988Данный шаблон должен помочь вам при разработке прикладных/системных программных средств с использованием микропроцессоровсемейства Intel i486 (TM) или Intel386(TM). Intel дает вамразрешение на любые модификации и использование данных шаблонов понеобходимости. *************************************************************** */char message[]="Работает"; main (){int array_count[10];array_count[1] = 1;array_count[2] = 2;array_count[3] = 3;array_count[4] = 4;array_count[5] = 5;array_count[6] = 6;array_count[7] = 7;array_count[8] = 8;}-- simple.bld-- Файл построителя для ввода в BLD386/486 для создания примера-- простой плоской модели---- **************************************************************---- Версия 2.0-- Авторские права Intel Corp., 1988-- Данный шаблон должен помочь вам при разработке прикладных/-- системных программных средств с использованием микропроцессоров-- семейства Intel i486 (TM) или Intel386(TM). Intel дает вам-- разрешение на любые модификации и использование данных шаблонов по-- необходимости.---- **************************************************************--simple; -- идентификатор компонуемой задачиSEGMENT *segments (DPL = 0), -- Дать всем сегментам пользователя -- DPL равный 0 _phantom_code_ (DPL = 0), -- Эти два сегмента создаются -- построителем при использовании -- управляющего признака FLAT. -- Их DPL по умолчанию равен 0. -- Здесь они приводятся только -- для справки init_code -- Помещение кода инициализации в -- область сброса (BASE = 0ffff0900H);TABLE -- Создание GDT GDT -- GDT_DESC это общее символическое -- имя в модуле инициализации -- "simpstart" (LOCATION = gdt_desc, -- В буфер, начинающийся в GDT_DESC. -- BLD386/486 помещает значения базы -- и границы GDT. Буфер должен иметь -- длину 6 байтов. База и граница -- помещаются в этот буфер в виде -- двух байтов границы плюс четыре -- байта базы в формате, требуемом -- для использования в команде GDT. BASE = 0ffff0100H ); -- конец GDTTASK -- Задача инициализации эмулятора main_task -- *ICD(TM)-486 или ICE(TM)-386 или -- ICE(TM)-376 (BASE = 0ffff0200H, Data = data, -- Указывает на сегмент, -- обозначающий исх. значение DS CODE = main, -- main это точка входа, которая -- должна иметь идентификатор public STACKS = (stacks), -- Идентификатор сегмента указывает -- на сегмент стека. Устанавливает -- исходное значение SS:ESP. NO INTENABLED -- Отмена прерываний);TABLE ldt1 (NOT CREATED); -- Построитель не помещает LDT в -- объектный модуль, но ее -- содержимое выводится в листингEND ---- Примечание: ICD-486 это встроенный отладчик центрального-- процессора i486. Этот продукт запланирован на четвертый квартал-- 1989 года.-- echo offecho simple.batecho Пакетный файл DOS для генерации самозагружающейся простойecho плоской моделиecho *************************************************************echo * *echo * Версия 2.0 *echo * Авторские права Intel Corp., 1988 *echo * Данный шаблон должен помочь вам при разработке *echo * прикладных/системных программных средств с использованием *echo * микропроцессоров семейства Intel i486(TM) или Intel386(TM)*echo * Intel дает вам разрешение на любые модификации и *echo * использование данных шаблонов по необходимости. *echo * *echo *************************************************************REMREM Следующие два запуска ASM386/486 создадут объектные модулиREM "simpinit.obj" и "cstart.obj". Вследствие использования вREM файлах привилегированных команд ассемблер выдастREM предупреждения. Управляющая директива "debug" заставит ASM386/REM 486 включить дополнительную информацию, полезную для символи-REM ческой отладки. Файлы листинга называются "simpinit.lst" иREM "cstart.lst"echo *echo asm386 simpinit.asm debug mod486asm386 simpinit.asm debug mod486echo (1 предупреждение из-за использования привилегир. команд)echo *echo asm386 cstart.asm debug mod486asm386 cstart.asm debugmod486echo (1 предупреждение из-за использования привилегир. команд)REMREM Запуск C-386/486 создает объектный модуль "simple.obj".REM Управляющие директивы "regallocate" заставляют компиляторREM оптимизировать распределение памяти регистровым переменным.REM Управляющая директива "code" вызывает помещение в конце файлаREM листинга псевдо-ассемблерного текста листинга. "Debug"REM указывает C-386/486 на необходимость включения дополнительнойREM информации, полезной при символической отладке. Файл листингаREM называется "simple.lst".echo *echo c386 simple.c debug regallocate code mod486c386 simple.c debug regallocate code mod486REMREM BND386/486 объединяет входные сегменты и разрешает ссылкиREM адресации символических имен. Директива управления "noload"REM указывает построителю на необходимость создания компонуемогоREM (а не загрузочного) файла. Директива "debug" указывает на то,REM что построитель не очищает отладочную информацию. "Object"REM указывает на то, что выходной файл должен называться "simple.REM bnd". Файл листинга называется "simple.mp1".echo *echo bnd386 simple.obj,simpinit.obj,cstart.obj noload debug object(simple.bnd) mod486bnd386 simple.obj,simpinit.obj,cstart.obj noload debug object(simple.bnd) mod486REMREM Целью является абсолютный загружаемый файл (все адреса которогоREM фиксированы в памяти), который может быть загружен воREM встроенный аппаратный отладчик ICD-486(TM) или ICE-386(TM),REM либо встроенный эмулятор ICE-376(TM). BLD386/486 создает такойREM абсолютный модуль, необходимые дескрипторные таблицы, а такжеREM задачу для инициализации эмулятора. Управляющая директиваREM "buildfile" идентифицирует "simple.bld" в качестве файлаREM построителя. Управляющая директива "bootstrap" идентифицируетREM символическое имя "start" как метку команды, на которую долженREM быть выполнен переход при выполнении перехода самозагрузки,REM находящегося по адресу 0fffffff0H. Директива "flat" заставляетREM построитель конфигурировать файл по плоской модели, когда всеREM коды находятся в сегменте _phantom_data_, "mod486" заставляетREM построитель выдавать сообщения, руководящие созданиемREM объектного модуля для процессора i486(TM). "mod376" заставляетREM построитель выдавать сообщения, руководящие созданиемREM объектного модуля для процессора 376(TM). Вы можете удалитьREM обе эти директивы для создания объектного модуля дляREM процессора 486(TM)DX. Файл листинга называется "simple.mp2".REM Конечная система называется "simple".echo *echo bld386 simple.bnd buildfile (simple.bld) bootstrap (start)echo flat mod486bld386 simple.bnd buildfile (simple.bld) bootstrap (start) flatmod486