sfw
nsfw

Результаты поиска по запросу "структура системи"

Как пираты судьбу метра в США решили.

Ну, как и обещал — вот вам история про метрическую систему в США. В чём измеряется диагональ вашего монитора? В дюймах! И это логично, ведь большая часть производителей, потребителей и «законодателей мод» высоких технологий пришла из США. И в этой стране продавать дюймовые штуки было банально проще, чем объяснять населению, что такое сантиметр и как он соотносится с привычной для них системой. Почему же они не перешли на вполне логичную, понятную и привычную всему миру систему? Ведь сейчас США вместе с Либерией и Мьянмой (отличная компания, да?) является страной, которая так и не приняла метрическую систему, оставив для себя что что-то своё, родное и уютное. Галлоны, дюймы, мили и прочие короткие тонны (кстати, вы ведь в курсе, что в США есть примерно десяток их разновидностей?). Но в конце XVIII века у американцев был шанс всё изменить. Помешал случай и… пираты 
,История,Метрическая система,США,страны,пираты,президенты,галлон на унцию в кубическом ярде,Массаракш наизнанку,Реактор познавательный
Запишите это на наш счет! 
Как мы помним из уроков истории, долгое время эта страна была одной из колоний Англии. В Британских колониях, как это вполне закономерно звучит, использовалась Британская же система измерения. Вот как раз те самые дюймы и мили. Но, после того, как США обрели независимость от «Империи над которой никогда не заходит солнце» они задумались — куда же им теперь податься, чтобы уж совсем наверняка отринуть всё Имперское и сделаться умными и красивыми. В их стране царила какая-то дикая смесь разных систем измерения — голландской, английской и случайно выдуманных отдельными гениальными самородками в состоянии запоя. В 1790-х годах Томас Джефферсон, как раз ставший государственным секретарём (по статусу третий после президента и вице-президента), наконец-то решил, что хватит это терпеть и волевым усилием замахнулся повернуть Америку в сторону цивилизации и стандартизации. 
Сам Томас Джефферсон. 
Так как США находились в довольно плотной оппозиции с Британией, то Америке по принципу «враг нашего врага — наш друг» симпатизировала Франция. И, о чудесное совпадение, именно в этой стране изобрели новомодную, простую, понятную и, главное, очень цивилизованную и стандартизированную метрическую систему. Приятным бонусом было тот факт, что её принятие, положительно бы повлияло на дальнейшие взаимоотношения (в основном, торговые) Франции и США. Всё так замечательно сходилось. Ну а то, что Джефферсон был известным франкофилом, было приятным дополнением к этому всему. Решение казалось уже практически принятым, и пора бы населению закупаться новыми линейками и гирьками... Но... Но даже третий по статусу в США не может просто взять и сказать — «а давайте теперь мы будем пользоваться совсем другой системой». И все такие — «да, отличная идея, начинаем завтра, раз уж ты предложил, то никаких вопросов». Нет, для таких решений нужна последовательность. Убедить одну фракцию, потом другую, затем вытащить всё это на общее одобрение и так далее. Короче, чтобы убедить конгресс на такой шаг, Джефферсону нужен был какой-нибудь демонстрационный материал и желательно кто-то, близко знакомый с метрической системой. Этим кем-то стал Джозеф Домби — французский натуралист. 
,История,Метрическая система,США,страны,пираты,президенты,галлон на унцию в кубическом ярде,Массаракш наизнанку,Реактор познавательный
Джозеф Домби. Врач, ботаник, путешественник, натурфилософ. Правда об этом никто уже и не вспомнит. Но вот стоило ему один раз столкнуться с пиратами... 
Именно он в 1793 году отправился на корабле из Франции в США, чтобы совместно с Джефферсоном продемонстрировать Конгрессу все достоинства новой системы. Простоту конвертации, удобство использования и так далее. В нагрузку к собственному красноречию и знаниям он вёз из Багетленда два эталона — медный стержень размером ровно один метр и медный цилиндр весом ровно один килограмм (тогда эта единица называлась грав (grave) от слова «гравитация»). Подобные штуки делались с соблюдением всяческих норм, с высокой точностью и были довольно редкими и ценными (эталонов грава к тому времени было произведено всего лишь шесть экземпляров). С такими ценными вещами на борту корабль двигался очень осторожно. 
,История,Метрическая система,США,страны,пираты,президенты,галлон на унцию в кубическом ярде,Массаракш наизнанку,Реактор познавательный
Вот. Это грав, а не «гирька из советского магазина». 
А потом произошло то, что предсказать было сложно — погода. В результате внезапного шторма корабль отнесло в сторону Карибского моря. Где, как мы все прекрасно знаем, обитали страшные и жуткие пираты. Судно шло под французским флагом и вскоре его заметили английские каперы. То есть, чисто юридически это были не совсем пираты в общем понимании, а скорее вооружённые частные корабли, которым правительство Англии разрешило атаковать вражеские суда. И это определение прекрасно подходило к тому паруснику, на котором плыл Домби. Франция, как раз в это время воевала с Англией и поэтому юридически-не-пираты смело рванули в бой, предвкушая неплохую прибыль. Два каперских корабля легко взяли на абордаж судно и, захватив пленников, доставили их к ближайшей территории Англии — острову Монтсеррат. 
Так он выглядит сейчас. 
За Джозефа Домби, как за человека из высшего общества пираты надеялись получить выкуп. К сожалению, натурфилософ так и не дождался момента освобождения и умер в плену. Ну а корабль и все вещи, найденные на нём, были распроданы или просто выброшены в воду. Такая судьба, похоже, постигла и драгоценные метрические эталоны. Для пиратов они было не больше чем простыми железяками, а не редким и тщательно отмеренным экземпляром предвестника грядущей эры стандартизации. Так что первое метрическое паломничество в США оказалось неудачным. Без должной информационный поддержки и презентации Томас Джефферсон не смог доказать Конгрессу превосходство таких странных штук как метр и килограмм над привычными дюймом и стоунами. И тема заглохла сама собой. По мнению многих — именно это определило последующую судьбу СИ на США. Тогда довольно легко предпринимались довольно сложные решения, нация была молода, мечтала отделить себя от Имперской Британии, и тянулась ко всему новому. Томас Джефферсон горел идеями и был решительный. А уже через год после этих событий он уже совершенно отошёл от должности госсекретаря и решил побороться за кресло следующего президента США. В общем, теперь мысли экс-госскретаря занимали проблемы совсем иного уровня. Более интересные, важные и ответственными, так что времени на всякую мелочь не хватало. Метры? Килограммы? У меня здесь куча соперников, которым надо бы отомстить. На его место пришёл Эдмунд Рэндольф со своим ведением важности и приоритизации проблем государства. Проще говоря — вот лично Эдмунду на стандартизацию единиц измерения было совершенно пофиг.
,История,Метрическая система,США,страны,пираты,президенты,галлон на унцию в кубическом ярде,Массаракш наизнанку,Реактор познавательный
Привет, я Эдмунд и мне совершенно пофиг. 
Поэтому следующая французская делегация, которая решила поинтересоваться на тему: «Как насчёт приобрести у нас классную метрическую систему, лучшую в мире», получила отказ. Там как раз во Франко-Американских отношениях наступила прохлада и это было в какой-то степени политическим решением. Вскоре во Франции к власти пришёл Наполеон и США вообще поставили крест на метрической системе. Лягушатникам бы там у себя метр удержать, а не вернуться ко всяким лье и бушелям с этим корсиканским чудовищем. Для самоуспокоения тогдашний госсекретарь Джон Квинси в 1821 году провёл инспекцию в этом аспекте и решил, что и наша система — хороша и понятна большинству, нечего нам прививать все эти западны... блин, восточные ценности. Наша U.S. Customary System (традиционная система США) самая Customary, идите нафиг. Но где-то после Гражданской войны американский истеблишмент вновь огляделся и понял, что большинство стран уже давным-давно перешли на метрическую систему. И у них всё хорошо работает. Торгуется, наука там развивается, какие-то диалоги налажены, а мы здесь как идиоты с ненавистной Англией тупим в одной комнате метроненавистников. 
United States
Arbitrary Retarded Rollercoaster
to a Foot
to a Yard
to a Milo
to a Pound
32
Fahrenheit
212
180
Arbitary scale at which water freezes ?
year
The Rest of the World
Logical Smooth Sailing
1000
to a to a to a to a Motto kilometre kilogram Tonne
0
Celsius	100
Согласитесь, что пост был бы не полон без этой картинки? 
Американцам оставалось только запрыгнуть на подножку последнего вагона. И с присущей им грацией они это... сделали. Да. В 1866 году Конгресс страны наконец-то постановил, что метрическая система является официальной для использования во всех контрактах, сделках и судебных процессах. Чтобы всем было проще, было объявлено, что ярд равен 0,914401 метра, а фунт как 0,4535924277 килограмма. Вооот, теперь-то заживём, правда? Всё реднеки быстро научится умножать свои ярды на эти легко запоминающиеся числа и будет просто отлично. Но вот только это всё совершенно не касалось жизни обывателей. Акт носил скорее рекомендательный характер, а не принудительный. Перейти могли те, кто очень хотел. Ну а таких, как вы понимаете было немного. Что не помешало США в 1890 (спустя практически сто лет после миссии Домби) наконец-то получить свои законные стандарты метра и килограмма. Но, люди их отвергли в моральном плане. 
Что не мешает правительству США заявлять, что мы еще не начинали, и все идет по плану. Вот, смотрите у нас есть области где 100% метрические единицы. Секунды, например.
И всё это получилось потому, что существовали две проблемы. Первая — деньги. Выяснилось, что в масштабе страны на это нужны просто олимпиарды долларов. В одну из последних попыток внедрения метрических единиц NASA ради интереса выяснила, сколько будет стоить перевести на систему документацию, программное обеспечение и чертежи шаттла. После этого они схватились за голову: выходило примерно 370 миллионов долларов. Для сравнения — стоимость запуска этого шаттла на орбиту — 760 миллионов. Немного дороговато, получалось. Вторая — упорство жителей. В той же Франции между внедрением метрической системы и её полным принятием населением прошло в районе сорока лет. Да и то, там законы были более жёсткими. А в США 23 декабря 1975 года президентом Джеральдом Р. Фордом подписан очередной закон о переходе на метрическую систему... и всё. Никаких установленных временных рамок, минимум требований. Люди сами должны выбирать, как мерить. У нас свободная страна, знаете ли. Мы вот даже Метрическую комиссию создадим. Пусть они... ну не знаю, попытаются всех убедить в полезности. Комиссия не смогла и в 1982 году её упразднили.
yjiw—
metric system is like being raised wun a nai IIC\> UII y\JUi brain.
In metric, one milliliter of water occupies one cubic centimeter, weighs one gram, and requires one calorie of energy to heat up by one degree centigrade—which is 1 percent of the difference between its freezing point and
И еще одна популярная картинка (цитата из книги «Wild Thing» Джоша Бейзела). 
В 1988 году США ещё раз попытались в метры. И даже демонстративно постучали кулачком по столу, сказав, что метрическая система — предпочтительна для нужд торговли и коммерции. Но всё это коснулось лишь государственных структур. Бизнес опять не удалось заинтересовать лёгкостью расчётов и конвертации. Да, в школах вроде как учат детей СИ, но они потом приходят домой и опять галлоны и дюймы. Всё это вылетает из головы. По статистике в США на эту систему рассчитано всего лишь 30% продукции. Ну и фармацевтика. Единственная индустрия в стране, где царит строгая метричность. Над всем остальным довлеет имперская... в смысле традиционная система США. Вы вообще в курсе, что в этой стране используется 300 различных единиц в разнообразных областях науки и техники? Вот вам список, ознакомьтесь. После того как в 1995 году официально Англия перешла на метры, США заявила, что теперь дело не в деньгах, а в традиции, и присвоили себе все старые единицы измерения. Мол, мы тут власть и пусть остальной мир прогибается под нас. Консерватизм и патриотизм. Пожалуй, стоит признать, что именно эти причины не дают американцам войти в общемировую систему на равных. Ну и, конечно же, пираты… 
,История,Метрическая система,США,страны,пираты,президенты,галлон на унцию в кубическом ярде,Массаракш наизнанку,Реактор познавательный
Только представьте, как выглядел бы мир сейчас, если бы не пираты.
винда после обновления изобилует новыми возможностями
Как вы хотите открыть это?
Использовать это приложение
Microsoft Edge
Расширьте свои возможности в Интернете благодаря новому браузеру от Майкрософт.
Другие варианты
Microsoft Edge Beta
Новое
Microsoft Edge
Скачайте "Microsoft Edge" из Microsoft Store
□ Всегда использовать это приложение

