ЗАГРУЗИТЬ
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, 04.08.1988; 2.04, 17.08.1988) [4] драйверы в MS-DOS , Uniform Software Systems ' The Extender (1985) и The Connector (1985) для Lotus 1-2-3 , Over Disk (1986) [5] ( LIMulator от компании Upper 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 ), так что не было необходимости сохранять и восстанавливать его для LOADALL. Microsoft EMM386.EXE операции инструкции LOADALL 286 и 386 использует в своем обработчике недопустимого кода . [7] Проверка кода монитора виртуальной машины в Windows/386 2.10 показывает, что он использует как 286, так и [ нужна ссылка ] и еще менее известный вариант 386 [ нужна ссылка ] . Microsoft HIMEM.SYS версии 2.06. [8] также использовал LOADALL для быстрого копирования в расширенную память и из нее в системах 286.
Еще одно интересное использование LOADALL, изложенное в книге «Проектирование OS/2» . [9] должно было бы позволить запускать прежние программы реального режима в 16-битном защищенном режиме, который использовался в Digital Research компании Concurrent 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]
( Внутрисхемный эмулятор ICE) — это инструмент, используемый для низкоуровневой отладки. В Intel 80386 установка недокументированного контакта в позиции B6 приводит к тому, что микропроцессор останавливает выполнение и переходит в режим ICE. Микропроцессор сохраняет все свое состояние в области памяти, изолированной от обычной системной памяти. Расположение этой области подходит для инструкции LOADALL, и эта инструкция используется кодом ICE для возврата к нормальному выполнению.
В более поздних процессорах это превратилось в режим управления системой (SMM). В SMM инструкция RSM используется для загрузки полного состояния ЦП из области памяти. Структура этой области памяти аналогична той, которая используется инструкцией LOADALL. [16] Инструкция LOADALL в стиле 386 также может быть выполнена на 486, но только в режиме SMM. В более поздних процессорах ее роль взяла на себя инструкция RSM, с другой кодировкой.
3.0 от Microsoft Codeview 2.0 от Borland и Turbo Debugger правильно декодируют инструкции LOADALL 286 и 386. [1]
Поскольку две инструкции LOADALL никогда не документировались и не существуют в более поздних процессорах, коды операций были повторно использованы в архитектуре AMD64 . [17] Код операции для инструкции 286 LOADALL, 0F05, стал инструкцией AMD64 SYSCALL; инструкция 386 LOADALL, 0F07, стала инструкцией SYSRET. Эти определения были реализованы даже на процессорах Intel с появлением реализации AMD64 в Intel 64 . [18]
80286
[ редактировать ]Код операции 0F05. Инструкция считывает данные с адресов 0x00800–0x00866 независимо от содержимого регистров сегмента.
Адрес | число байтов |
зарегистрироваться | зарегистрироваться | зарегистрироваться | зарегистрироваться |
---|---|---|---|---|---|
00800 | 6 | не используется | |||
00806 | 2 | MSW, слово состояния машины | |||
00808 | 14 | не используется | |||
00816 | 2 | ТР (регистр задач) | |||
00818 | 2 | флаги | |||
0081А | 2 | IP (указатель инструкций) | |||
0081C | 2 | ЛДТР, местный регистр таблицы дескрипторов | |||
0081E | 4× 2 | DS ( сегмент данных ) | СС (сегмент стека) | CS (сегмент кода) | ES (дополнительный сегмент) |
00826 | 4× 2 | DI (индекс назначения) | СИ (индекс источника) | БП (базовый указатель) | SP (указатель стека) |
0082E | 4× 2 | ВХ | DX | CX | ТОПОР |
00836 | 4× 6 | ES -сегмента Дескриптор | Дескриптор сегмента CS | Дескриптор сегмента SS | Дескриптор сегмента DS |
0084E | 4× 6 | ГДТ, глобальная таблица дескрипторов |
ЛДТ, таблица локальных дескрипторов |
ИДТ, таблица дескрипторов прерываний |
ТСС, сегмент состояния задачи |
Инструкцию 80286 LOADALL нельзя использовать для переключения из защищенного обратно в реальный режим. [19] (он не может очистить бит PE в MSW). Однако использование инструкции LOADALL позволяет вообще избежать необходимости переключения в защищенный режим.
80386
[ редактировать ]Код операции 0F07. Инструкция загружает данные с адреса ES:EDI. На самом деле он использует ES, а не дескриптор ES.
Адрес | число байтов |
зарегистрироваться | зарегистрироваться | зарегистрироваться | зарегистрироваться |
---|---|---|---|---|---|
RU:EDI+00 | 4 | CR0, регистр управления 0 | |||
ES:EDI+04 | 4 | ЭФЛАГУС | |||
RU:EDI+08 | 4 | EIP, указатель инструкций | |||
ES:EDI+0C | 4× 4 | EDI, индекс назначения | ESI, индекс источника | EBP, базовый указатель | ESP, указатель стека |
ES:EDI+1C | 4× 4 | ЕВХ | ЭДКС | ЭКХ | ЕАХ |
ЭС:ЭДИ+2С | 2× 4 | ДР6 | ДР7 | ||
RU:EDI+34 | 4 | TR, селектор состояния задачи | |||
RU:EDI+38 | 4 | ЛДТР, таблица локальных дескрипторов | |||
ЭС:ЭДИ+3С | 4× 2 | GS, дополнительный сегмент | не используется | FS, дополнительный сегмент | не используется |
RU:EDI+44 | 4× 2 | DS, сегмент данных | не используется | СС, сегмент штабеля | не используется |
ЭС:ЭДИ+4С | 4× 2 | CS, сегмент кода | не используется | ES, дополнительный сегмент | не используется |
ES:EDI+54 | 4× 12 | дескриптор TSS, селектор состояния задачи |
дескриптор IDT, таблица дескрипторов прерываний |
дескриптор GDT, глобальная таблица дескрипторов |
дескриптор LDT, таблица локальных дескрипторов |
RU:EDI+84 | 4× 12 | GS Дескриптор сегмента | Дескриптор сегмента FS | Дескриптор сегмента DS | Дескриптор сегмента SS |
ES:EDI+B4 | 2× 12 | Дескриптор сегмента CS | Дескриптор ES-сегмента |
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с д Шульман, Эндрю; Михелс, Раймонд Дж.; Кайл, Джим; Патерсон, Тим ; Макси, Дэвид; Браун, Ральф Д. (1990). Недокументированная DOS: Руководство программиста по зарезервированным функциям и структурам данных MS-DOS (1-е изд.). Аддисон-Уэсли . стр. 14–15. ISBN 978-0-201-57064-9 . (xviii+694+viii страниц, 2 дискеты размером 5,25 дюйма [1] ) Исправления: [2] [3]
- ^ Jump up to: а б Ван Гиллуве, Фрэнк (1994). Недокументированный ПК (1-е изд.). Аддисон-Уэсли . стр. 62–70. ISBN 0-201-62277-7 . [4]
- ^ Jump up to: а б Дункан, Рэй; Петцольд, Чарльз ; Бейкер, М. Стивен; Шульман, Эндрю; Дэвис, Стивен Р.; Нельсон, Росс П.; Мут, Роберт (1990). Расширение DOS (1-е изд.). Ридинг, Массачусетс, США: Addison-Wesley Publishing Company, Inc., стр. 100–103. ISBN 0-20155053-9 .
- ^ Jump up to: а б с Некасек, Михал (27 октября 2013 г.). «Подробнее о LOADALL и OS/2» . Музей OS/2 . Архивировано из оригинала 17 октября 2018 г. Проверено 17 октября 2018 г.
- ^ Коллинз, Роберт Р. (октябрь 1991 г.). «Инструкция LOADALL» . TECH Specialist — журнал для продвинутых разработчиков ПК . 2 (10). Лоуренс, Канзас, США: R&D Publications, Inc. ISSN 1049-913X . Архивировано из оригинала 20 февраля 2020 г. Проверено 17 октября 2018 г. [5] (Примечание. Журнал вскоре был переименован в «Журнал разработчиков DOS», а затем и в «Журнал разработчиков Windows/DOS» (ISSN 1059-2407).)
- ^ Некасек, Михал (18 марта 2011 г.). «HIMEM.SYS, нереальный режим и LOADALL» . Музей OS/2 . Архивировано из оригинала 3 января 2017 г. Проверено 03 января 2017 г.
- ^ Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михелс, Раймонд Дж.; Кайл, Джим (1994) [ноябрь 1993 г.]. Уильямс, Эндрю (ред.). Недокументированная DOS: Руководство программиста по зарезервированным функциям и структурам данных MS-DOS, расширенное за счет включения MS-DOS 6, Novell DOS и Windows 3.1 . Серия программ Эндрю Шульмана (1-е издание, 2-е изд.). Ридинг, Массачусетс, США: Издательство Addison Wesley Publishing Company . п. 42 . ISBN 0-201-63287-Х . (xviii+856+vi страниц, 3,5-дюймовая дискета [6] ) Исправления: [7] [8]
- ^ «Исходный код Microsoft HIMEM.SYS 2.06» .
- ^ Дейтел, Харви М.; Коган, Майкл С. (1992). Проект OS/2 . Аддисон-Уэсли . ISBN 0-201-54889-5 .
- ^ Jump up to: а б Фостер, Эдвард (13 мая 1985 г.). «Super DOS ждет новый 80286 — Concurrent DOS 286 — отложен до тех пор, пока Intel не обновит чип — предлагает мощность Xenix и совместимость с IBM PC» . Инфомир . 7 (19). Медиа-группа InfoWorld : 17–18. ISSN 0199-6649 . Архивировано из оригинала 21 апреля 2019 г. Проверено 21 апреля 2019 г.
- ^ Jump up to: а б Фостер, Эдвард (26 августа 1985 г.). «Intel демонстрирует новый чип 80286 — будущее Concurrent DOS 286 от DRI все еще неясно после исправления процессора» . Инфомир . 7 (34). InfoWorld Media Group : 21. ISSN 0199-6649 . Архивировано из оригинала 21 апреля 2019 г. Проверено 21 апреля 2019 г.
- ^ «Concurrent DOS 68K 1.2 — Комплект разработчика для Motorola VME/10 — Диск 2» . 6 августа 1986 г. [8 апреля 1986 г.]. Архивировано из оригинала 3 апреля 2019 г. Проверено 13 сентября 2018 г. (Примечание. Этот пакет также включает в себя некоторые файлы заголовков из Concurrent DOS 286 , включая STRUCT.H, в котором явно упоминается LOADALL для «эмуляции 8086».)
- ^ Jump up to: а б Дополнение FlexOS для компьютеров на базе Intel iAPX 286 (PDF) . 1.3 (1-е изд.). Digital Research, Inc. , ноябрь 1986 г. Архивировано (PDF) из оригинала 21 апреля 2019 г. Проверено 14 августа 2018 г.
- ^ Кальво, Мелисса; Форбс, Джим (10 февраля 1986 г.). «IBM будет использовать операционную систему DRI» . Инфомир . Медиа-группа InfoWorld . Архивировано из оригинала 21 апреля 2019 г. Проверено 6 сентября 2011 г.
- ^ «IBM выбирает Concurrent DOS-286 для розничной системы PC AT» (PDF) . Европейское обозрение (18). Цифровые исследования : 1 марта 1986 г. Архивировано (PDF) из оригинала 3 апреля 2019 г. Проверено 15 сентября 2018 г.
- ^ Коллинз, Роберт Р. (январь 1997 г.). «Режим управления системой Intel» . Архивировано из оригинала 3 января 2017 г. Проверено 03 января 2017 г.
- ^ Некасек, Михал (18 октября 2013 г.). «LOADALL снова наносит удар» . Музей OS/2 . Архивировано из оригинала 3 января 2017 г. Проверено 27 января 2016 г.
- ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2B» (PDF) . Корпорация Интел . Декабрь 2015 г. Архивировано (PDF) из оригинала 21 апреля 2019 г. Проверено 27 января 2016 г.
- ^ Слейтер, Майкл (октябрь 1987 г.). «Секретная инструкция 286 LOADALL позволяет получить доступ к расширенной памяти в реальном режиме». Отчет микропроцессора .
Дальнейшее чтение
[ редактировать ]- Технический справочник IBM Operating System/2 – Семейство программ (PDF) . Том. 1 (1-е изд.). ИБМ . Сентябрь 1987 г. [1986 г.]. Архивировано (PDF) из оригинала 03 января 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]
- Чаппелл, Джефф (3 октября 2008 г.) [18 марта 1997 г.]. «Странные вещи. LINK знает о процессорах 80x86» . Архивировано из оригинала 21 апреля 2019 г. Проверено 21 апреля 2019 г.
- Некасек, Михал (13 декабря 2014 г.). «Любопытная инструкция» . Музей OS/2 . Архивировано из оригинала 21 апреля 2019 г. Проверено 21 апреля 2019 г.
- Стиллер, Андреас (1990). «Горьки для 32-горьков». c't - журнал по компьютерным технологиям (на немецком языке). Том 1990, № 8. с. 202.
- Юффа, Норберт; Сиринг, Питер (1990). «Пути через стену. Loadall — расширенная память в реальном режиме 80286». c't - журнал по компьютерным технологиям (на немецком языке). Том 1990, № 11. С. 362–366.