Pull to refresh
39
0
Дмитрий Буланов @hb860

User

Send message
Правильно будет «в лесу», так как склонения «в лесе», насколько я знаю, не существует.
Просто над первой картинкой долго думал и, все-таки, решил остановиться на Чейзе с Форманом из House M.D., т.к. они все-таки мастера операций, хоть и не имеют никакого отношения к AD :)
Разумеется, желательно указывать настройки при развертывании самого продукта. Но далеко не все так делают. Да еще и бывают такие ситуации, когда начинают настраивать продукт согласно требованиям, выслушанным от своих пользователей.
Естественно, если офис устанавливался при помощи сценариев автозагрузки, то можно все указать изначально. Развертывание настроек, описанное в статье, имеет смысл в том случае, если при установке не были жестко указаны параметры продукта…
А если произвести вычисление, увеличивающее информационную энтропию — тепловая энтропия уменьшится или нет?
Всё хорошо, но наш загрузчик может оказаться и на FAT16, и на FAT32-устройстве, формат цепочки кластеров в каждом случае свой.
Лучше прочитать сначала спецификацию FAT:
www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx
Там много интересного.

Что касается размещения основного кода загрузчика в файле, в DOS применялось совершенно гениальное решение: у них файл IO.SYS начинался всегда с одного и того же, заранее известного номера сектора.
>>А в автомобилях?
>Windows Embedded или как там она
Windows Embedded Automotive 7: www.microsoft.com/windowsembedded/en-us/products/windows-embedded-automotive/default.mspx

Windows 7 действительно удачная ОС. Лично мне её обновленный функционал в радость, особенно в виде библиотек и расширенного набора горячих клавиш. Ничуть не жалею потраченных на лицензию денег.
С днем рождения, Windows 7.
В «Желаниях» действительно куплеты и припевы по-разному звучат. Можно всем говорить, что это фишка такая.
И да, при переключении задач (т.е. потоков) сегментные регистры аппаратно сохраняются. Специальное место есть для этого, сегмент состояния задачи (TSS).
Вот пример клёвый, как физические адреса можно менять прямо на лету.
www.asm-faq.ru/processory-intel-v-zashhishhennom-rezhime/163-stranichnaja-adresacija.html
>сегменты появились изначально, до страниц, как способ сэкономить на размерах операндов…
Скорее, на разрядности регистров сэкономили. В 8086 регистры 16-разрядные были, а шина адреса — 20 разрядов, так что без сегментов там никак.

В 386 уже 32-разрядная шина, и регистры такие же ( как раз хватит, чтоб адресовать 4 Гб). Поэтому в сегментах особого смысла нет, и остались они в основном из-за совместимости. В AMD x86-64 их вообще выпилили, в нативном режиме там сегментные регистры недоступны.

>по сути псевдонимы каких-то линейных областей памяти…
В общем, да.

>Но по моему в защищенном режиме существует еще хитрая «ядерная» таблица…

При включенной линейной адресации там получаются два уровня. Сначала адрес сегмента складывается со смещением, получается линейный адрес.

Потом линейный адрес смотрится в трёхуровневом каталоге, который так и называется «Page Directory», оттуда берется физический адрес, и по этому адресу процессор лезет в память. Сам каталог лежит в оперативке, а его физический адрес в регистре CR3.

В каталоге каждой странице тупо проставлен бит — присутствует она в памяти или нет. Этот бит аппаратно проверяется. Если страницы нет в памяти, вызывается исключение Page Fault (INT 0Eh). Операционка его отлавливает и может делать что хочет — например, выключить линейную адресацию, загрузить эту страницу в память по любому физическому адресу, апдейтить физический адрес в каталоге, включить линейную адресацию обратно и сделать вид, что ничего не произошло.

Грубо говоря, любой линейный адрес можно мапить на любой физический. При переключении задачи просто подсовывается новый каталог страниц. Таким образом, один и тот же линейный адрес мапится на разные физические, в зависимости от того, из какого потока идет обращение.

Для прикладной программы это без разницы, она не заметит подмены. В Windows вообще у всех пользовательских процессов один и тот же базовый адрес всегда, и сегментные регистры одинаково настроены. Только на уровне каталог страниц у каждого потока свой, так что физические адреса разные получаются.

В общих чертах, оно вот как обстоит.

Сегмент — это произвольный кусок памяти, у него есть начальный адрес. Этот адрес хранится в сегментном регистре. Адреса объектов внутри сегмента задаются относительно этого базового адреса. Теоретически, можно сделать плоскую память, задать все сегментные адреса в 0 и не париться (что в Windows в пользовательском режиме и сделано).

Если память не плоская, тогда код процесса пихается в свой сегмент; данные пихаются в один или два сегмента. Стек тоже в свой сегмент. Хотя можно всё запихнуть в один и тот же.

DS и ES — сегментные регистры. В них адреса сегментов со статическими переменными и строковыми константами. Команды пересылки данных (кроме стековых) берут базовый адрес из этих регистров.

SS — сегментный регистр, в нем адрес стека. На него ориентируются команды PUSH, POP и команды пересылки, в которых адрес операнда задан в регистре BP или SP.

FS — сегментный регистр. В его сегменте под Windows лежит инфа про SEH-chain, а вообще его можно как угодно использовать.

CS — сегментный регистр, в нем адрес сегмента кода. Адрес CS:IP указывает на текущую выполняемую команду (значение CS своё для каждого потока).