Суть проблемы, не загружается винда с SSD

Почему то при отключённых остальных дисках, не загружается с SSD, выдаёт An operating system wasn't found. Ttry disconnecting any drives that don't contain an operating system. Press Ctrl+ Alt+Del to restart. хотя ssd в биосе есть и винда на нём стоит,тут ещё статусы "система, активен" почему то не на ссд в общем я уже и не знаю, что делать.
КУПОН
НА 1 помощь,пидоры помогите,реактор помоги,hdd,SSD,разделы,Windows 10,Windows,Операционная система

Мать убитой аспирантки приехала в Петербург. Здесь ее встретили полицейские, они коллеги

Мать убитой аспирантки приехала в Петербург. Здесь ее встретили полицейские, они коллеги
10.11.2019 10:56 9
Подполковник МВД Галина Ещенко приехала в Северную столицу, где накануне в Мойке доцент СПбГУ Олег Соколов пытался избавиться от останков тела ее дочери.

По информации «Фонтанки», 49-летняя Галина Ещенко прибыла в Петербург утром 10 ноября. Ее встретили сотрудники ГУ МВД по Петербургу и области. Они оказывают ей всю необходимую помощь – обеспечили место проживания, транспорт. Также рядом с ней находится психолог полицейского главка.

В полиции Калининского района Краснодарского края Галина Ещенко служит с 2005 года, до этого имела опыт работы школьным учителем и психологом, вторую специальность она применяла и в структуре МВД. На должность помощника начальника отдела, ответственного за работу с личным составом, была назначена год назад.
Источник https://m.fontanka.ru/2019/11/10/014/
Мои соболезнования, но пусть винит не меньше свою систему, которая когда-то решила не заводить уголовное дело на этого урода. От безнаказанности люди начинают творить беспредел, так было и будет

