ЗАГРУЗИТЬ - LOADALL
ЗАГРУЗИТЬ это общее имя для двух разных, недокументированные машинные инструкции из Intel 80286 и Intel 80386 процессоры, которые позволяют получить доступ к областям внутреннего состояния процессора, которые обычно находятся за пределами IA-32 API сфера, как регистры кэша дескриптора. LOADALL для 286 процессоров кодируется 0Fh 05h,[1] а LOADALL для 386 процессоров - 0Fh 07h.[2]
Оба варианта - как следует из названия - загружают все внутренние регистры процессора за одну операцию. LOADALL обладал уникальной способностью настраивать видимую часть сегментных регистров (селектор) независимо от их соответствующей кэшированной части, что позволяло программисту переводить ЦП в состояния, не допускаемые официальной моделью программирования.
Применение
В качестве примера полезности этих методов LOADALL может настроить ЦП, чтобы разрешить доступ ко всей памяти из реальный режим, без необходимости переключать его на нереальный режим (что требует переключения на защищенный режим, доступ к памяти и, наконец, переключение обратно в реальный режим). Такие программы, как предварительнаяXMS версии RAMDRIVE.SYS (1985),[3][1][4] SMARTDRV.SYS (1986)[4] а также HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17)[4] драйверы в MS-DOS, Единые программные системы ' Расширитель (1985) и Соединитель (1985) для Лотос 1-2-3, Над диском (1986)[5] (а LIMulator компанией Above Software (ранее Tele-Ware West он же Los Angeles Securities Group ), который преобразовал жесткий диск пространство или расширенная память в расширенная память ), и OS / 2 1.0[3][1] и 1.1[6] использовал инструкцию 286 LOADALL. DOS 3.3 и 4.0 зарезервировали 102-байтовый буфер в 0070: 0100h (который обычно был занят DOS BIOS data), чтобы не было необходимости сохранять и восстанавливать его для LOADALL. Microsoft EMM386.EXE Особые случаи: инструкции 286 и 386 LOADALL в обработчике недопустимого кода операции.[7] Проверка кода монитора виртуальной машины в Окна / 386 2.10 показывает, что он использует как 286[нужна цитата ] и еще менее известный вариант 386[нужна цитата ]. Microsoft HIMEM.SYS версии 2.06[8] также использовал LOADALL для быстрого копирования в расширенную память и из нее в 286 системах.
Еще одно интересное использование LOADALL, изложенное в книге Дизайн OS / 2,[9] могло бы позволить запускать прежние программы реального режима в 16-битном защищенном режиме, как это используется Цифровые исследования с Параллельный DOS 286 с 1985,[10][11][12] а также FlexOS 286[13] и ОС IBM 4680[14][15] с 1986 года. Маркировка всех кэшей дескрипторов в GDT и LDT «Отсутствует» позволит операционной системе перехватывать перезагрузки регистров сегмента, а также попытки выполнения специфичной для реального режима «арифметики сегмента» и эмулировать желаемое поведение путем обновления дескрипторов сегментов (снова LOADALL). Однако этот «виртуальный режим 8086» для 80286 был слишком медленным, чтобы быть практичным. От этой идеи пришлось отказаться, к тому же из-за ошибок в некоторых ранних процессорах Intel 80286 до E-2. шагающий.[10][11][13] В результате OS / 2 1.x, а также Windows в «стандартном» режиме должны были запускать программы DOS в реальном режиме. Тем не менее идея не была потеряна; это побудило Intel представить виртуальный режим 8086 из 80386, что позволяет реализовать "Боксы DOS "наконец-то относительно эффективным и задокументированным способом.
Поскольку LOADALL не выполнял никаких проверок достоверности данных, загруженных в регистры процессора, можно было загрузить состояние процессора, которое нельзя было ввести обычным способом, например, используя реальный режим (PE = 0) вместе с подкачкой (PG = 1) на процессорах класса 386.[2]
An внутрисхемный эмулятор (ICE) - это инструмент, используемый для низкоуровневой отладки. На Intel 80386 подтверждение недокументированного вывода в местоположении B6 заставляет микропроцессор останавливать выполнение и переходить в режим ICE. Микропроцессор сохраняет все свое состояние в области памяти, изолированной от нормальной системной памяти. Расположение этой области подходит для инструкции LOADALL, и эта инструкция используется кодом ICE для возврата к нормальному выполнению.
В более поздних процессорах это превратилось в Режим управления системой. В режиме SMM инструкция RSM используется для загрузки полного состояния ЦП из области памяти. Структура этой области памяти аналогична структуре, используемой инструкцией LOADALL.[16] Команда LOADALL в стиле 386 может выполняться и на 486, но только в режиме SMM. В более поздних процессорах свою роль взяла на себя инструкция RSM с другой кодировкой.
Microsoft Codeview 3.0 и Borland Турбо-отладчик 2.0 правильно декодирует инструкции LOADALL 286 и 386.[1]
Поскольку две инструкции LOADALL никогда не были задокументированы и не существуют в более поздних процессорах, коды операций были повторно использованы в AMD64 архитектура.[17] Код операции для инструкции 286 LOADALL, 0F05, стал инструкцией AMD64 SYSCALL; инструкция 386 LOADALL, 0F07, стала инструкцией SYSRET. Эти определения были реализованы даже в процессорах Intel с введением Intel 64 реализация AMD64.[18]
80286
Код операции 0F05. Инструкция считывает данные с адресов 00800–00866 независимо от содержимого сегментных регистров.
Адрес | количество байтов | регистр | регистр | регистр | регистр |
---|---|---|---|---|---|
00800 | 6 | не используется | |||
00806 | 2 | MSW, слово состояния машины | |||
00808 | 14 | не используется | |||
00816 | 2 | TR (реестр задач) | |||
00818 | 2 | флаги | |||
0081A | 2 | IP (указатель инструкции) | |||
0081C | 2 | LDTR, местный регистр таблицы дескрипторов | |||
0081E | 4× 2 | DS (данные сегмент ) | SS (сегмент стека) | CS (сегмент кода) | ES (дополнительный сегмент) |
00826 | 4× 2 | DI (индекс назначения) | SI (исходный указатель) | BP (базовый указатель) | SP (указатель стека) |
0082E | 4× 2 | BX | DX | CX | ТОПОР |
00836 | 4× 6 | ES дескриптор сегмента | Дескриптор сегмента CS | Дескриптор сегмента SS | Дескриптор сегмента DS |
0084E | 4× 6 | GDT, глобальная таблица дескрипторов | LDT, таблица локальных дескрипторов | IDT, таблица дескрипторов прерываний | TSS, сегмент состояния задачи |
Команда 80286 LOADALL не может использоваться для переключения из защищенного обратно в реальный режим.[19] (он не может очистить бит PE в MSW). Однако использование инструкции LOADALL может полностью избавить от необходимости переключаться в защищенный режим.
80386
Код операции 0F07. Инструкция загружает данные с адреса ES: EDI. Фактически он использует ES, а не дескриптор ES.
Адрес | количество байтов | регистр | регистр | регистр | регистр |
---|---|---|---|---|---|
ES: EDI + 00 | 4 | CR0, регистр управления 0 | |||
ES: EDI + 04 | 4 | EFLAGS | |||
ES: EDI + 08 | 4 | EIP, указатель инструкции | |||
ES: EDI + 0C | 4× 4 | EDI, индекс назначения | ESI, исходный указатель | EBP, базовый указатель | ESP, указатель стека |
ES: EDI + 1C | 4× 4 | EBX | EDX | ECX | EAX |
ES: EDI + 2C | 2× 4 | DR6 | DR7 | ||
ES: EDI + 34 | 4 | TR, селектор состояния задачи | |||
ES: EDI + 38 | 4 | LDTR, таблица локальных дескрипторов | |||
ES: EDI + 3C | 4× 2 | GS, дополнительный сегмент | не используется | FS, дополнительный сегмент | не используется |
ES: EDI + 44 | 4× 2 | DS, сегмент данных | не используется | SS, сегмент стека | не используется |
ES: EDI + 4C | 4× 2 | CS, сегмент кода | не используется | ES, дополнительный сегмент | не используется |
ES: EDI + 54 | 4× 12 | Дескриптор TSS, селектор состояния задачи | Дескриптор IDT, таблица дескрипторов прерываний | Дескриптор GDT, глобальная таблица дескрипторов | Дескриптор LDT, таблица локальных дескрипторов |
ES: EDI + 84 | 4× 12 | GS дескриптор сегмента | Дескриптор сегмента FS | Дескриптор сегмента DS | Дескриптор сегмента SS |
ES: EDI + B4 | 2× 12 | Дескриптор сегмента CS | Дескриптор сегмента ES |
Смотрите также
использованная литература
- ^ а б c d Шульман, Эндрю; Michels, Raymond J .; Кайл, Джим; Патерсон, Тим; Макси, Дэвид; Браун, Ральф Д. (1990). Недокументированная DOS: руководство программиста по зарезервированным функциям и структурам данных MS-DOS (1-е изд.). Эддисон-Уэсли. С. 14–15. ISBN 978-0-201-57064-9. (xviii + 694 + viii страницы, 2 × 5,25 "-флоппи [1] ) Исправления: [2][3]
- ^ а б Ван Гиллуве, Франк (1994). Недокументированный ПК (1-е изд.). Эддисон-Уэсли. С. 62–70. ISBN 0-201-62277-7. [4]
- ^ а б Дункан, Рэй; Петцольд, Чарльз; Бейкер, М. Стивен; Шульман, Эндрю; Дэвис, Стивен Р .; Нельсон, Росс П .; Мут, Роберт (1990). Расширение DOS (1-е изд.). Ридинг, Массачусетс, США: Addison-Wesley Publishing Company, Inc. С. 100–103. ISBN 0-20155053-9.
- ^ а б c Некасек, Михал (27.10.2013). "Подробнее о LOADALL и OS / 2". OS / 2 музей. В архиве из оригинала на 2018-10-17. Получено 2018-10-17.
- ^ Коллинз, Роберт Р. (октябрь 1991 г.). "Инструкция LOADALL". TECH Specialist - журнал для продвинутых разработчиков ПК. Лоуренс, Канзас, США: R&D Publications, Inc. 2 (10). ISSN 1049-913X. В архиве с оригинала на 2020-02-20. Получено 2018-10-17. [5] (NB. Журнал был вскоре переименован в «The DOS Developers Journal», а затем в «The Windows / DOS Developer's Journal» (ISSN 1059-2407).)
- ^ Некасек, Михал (18 марта 2011 г.). «HIMEM.SYS, нереальный режим и LOADALL». OS / 2 музей. В архиве из оригинала на 03.01.2017. Получено 2017-01-03.
- ^ Шульман, Эндрю; Браун, Ральф Д.; Макси, Дэвид; Michels, Raymond J .; Кайл, Джим (1994) [ноябрь 1993]. Уильямс, Эндрю (ред.). Недокументированная DOS: руководство программиста по зарезервированным функциям и структурам данных MS-DOS - расширено за счет включения MS-DOS 6, Novell DOS и Windows 3.1. Серия программирования Эндрю Шульман (1-е издание, 2-е изд.). Ридинг, Массачусетс, США: Издательство Эддисон Уэсли. п.42. ISBN 0-201-63287-X. (xviii + 856 + vi страниц, 3,5-дюймовая дискета [6] ) Исправления: [7][8]
- ^ "Исходный код Microsoft HIMEM.SYS 2.06".
- ^ Deitel, Harvey M .; Коган, Майкл С. (1992). Дизайн OS / 2. Эддисон-Уэсли. ISBN 0-201-54889-5.
- ^ а б Фостер, Эдвард (1985-05-13). «Super DOS ожидает нового 80286 - Concurrent DOS 286 - отложена до тех пор, пока Intel не обновит чип - предлагает мощность Xenix и совместимость с IBM PC». InfoWorld. InfoWorld Media Group. 7 (19): 17–18. ISSN 0199-6649. В архиве из оригинала от 21.04.2019. Получено 2019-04-21.
- ^ а б Фостер, Эдвард (1985-08-26). «Intel демонстрирует новый чип 80286 - будущее DRI Concurrent DOS 286 все еще неясно после исправления процессора». InfoWorld. InfoWorld Media Group. 7 (34): 21. ISSN 0199-6649. В архиве из оригинала от 21.04.2019. Получено 2019-04-21.
- ^ «Параллельный DOS 68K 1.2 - Комплект разработчика для Motorola VME / 10 - Диск 2». 1986-08-06 [1986-04-08]. В архиве из оригинала на 2019-04-03. Получено 2018-09-13. (NB. Этот пакет также включает некоторые файлы заголовков из Параллельный DOS 286, включая STRUCT.H, явно упоминающий LOADALL для «эмуляции 8086».)
- ^ а б Приложение FlexOS для компьютеров на базе Intel iAPX 286 (PDF). 1.3 (1-е изд.). Digital Research, Inc. Ноябрь 1986 г. В архиве (PDF) из оригинала от 21.04.2019. Получено 2018-08-14.
- ^ Кальво, Мелисса; Форбс, Джим (1986-02-10). «IBM будет использовать операционную систему DRI». InfoWorld. InfoWorld Media Group. В архиве из оригинала от 21.04.2019. Получено 2011-09-06.
- ^ «IBM выбирает Concurrent DOS-286 для розничной системы PC AT» (PDF). Европейский обзор. Цифровые исследования (18): 1 марта 1986 г. В архиве (PDF) из оригинала на 2019-04-03. Получено 2018-09-15.
- ^ Коллинз, Роберт Р. (январь 1997 г.). «Режим управления системой Intel». В архиве из оригинала на 03.01.2017. Получено 2017-01-03.
- ^ Некасек, Михал (18.10.2013). "LOADALL снова наносит удар". OS / 2 музей. В архиве из оригинала на 03.01.2017. Получено 2016-01-27.
- ^ "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2B" (PDF). Корпорация Intel. Декабрь 2015 г. В архиве (PDF) из оригинала от 21.04.2019. Получено 2016-01-27.
- ^ Слейтер, Майкл (октябрь 1987). «Секретная инструкция 286 LOADALL разрешает доступ к расширенной памяти в реальном режиме». Отчет микропроцессора.
дальнейшее чтение
- Технический справочник по операционной системе IBM / 2 - Семейство программирования (PDF). 1 (1-е изд.). IBM. Сентябрь 1987 [1986]. В архиве (PDF) из оригинала от 03.01.2017.
- Чаппелл, Джефф (январь 1994). Шульман, Эндрю; Педерсен, Аморетта (ред.). Внутреннее устройство DOS. Серия программирования Эндрю Шульман (1-е издание, 1-е изд.). Издательство Эддисон Уэсли. С. 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9. (xxvi + 738 + iv страницы, 3,5-дюймовые гибкие диски [9][10] ) Исправления: [11][12][13]
- Чаппелл, Джефф (2008-10-03) [1997-03-18]. "Странные вещи, которые LINK знает о процессорах 80x86". В архиве из оригинала от 21.04.2019. Получено 2019-04-21.
- Некасек, Михал (13 декабря 2014 г.). "Любопытные инструкции". OS / 2 музей. В архиве из оригинала от 21.04.2019. Получено 2019-04-21.
- Стиллер, Андреас (1990). "Bitter für 32-Bitter". c't - магазин компьютерной техники (на немецком). Vol. 1990 г. 8. п. 202.
- Джуффа, Норберт; Сиринг, Питер (1990). «Wege über die Mauer. Loadall - Расширенная память в реальном режиме для 80286». c't - магазин компьютерной техники (на немецком). Vol. 1990 г. 11. С. 362–366.