Значения DS и ES задаются свои для каждого процесса. Это позволяет данным от разных процессов лежать рядышком в памяти без использования страничной адресации.
Значение SS — своё для каждого потока. Это позволяет иметь каждому потоку свой стек.

mov cs, ds — если б так можно было делать, привело бы к спонтанной передаче управления неведомо куда. Но в cs вообще нельзя напрямую писать, только командами перехода.
Ну это довольно известная вещь. Вот, например:
osdev.berlios.de/v86.html
Самые широко известные — INT10h для BIOS, INT 21h для DOS — с большой достоверностью гуглятся. А развивающиеся — такие, как дисковый сервис INT 13h, или расширенный AT-сервис INT 15h — по ним информация устаревает быстро. По кускам приходится собирать. Русскоязычные источники вообще, кажется, застряли в 1991-м году.
Несколько слов об особенностях обработки прерываний.

Есть 16 аппаратных прерываний IRQ0-IRQ15, которые возникают, когда периферийные устройства типа клавиатуры, таймера или хард-диска пытаются нам что-то сказать. Контроллер прерываний эти сигналы подхватывает и вызывает какие-нибудь INT'ы процессора.

По дефолту IRQ0 — IRQ7 посажены на INT 08h — INT 0Fh, а IRQ8 — IRQ15 на INT 70h — INT 77h. В BIOS'е на них висят обработчики, которые позволяют операционной системе в реальном режиме откликаться на внешние раздражители.

В защищенном режиме INT 08h — INT 0Fh вызываются процессором при возникновении различных исключительных ситуаций (ошибка стека, исключение общей защиты и прочее). Так что контроллер прерываний нужно будет перепрограммировать, чтобы он в ответ на IRQ вызывал другие INT'ы.

Например, если вы хотите живую клавиатуру (IRQ 1), её следует перебросить с INT 09h (который отвечает за Coprocessor Segment Overrun) на какой-нибудь INT в области от 20h до FFh.

Об адресной линии A20.
На современном железе она не обязательно управляется портом 92h, так что приведенный код

in al, 0x92
or al, 2
out 0x92, al

может и сбойнуть.

Как с этим жить
В BIOS есть функция, которая позволяет абстрагироваться от обеих проблем. Это функция 89h прерывания INT 15h, она переключает процессор в защищенный режим, заодно открывает A20 и перепрограммирует контроллер прерываний.

Формат вызова следующий.
Вход:
AH = 89h
BL = номер прерывания для IRQ0, должен быть кратен 8 (IRQ1-7 сядут на следующие 7 прерываний)
BH = номер прерывания для IRQ8, должен быть кратен 8 (IRQ9-F сядут на следующие 7 прерываний)
ES:SI -> адрес GDT для защищенного режима.

Выход:
CF — признак ошибки
CF = 1, AH = FFh — не получилось открыть адресную линию A20
CF = 0, AH = 00h — всё нормально.

Выход из INT 15h будет как обычно, на следующую команду за вызовом. Только мы окажемся уже в защищенном режиме, так что для текущего значения CS должен быть настроен дескриптор. Значение BP не сохраняется, значения всех сегментных регистров будут изменены.
Ну то про однокристалки с 128 байт ОЗУ и 4К ПЗУ. Там если не будешь экономить байты — вообще ничего не заработает.
Бывает и по-другому.
Нападение на воинскую часть №68128 в Фаустово было совершено в ночь с субботы на воскресенье… Трое грабителей в масках проникли в сторожевую будку к постовому и связали военнослужащего. Преступники действовали как настоящие профессионалы-коммандос: одним рывком они вытащили шнур из розетки и тем самым обесточили всю систему видеонаблюдения военной части.

Оставив перепуганного солдата привязанным к стулу, грабители спокойно залезли на армейский склад и вынесли оттуда несколько мешков сахара и факсимильный аппарат.

www.newsru.com/crime/17may2010/commandosrobpdmsk.html
>На PC единственное требование к загрузочному сектору — это содержание в двух его последних байтах значений 0x55 и 0xAA

BIOS в Virtual Box плюёт на сигнатуру, загружает сектор даже без неё.

Есть ещё несколько нюансов в работе загрузчика. Могут быть по-разному инициализированы CS:IP, что повлечет проблемы с абсолютными переходами. Большинство BISOов их выставляют в 0x0000:0x7c00, некоторые — в 0x7c0:0x0000.

Желательно подстраховаться в самом начале программы, принудительно задав CS:

ORG 0x7C00
jmp 0x0000:start
start:

Ещё может быть сюрприз с дефолтным размещением стека — на одних системах он попадает в 0500-7BFF, на других в 07E00-7FFFF. Когда будем подгружать дополнительные модули, желательно с расположением стека уже определиться.

Если есть желание работать с аппаратурой на низком уровне, стоит изучить спецификацию ACPI. Согласно ей, алгоритмы работы железками записываются на абстрактном языке и помещаются в специальные области памяти. Операционка должна иметь транслятор с ACPI-языка в язык платформы. Этот подход позиционируется как альтернатива системно-зависимым драйверам. Насколько мне известно, на русский эту спецификацию не переводил никто.
> «таких машин в мире ещё нет»
> «по цене — вдвое дешевле зарубежных аналогов»
Кими забыли))) Чемпион 2007.

Information

Rating
Does not participate
Location
Херсон, Херсонская обл., Украина
Date of birth
Registered
Activity