Вот вам и windows 11...

ОСдев №10: основной загрузчик, часть 3. GDT.

Подготовительный этап закончен, можно приступать к интересному. Кроме собственно загрузки файлов наша программа должна подготовить для ОС рабочую среду. Это значит: переключить процессор в 32/64-битный режим, настроить таблицу прерываний и создать базовую GDT. Сегодня разберёмся с последним пунктом.
GDT - сокращение от Global Descriptor Table, глобальной таблицы дескрипторов. Что это такое? По сути - набор записей одинакового формата, описывающих области памяти и разрешения, которые они имеют. Упрощённо это выглядит так:
//область 0
адрес области
размер области
параметры доступа
флаги
//область 1
адрес области
размер области
параметры доступа
флаги
...
В 32/64-битном режиме дескрипторные таблицы используются вместо старой схемы адресации сегмент:смещение. Зачем? Сегмент:смещение - небезопасная технология, которая позволяет переписать любой участок памяти. Надо ли говорить, что при неосторожном обращении это легко может закончиться бедой? Дескрипторная таблица даёт возможность ограничить запись или выполнение кода в отдельных областях RAM. Дескрипторные таблицы появились как часть аппаратной защиты памяти вместе с 286 процессором.
Как это работает? После выхода из 16-битного режима процессор больше не принимает адреса в формате сегмент:смещение. Если попытаетесь так сделать - получите исключение GPT (General Protection Fault). Вместо этого в сегментном регистре процессор ожидает получить смещение дескриптора внутри ДТ. При этом для операций над этим сегментом будут действовать правила, указанные в дескрипторе. Например, попытка обратиться к памяти за пределами сегмента или запись в защищённый от записи сегмент будут вызывать исключения (кстати, про обработку исключений поговорим позже, пока давайте примем, что это фатальная ошибка, которая приведёт к остановке программы).
Кроме глобальной таблицы дескрипторов существуют ещё локальные (ЛДТ), TSS и таблицы дескрипторов прерываний (IDT). Для того, чтобы наша ОС могла начать работу, обязательно наличие только двух таблиц: GDT и IDT. Давайте теперь взглянем на GDT поподробнее. Скажу сразу, зрелище будет не очень приятное. Но начнём с лёгкого. Так как GDT - часть аппаратной схемы защиты памяти, у неё есть свой регистр: GDTR. Это 48-битный регистр, 4 байта которого предназначены для смещения GDT, а 2 - для её размера. Таким образом, GDT не может быть больше 65536 байтов в размере. Размер записи в GDT - 8 байтов, значит,< таблица может иметь максимум 8192 дескриптора. Зная всё это, хорошим тоном было бы сразу зарезервировать 64К под GDT, но в моей архитектуре ОС создаёт свои таблицы, так что сейчас я обойдусь минимумом. Минимум в данном случае - 3 дескриптора. Нулевой, сегмент кода и сегмент данных. Зачем отдельно выделять нулевой дескриптор? Дело в том, что обращение к нему в GDT приводит к, вы угадали, исключению. Это тоже своего рода мера предосторожности.
А теперь время взглянуть на структуру дескриптора. И тут, увы, наследие тяжёлого прошлого во всей красе. Ради обратной совместимости в кодом для старых процессоров дескриптор GDT превратили в кашу.
Первые два байта - это первые 16 битов границы сегмента.
Следующие три байта - первые 24 бита основания сегмента.
Следующий байт - параметры доступа. Рассмотрим ниже.
Следующий байт совмещает в себе биты 16-19 границы и флаги. Об этом тоже подробнее ниже.
Ну и последний байт - биты 24-31 основания.
Неудобно? Не то слово. Когда будем писать ядро - обязательно замутим процедуру для комфортной работы с этим месивом. К счастью, сейчас у нас статичная структура всего из трёх сегментов, так что заполнить можно и вручную. Создадим и подключим модуль GDT.inc. Как это сделать, мы рассматривали в прошлый раз. И добавим в него вот такую таблицу:

Это и есть наша GDT, ничего ужасного. Значения в нулевом дескрипторе для нас не важны, а вот остальные давайте рассмотрим подробнее. У нас есть два дескриптора: один - для кода, другой - для данных. Оба начинаются с 0 и занимают FFFFF*4Kib = 4Gib. Фактически это значит, что, начав работать, ОС сможет использовать всю память по своему усмотрению. Давайте теперь разберём параметры доступа и флаги.
Бит 1 - флаг чтения/записи. Его значение различается для сегментов кода и данных.
Для сегментов кода установленный флаг означает, что чтение разрешено.
Запись в сегменты кода запрещена всегда.
Для сегментов данных установленный флаг означает, что разрешена запись. Чтение из сегментов данных
Таким образом, значение параметров доступа 10010010b даёт нам вот что: это сегмент данных, запись в него разрешена, сегмент растёт вверх, уровень привилегий - ring0. А теперь флаги. Биты 0-3 здесь заняты границей сегмента, не обращаем на них внимания.
Бит 4 зарезервирован и должен быть равен 0.
Бит 5 указывает на 64-битный сегмент. Так как мы пока переходим в 32-битный, должен быть равен 0.
Бит 6 указывает на 32-битный сегмент. Наш выбор, устанавливаем в 1.
Бит 7 - гранулярность. Если равен 0, то значение границы сегмента используется как
Окей, теперь у нас есть GDT. Но как указать системе, что её нужно использовать? Процессор ведь не дурак, сам искать не станет. Всё просто, джентльмены из IBM в кои-то веки о нас позаботились. При помощи специальной ассемблерной команды lgdt (load GDT) мы можем передать в регистр GDTR линейный адрес таблицы и её размер. Для этого добавим перед GDT такую структуру:
60ТК_р1:г:
dы 00171п	;Размер таблицы - 1 (23 байта).
dd 00000000И	;Абсолютный адрес таблицы.,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,OSDev,Операционная система,ассемблер,разработка,длиннопост
Размер таблицы мы уже знаем, а вот адрес придётся посчитать, так что пока оставим 0 и напишем процедуру инициализации GDT:
init_GDT ргос
init_GDT endp
push eax pushfd
xor eax,eax
mov ax,offset GDT
add eax,00000500h
mov dword ptr [GDTR_ptr+2],eax
cli
lgdt pword ptr GDTR_ptr sti
popfd pop eax ret,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,OSDev,Операционная система,ассемблер
На случай, если тут не всё очевидно, поясню. Мы помещаем в EAX смещение GDT относительно сегмента, а потом добавляем адрес сегмента*16. Это и есть линейный адрес, сохраняем его в структуре. После этого отключаем прерывания, передаём структуру процессору командой lgdt и включаем прерывания обратно. По идее прерывания можно не трогать, так как в 16-битном режиме GDT не используется, но я перестраховщик.
Собственно, на этом всё. Добавьте вызов init_GDT в конец загрузчика перед cli и дело в шляпе. Сегодня без картинки, но вот вам котик.
Чистая дискета: https://drive.google.com/file/d/1Bold4ds8oEruHQ7fJZKHglVo7A2Vc5MR/view?
Предыдущие части:

Мир сходит с ума... майнеры, чиа, хернива, дебилива...

Занимаюсь монтажом видеонаблюдения, сегодня звонит очередной заказчик, я готовлю смету, дохожу до покупки жесткого диска... ну вы поняли, какие эмоции на меня нахлынули...
Две недели назад, я покупал этот диск за 14 499 руб., а с восьмерками у меня вообще глаза выпали _
Если мне память не изменяет, он был в районе 23 000 рублей.

Теперь один винт стоит как вся система видеонаблюдения.

Отличный комментарий!

Ёбаные уроды.
Ну были же концепции распределённых вычислений, используемых в глобальных проектах для чего-то полезного, начиная с поиска внеземного разума и заканчивая расчётами для медиков.
И даже какие-то "коины" очередные к этому пытались привязать.

Хуйтам.
Давайте сжигать железо и электричество ради сжигания железа и электричества, побочный эффект - циферки, которые даже рядом не являются валютой, ног которые можно продать на бирже.
Скоты ёбаные.

Полиции разрешат читать любую переписку граждан без санкции суда

На сегодняшний день уже есть законы принуждающие провайдеров:
- Хранить записи телефонных разговоров
- Хранить ПД на серверах внутри РФ
,политика,политические новости, шутки и мемы,песочница политоты,Россия,страны,закон,система,надзор,Большой Брат,пиздец
Тепрь на подходе то ради чего все затевалось:

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

С инициативой по расширению полномочий сотрудников МВД выступило Министерство цифрового развития. Ведомство считает необходимым закрепить в законе возможность проведения его сотрудниками нового вида оперативно-разыскного мероприятия — «исследование компьютерной информации». Под этим действием полицейские понимают доступ к голосовой информации, текстовым сообщениям, прочим изображениям, видео или иным сообщениям пользователей, независимо от средств их хранения, обработки и передачи.
Это лишь вопрос времени когда репрессивная машина возьмет на вооружение биг дата и дип лёрнинг, подобно тому как бизнес проводит таргетирование ЦА, но разумеется вовсе не для релевантной рекламы, а для релевантного просчета наклонностей - в том числе экстремистских, подрывных, неблагонадежных. 90-ые позади, впереди 37-ой.
В случае внесения разработанных поправок в закон «О связи» интернет-провайдеры и прочие владельцы физических и облачных серверов будут обязаны предоставить интересующую оперативных сотрудников информацию на основании просто вынесенного ими же постановления, а это позволит правоохранителям иметь неограниченные возможности по изучению всей информации, хранящейся на серверах, включая и переписку в соцсетях, чатах, мессенджерах и т. д.
Пока разработанный проект не предусматривает никакого вневедомственного контроля, а значит, предлагаемая система слежки за перепиской и разговорами граждан непрозрачна - те, кто призван бороться с преступностью, ответственности за ненадлежащее или халатное отношение к полученной в результате оперативной деятельности информации в предлагаемых поправках нет.

https://news.mail.ru/politics/46684245/

Урок ОСдева №5: подготовка к работе с файловой системой FAT12.

В прошлый раз мы инициализировали сегментные регистры и обеспечили загрузчику безопасную среду
обитания. Сегодня будем готовить почву для работы с файловой системой FAT12. Для начала стоит
поподробнее ознакомиться с её структурой. В FAT12 пространство носителя можно разделить на
несколько областей. Они могут быть разного размера, но идут всегда в следующем порядке:

ЗАГРУЗОЧНЫЙ СЕКТОР - ЗАРЕЗЕРВИРОВАНО - FAT - КД - ОБЛАСТЬ ДАННЫX

Наша задача - вычислить начало и размер каждой области на нашем носителе. Эта информация понадобится
для загрузки файлов. Важный момент: при работе с контроллером флоппи-привода мы оперируем секторами,
а не байтами. То есть, когда я пишу "размер", я имею в виду количество секторов, занятыx
областью.

Загрузочный сектор - место, где обитает наша программа. Это всегда сектор
номер 1 на носителе, и занимает он ровно 1 сектор. Было несложно.

Далее, зарезервированныx секторов у нас нет. Вернее, есть один, загрузочный. Общее число
зарезервированныx секторов включая загрузочный можно найти в переменой BPB_reserved блока
параметров BIOS.

FAT, таблица распределения файлов. Будет чуть сложнее. Размер FAT в секторах xранится в переменной
BPB_FATsize. Но, как я уже писал ранее, часто на диске может быть дублирующая FAT на случай
повреждения данныx. Количество FAT на диске указано в переменной BPB_numFATs. Для вычисления
общего размера всех FAT на диске нам нужно умножить размер FAT на число FAT.

Дальше у нас идёт корневая директория. Это набор записей о размещении файлов. Размер записи КД
в FAT12 - 32 байта. Количество записей указано в переменной BPB_RDentries. Берём размер записи
и умножаем на число записей. Всё? Нет. Так мы получим размер в байтах, его нужно перевести
в секторы. Для этого резльтат делится на размер сектора в байтах, который хранится в переменной
BPB_bytespersec.

Вот теперь всё. Вспомним, как выглядела программа в конце прошлого поста:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                    jmp short execute                    ;Точка входа. Перейти к исполняемой части.
                            nop                                         ;Пустой оператор. Заполняет 3-й байт перед BPB.



;БЛОК ПАРАМЕТРОВ BIOS======================================================================;

;=======================================;
;Блок параметров BIOS, 33 байта.;
;Здесь хранятся характеристики;
;носителя. Должен быть в 3 байтах;
;от начала загрузочного сектора.;
;=======================================;
          BPB_OEMname db 'BOOTDISK'          ;0-7. Имя производителя. Может быть любым.
          BPB_bytespersec dw 512                  ;8-9. Размер сектора в байтаx.
          BPB_secperclust db 1                        ;10. Количество секторов в кластере.
          BPB_reserved dw 1                          ;11-12. Число зарезервированныx секторов (1, загрузочный).
          BPB_numFATs db 2                          ;13. Число FAT.
          BPB_RDentries dw 224                     ;14-15. Число записей Корневой Директории.
          BPB_sectotal dw 2880                      ;16-17. Всего секторов на носителе.
          BPB_mediatype db 0F0h                   ;18. Тип носителя. 0F0 - 3,5-дюймовая дискета с 18 секторами в дорожке.
          BPB_FATsize dw 9                           ;19-20. Размер FAT в сектораx.
          BPB_secpertrack dw 18                    ;21-22. Число секторов в дорожке.
          BPB_numheads dw 2                        ;23-24. Число головок (поверxностей).
          BPB_hiddensec dd 0                        ;25-28. Число скрытыx секторов перед загрузочным.
          BPB_sectotal32 dd 0                        ;29-32. Число секторов, если иx больше 65535.

;===============================================;
;Расширенный блок параметров BIOS, 26 байт.;
;Этот раздел используется в DOS 4.0.;
;===============================================;
          EBPB_drivenumdb 0                         ;0. Номер привода.
          EBPB_NTflagsdb 0;1. Флаги в Windows NT. Бит 0 - флаг необxодимости проверки диска. Бит 1 - флаг необходимости диагностики поверхности.
          EBPB_extsigndb 29h;2. Признак расшренного BPB по версии DOS 4.0.
          EBPB_volIDdd 0;3-6. "Серийный номер". Любое случайное число или ноль, без разницы.
          EBPB_vollabeldb 'BOOTLOADER ';7-17. Название диска. Устарело.
          EBPB_filesysdb 'FAT12   ';18-25. Имя файловой системы.



;ИСПОЛНЯЕМЫЙ БЛОК========================================================================;

;Шаг 1. Исправить значения сегментных регистров.
execute:
         ;DS, ES, FS, GS.
                   mov ax,07C0h                    ;Сегмент загрузчика.
                   mov ds,ax                          ;Поместить это значение во все сегментные регистры.
                   mov es,ax
                   mov fs,ax
                   mov gs,ax

          ;СЕГМЕНТ СТЕКА.
                   cli                                      ;Запретить прерывания перед переносом стека.
                   mov ss,ax                           ;Поместить в SS адрес сегмента загрузчика.
                   mov sp,0FFFFh                   ;Указатель стека - на конец сегмента.
                   sti                                      ;Разрешить прерывания.

          ;СЕГМЕНТ КОДА.
                   push ax                              ;Поместить в стек сегмент.
                   mov ax,offset stop               ;Указатель на инструкцию после retf.
                   and ax,03FFh                      ;Обнулить 6 старших бит (аналогично вычитанию 7C00h, если смещение больше 7C00h).
                   push ax                              ;Поместить в стек смещение.
                   retf                                    ;Дальний возврат для смены CS.

stop:            cli
                   hlt

          org 1FEh;Заполняет память нулями до 511-го байта.
          dw 0AA55h;Байты 511 и 512. Признак загрузочного сектора.

CSEG ends
end begin


Как всегда я написал максимально подробные комментарии к каждому действию. Теперь после retf добавьте
следующий код вместо cli и hlt:

stop:           mov byte ptr EBPB_drivenum,dl

                  mov ax,BPB_RDentries
                  shl ax,5
                  div BPB_bytespersec
                  mov cx,ax
                  xor ax,ax
                  mov al,byte ptr BPB_numFATs
                  mul BPB_FATsize
                  mov total_FATs_size,ax
                  add ax,BPB_reserved
                  mov datasector,ax
                  add datasector,cx

                  cli
                  hlt


Давайте разбираться. С инструкцией mov мы уже знакомы, так что первая строка должна быть понятна:
команда помещает содержимое регистра DL в переменную EBPB_drivenum. Но что за byte ptr?
Это префикс смены разрядности. Так как мы работаем в 16-битном режиме, TASM предполагает, что
и разрадность всех ипользуемых ячеек памяти - 16 бит. Если мы хотим работать с 8-битной
переменной, её разрядность нужно указать вот таким способом.

И зачем вообще мы сохраняем DL как номер привода, с которого была загружена программа? Дело в
том, что по идее BIOS должна вернуть его в DL. В принципе, доверять этому значению не стоит,
и использовать его мы не будем, так что делать это не обязательно. Просто я педант.

Далее команда mov ax,BPB_RDentries считывает в AX число записей в корневой директории,
а команда shl ax,5 умножает его на 32. Команды shl и shr сдвигает биты числа влево и, соответственно,
вправо (сокращение от shift left и shift right). Сдвиг числа влево на 1 эквивалентен умножению
на 2. Сдвиг на 5 эквивалентен умножению на 32. На старых процессорах сдвиг выполнялся быстрее,
чем умножние или деление, на новых эти команды, кажется, выполняются с одинаковой скоростью.

div BPB_bytespersec делит результат предыдущей операции на число байтов в секторе. Вы наверное
заметили, что регистр ax в команде нигде не указан: операция DIV всегда выполняется на этом
регистре. В результате деления мы получаем чсло секторов, которые занимает КД. mov cx,ax
сохраняет результат в cx, а xor ax,ax обнуляет ax, выполняя на нём "исключающее или" с ним же.

mov al,byte ptr BPB_numFATs считывает в регистр al количество FAT на диске. Кстати! Регистров
al и dl не было в списке, который я приводил на прошлом уроке. Сейчас поясню.
Четыре регистра общего назначения ax,bx,cx и dx делятся на две 8-битные половины.
ax на al и ah, bx на bl и bh, ... l в данном слуае значит low, то есть младшие 8 бит.
h, соответственно, старшие high. Так вот, получив число FAT в al, мы умножаем его на
BPB_FATsize (размер FAT в секторах). Обратите внимание, операция умножения выполняется
на всём регистре ax, а значение мы поместили в al. Для этого мы и обнуляли ax операцией
раньше. Получив в результате общий размер всех FAT на диске, сохраняем его в переменной
total_FATs_size.

Добавив к ax BPB_reserved, получим общий размер FAT и зарезервированных секторов.
Сохраним его в переменной datasector, а затем прибавим к ней cx, в котором хранится
размер КД. Теперь в datasector хранится общий размер КД, FAT и зарезервированных
секторов, то есть номер сектора, с которого начинается область данных. Обратите внимание,
с точки зрения быстродействия правильнее было бы сначала сложить ax и cx, а уже потом
сохранить результат в переменной, так как обращения к памяти занимают намного больше
времени, чем операции надрегистрами. Зачем я сделал именно так, станет понятно в
следующий раз. А на сегодня всё! Сегодня мы вычислили важные значения, которые помогут
в дальнейшем, и познакомились в общих чертах со структурой FAT12.

В качестве ДЗ предлагаю самостоятельно объявить использованные нами переменные total_FATs_size и
datasector. Обе 16-битного формата. Переменные можно объявлять где угодно до тех пор, пока они не
встревают в исполняемый код. Например, можно вставить между dw 0AA55h и CSEG ends

Урок ОСдева №8: основной загрузчик, вводная.

Дисклеймер: эта серия постов не про UEFI. Это не значит, что я не знаю о существовании UEFI.
Про UEFI будет отдельная серия постов. Почему я не пишу про UEFI прямо сейчас? Потому что
UEFI - это уровень абстракции над железом, а мне интересно именно железо и работа с ним.

Итак, мы закончили писать первичный загрузчик. Что дальше? Дальше - немного пугающая
свобода. Если в случае ПЗ ограничения на объём памяти ставят разработчика в жёсткие рамки
и ограничивают полёт фантазии, то теперь вы можете строить архитектуру программы
по своему усмотрению и добавлять фичи сколько душа пожелает. Те решения, которые принял
я, могут быть не самыми разумными и правильными. Не буду вам их навязывать. Считаете,
что сможете сделать лучше - пробуйте. В любом случае стоит держать в голове минимальный
набор задач, который должен будет выполнять ваш загрузчик:

- Переключать процессор из 16-битного в 32-битный или 64-битный режим.
- Включать доступ к расширенной памяти.
- Составлять карту RAM и передавать её ОС.
- Минимально взаимодействовать с устройствами ввода-вывода, чтобы показать сообщение об ошибке
или принять ввод пользователя.
- Находить, считывать и обрабатывать файл конфигурации (опционально, делает загрузчик более гибким).
- Находить на диске и загружать в указанную область памяти ядро ОС.
- Находить на диске и загружать в указанные области памяти дополнительные файлы (опционально).
- Предоставлять ОС базовую GDT (об этом позже).

Важный момент: рано или поздно перед вами встанет вопрос совмещения в одной программе
16-битного и 32-битного (или 64-битного) кода. Лично я предпочёл с этим не заморачиваться и
разбил загрузчик на отдельные файлы. Тем более, что это соответствует любимой мной аккуратной
модульной структуре. Если вы всё-таки хотите запихать весь код в один файл, стоит заранее
выбрать ассемблер, который это поддерживает.

Ещё один важный момент: достоверное определение аппаратных ресурсов может быть (было до
появления UEFI - вставят тут апологеты) сложной задачей. Там, где это можно сделать
простым способом - я буду использовать его. Там, где для этого нужно будет полагаться
на технологии, рассказ о которых выйдет слишком объёмным для одного-двух постов (ACPI, UEFI) -
пока я буду заявлять наличие устройства как обязательное. Например, для работы ОС на этом
этапе будет обязательно наличие VGA-совместимых видеокарты и дисплея.

На этом вступление закончено и можно начинать писать. 16-битный модуль загрузчика будет
в некоторых местах повторять первичный. Такие участки кода я буду давать без объяснений.
Ну и - этот пост можно назвать вводным в новый этап программы, так что кода будет
немного. Поехали.Если вы вместе со мной писали ПЗ, то сейчас, запустив машину, получите вот такое
сообщение:

Plex86/Bochs UGABios (PCI) 0.7b 03 Jan 2020 This UGA/UBE Bios is released under the GNU LGPL
Please visit :
. http://bochs.sourceforge.net . http //www.nongnu.org/vgab ios
Bochs UBE Display Adapter enabled
Bochs 2.6.10.svn BIOS - build: 01/05/20
^Revision: 13752 $ $Date: 2019-12-30 14:16:18

Создайте в папке boot папку stage2, а в ней - текстовый файл loader.asm. Заголовок и конец
модуля выглядят почти идентично ПЗ:

.386p
CSEG segment use16
ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG
LOCALS @@

begin:

CSEG ends
end begin

Добавилась только директива LOCALS @@. В TASM эта команда разрешает использование локальных
меток. Начинающаяся с символов @@ метка или переменная будет работать только в границах
процедуры или модуля, в котором прописана. Это позволит нам создавать в разных местах
переменные и указатели с одинаковыми именами. Вы оцените полезность фичи, когда начнёте писать
большие программы. Идём дальше. Первое, что нам нужно сделать - это установить значения
сегментных регистров. Совсем как в ПЗ, изменилось только значение. Если помните, loader.bin
у нас был загружен в 0050h:0000h. Выглядит так:

begin:
     ;DS, ES, FS, GS.
          mov ax,0050h     ;Сегмент загрузчика.
          mov ds,ax     ;Поместить это значение во все сегментные регистры.
          mov es,ax
          mov fs,ax
          mov gs,ax

     ;СЕГМЕНТ СТЕКА.
          cli     ;Запретить прерывания перед переносом стека.
          mov ss,ax     ;Поместить в SS адрес сегмента загрузчика.
          mov sp,0FFFFh     ;Указатель стека - на конец сегмента.
          sti     ;Разрешить прерывания.

          cli
          hlt

Регистр CS мы не трогаем, так как его значение было корректно установлено ПЗ. Для комфортной
работы нам понадобится информация из блока параметров BIOS. Мы знаем, что он был загружен в
память вместе с ПЗ, поэтому обращаться к диску нужды нет. Собственно, я мог бы просто
скопировать всю структуру вместе со значениями из него, но это не кажется мне правильным.
Будет лучше считать структуру из RAM. Для этого нам понадобится неинициализированный
дубликат BPB и процедура, которая его заполнит. Добавьте эти переменные в конец модуля:

;=======================================;
;Блок параметров BIOS, 33 байта.;
;Здесь хранятся характеристики;
;носителя.;
;=======================================;
BPB:BPB_OEMnamedb ?,?,?,?,?,?,?,?     ;0-7. Имя производителя. Может быть любым.
BPB_bytespersecdw ?     ;8-9. Размер сектора в байтаx.
BPB_secperclustdb ?     ;10. Количество секторов в кластере.
BPB_reserveddw ?     ;11-12. Число зарезервированныx секторов (1, загрузочный).
BPB_numFATsdb ?     ;13. Число FAT.
BPB_RDentriesdw ?     ;14-15. Число записей Корневой Директории.
BPB_sectotaldw ?     ;16-17. Всего секторов на носителе.
BPB_mediatypedb ?     ;18. Тип носителя. 0F0 - 3,5-дюймовая дискета с 18 секторами в дорожке.
BPB_FATsizedw ?     ;19-20. Размер FAT в сектораx.
BPB_secpertrackdw ?     ;21-22. Число секторов в дорожке.
BPB_numheadsdw ?     ;23-24. Число головок (поверxностей).
BPB_hiddensecdd ?     ;25-28. Число скрытыx секторов перед загрузочным.
BPB_sectotal32dd ?     ;29-32. Число секторов, если иx больше 65535.

;===============================================;
;Расширенный блок параметров BIOS, 26 байт.;
;Этот раздел используется в DOS 4.0.;
;===============================================;
EBPB_drivenumdb ?     ;0. Номер привода.
EBPB_NTflagsdb ?     ;1. Флаги в Windows NT. Бит 0 - флаг необxодимости проверки диска. Бит 1 - флаг необходимости диагностики ;поверхности.
EBPB_extsigndb ?     ;2. Признак расшренного BPB по версии DOS 4.0.
EBPB_volIDdd ?     ;3-6. "Серийный номер". Любое случайное число или ноль, без разницы.
EBPB_vollabeldb ?,?,?,?,?,?,?,?,?,?,?     ;7-17. Название диска. Устарело.
EBPB_filesysdb ?,?,?,?,?,?,?,?     ;18-25. Имя файловой системы.
db ?     ;Еще один байт для того, чтобы структура занимала 15 32-битных слов.

Как видите, в этом варианте переменным не присвоены значения. Кроме того, в конце
зарезервирован ещё один байт. Он нужен для того, чтобы размер таблицы делился на 4
и её можно было загрузить как последовательность 32-битных слов, не перетерев
ничего лишнего. Теперь нужна процедура.

read_BPB proc
     push cx     ;Сохранить регистры.
     push di
     push si
     push ds

     push 07C0h
     pop ds     ;DS=07C0h, сегмент первичного загрузчика.
     mov si,3     ;SI=смещение BPB в ПЗ.
     mov di,offset BPB     ;DI=смещение BPB в loader.bin
     mov cx,15     ;CX=счётчик для копирования.
     rep movsd     ;Скопировать 15 32-битных слов, размер BPB+1 байт.

     pop ds     ;Восстановить регистры.
     pop si
     pop di
     pop cx
     ret     ;Завершить процедуру.
read_BPB endp

Тут в общем всё просто. Устанавливаем пару регистров DS:SI на начало BPB в первичном загрузчике,
а ES:DI - на нашу неинициализированную структуру. Потом командой rep movsd копируем всю
конструкцию + 1 байт. Вызовите процедуру инструкцией call после установки сегмента стека -
и готово. Кстати, вопрос знатокам: что быстрее выполнит 32-битный процессор в 16-битном
режиме - копирование 15 32-битных слов или 30 16-битных?

На этом пока всё. Сделайте новый батч файл с примерно таким текстом, чтобы не возиться
с инструкциями вручную:

tasm project\boot\stage2\loader.asm
tlink loader.obj
exe2bin loader.exe

Слинкуйте файл, закиньте на дискету - и готово. Сообщение о том, что loader.bin
не найден, должно пропасть. В следующий раз - установка видеорежима и методы вывода
текста.

Ссылка на полный полный текст модуля: https://drive.google.com/file/d/1rFc3OcEDmf7Rs_hEJ6iX98-1SimN_dx_/view?usp=sharing

Здесь мы собираем самые интересные картинки, арты, комиксы, мемасики по теме структура системи (+1000 постов - структура системи)