гик

гик

Прикольные гаджеты. Научный, инженерный и айтишный юмор Подписчиков: 5105     Сообщений: 17044     Рейтинг постов: 190,960.2

программирование geek ассемблер Операционная система разработка OSDev песочница 

Уроки ОСдева №3: блок параметров BIOS

В прошлый раз мы разобрались с физической геометрией дискеты и расположением данных. Кроме того, мы узнали, как записать программу-загрузчик в нулевой сектор носителя. Если кто-то из вас действительно пытался повторить мои действия и потом использовать дискету как загрузочную, то наверняка обнаружил два неприятных момента:


1. При попытке открыть образ дискеты Wndows говорит, что она не отформатирована.
2. BIOS не воспринимает дискету как загрузочную и пишет что-нибудь вроде "no bootable device found".

Давайте разбираться. Если помните, в конце прошлого поста наша будущая программа-загрузчик выглядела так:

.386p

CSEG segment use16

ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                    cli

                             hlt

CSEG ends

end begin


По сути это просто заглушка, которая при запуске должна останавливать процессор. Причина ругани Виндоус в том, что в нулевом секторе на отформатированном носителе хранится важная структура данных - блок параметров BIOS (BPB). Записав туда же нашу программу, мы его пот+ёрли. Для того, чтобы этого избежать, нам придётся воссоздать BPB в тексте программы. Для этого нужно знать геометрию носителя. К счастью, в наше время сохранился только один тип дискет.


Непроверенный метод: возможно, если с помощью утилиты debug записать программу не в начало сектора, а со смещением, достаточным, чтобы пропустить оригинальный BPB, то он не пострадает, но я не проверял. По-моему, debug всё равно забьёт остатки сектора каким-то мусором.


Во-первых, измените программу вот так:


.386p

CSEG segment use16

ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                     jmp short execute

                             nop

execute:                 cli

                             hlt

CSEG ends

end begin


У нас появились две новые инструкции: jmp short и nop. Последняя - просто пустой оператор. Процессор пропускает его, не выполняя никаких действий. Занимает 1 байт. jmp - инструкция перехода. jmp short - переход в пределах 127 байт от текущего положения. Исполняется гораздо быстрее jmp, так что везде где возможно - используйте его. Занимает 2 байта. execute - название метки, на которую указывает инструкция jmp short.


Зачем всё это и зачем nop? BPB должен располагаться строго в трёх байтах от начала нулевого сектора. Эти три байта и занимают инструкции jmp short execute и nop. Таким образом, когда программа начнёт исполняться, первой инструкцией, которую выполнит процессор, будет пропустить BPB. В противном случае он бы попытался исполнить его как код, что привело бы к катастрофе.

Теперь давайте вставим сам блок параметров BIOS между nop и меткой execute.


.386p

CSEG segment use16

ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                     jmp short execute

                             nop


                BPB_OEMname          db    'BOOTDISK'

                BPB_bytespersec       dw    512

                BPB_secperclust        db     1

                BPB_reserved            dw    1

                BPB_numFATs           db     2

                BPB_RDentries          dw    224

                BPB_sectotal             dw    2880

                BPB_mediatype         db     0F0h

                BPB_FATsize             dw     9

                BPB_secpertrack        dw     18

                BPB_numheads         dw     2

                BPB_hiddensec          dd     0

                BPB_sectotal32          dd     0

                EBPB_drivenum         db     0

                EBPB_NTflags            db     0

                EBPB_extsign            db     29h

                EBPB_volID               dd     0

                EBPB_vollabel            db     'BOOTLOADER '

                EBPB_filesys              db     'FAT12   '


execute:                 cli

                             hlt


CSEG ends

end begin


BPB - это блок данных, и здесь мы впервые объявляем переменные. В TASM это выглядит так: BPB_OEMname (имя) -пробел- db, dw, dd или dq -пробел- 'BOOTDISK' (значение). Имени может и не быть, но тогда к переменной нужно будет обращаться по смещению, это не очень удобно. DB, DW, DD и DQ - сокращение от define byte (word, double word или quad word) - обозначают размер переменной. Соответственно, 1, 2, 4 или 8 байт. Инстркция этого типа позволяют объявлять целые серии значений через запятую: myvalue dw 2, 5, 165, 776. С помощью инструкции db можно объявлять строки: mytext db 'Allo, Yoba!' Обратите внимание, что в плоском бинарнике переменные при компиляции не выносятся в какую-то специальную область данных. В исполняемом файле они будут именно там, где вы их объявили в тексте программы. Ещё важный момент: имена переменных только для вашего личного пользования, в исполняемый файл они не попадут, так что вы не обязаны копировать названия у меня. Теперь давайте посмотрим, что за информация хранится в BPB.


BPB_OEMname - 8 байт: по идее здесь должно быть название производителя, но по факту вы можете писать что угодно, никто на это значение не смотрит.

BPB_bytespersec - 2 байта: размер сектора в байтах, для дискет как правило 512.

BPB_secperclust - 1 байт: число секторов в кластере. Про кластеры мы поговорим позже, но в случае с дискетами секторы и кластеры соответствуют друг другу.

BPB_reserved - 2 байта: число зарезервированных секторов, недоступных файловой системе. В нашем случае такой один, это наш загрузочный сектор.

BPB_numFATs - 1 байт: количество FAT (file allocation table), таблиц распределения файлов. Так как носители информации (особенно дискеты) подвержены порче, а FAT - очень важная часть файловой системы, для неё часто делается резервная копия.

BPB_RDentries - 2 байта: количество записей в корневой директории (Root Directory). Про корневую директорию тоже будем говорить в другой раз, но пока можете представить её как список файлов с указанием их физического расположения на носителе.

BPB_sectotal - 2 байта: число секторов на диске, если их не больше 65535. Если больше, здесь должен быть 0.

BPB_mediatype - 1 байт: тип носителя. F0 - код для 3,5-дюймовой дискеты с 18 секторами в дорожке.

BPB_FATsize - 2 байта: размер одной FAT в секторах.

BPB_secpertrack - 2 байта: число секторов в дорожке.

BPB_numheads - 2 байта: число головок.

BPB_hiddensec - 4 байта: количество скрытых секторов перед загрузочным, в нашем случае 0.

BPB_sectotal32 - 4 байта: число секторов, если их больше 65535. Если меньше, здесь должен быть 0.


Здесь стандартный BIOS Parameter Block заканчивается и начинается расширенный, который появился в поздних версиях DOS.


EBPB_drivenum - 1 байт: бесполезная переменная, хранящая номер привода, в который был вставлен носитель при форматировании.

EBPB_NTflags - 1 байт: флаги Вин НТ. Если установлен бит 0, необходимо проверить носитель на битые секторы. Значения других флагов не знаю.

EBPB_extsign - 1 байт: признак расширенного BPB. Для нашей версии должно быть 29h.

EBPB_volID - 4 байта: случайный номер, который присваивается при форматировании. В общем бесполезен.

EBPB_vollabel - 11 байт: имя носителя.

EBPB_filesys - 8 байт: имя файловой системы.


Если вы теперь заново скомпилируете программу и запишите на дискету, то она отлично откроется в Windows. Первая проблема решена, но осталась вторая: дискета всё ещё не опознаётся как загрузочная. Вспоминаем: для этого последние 2 байта загрузочного сектора должны иметь значения AAh и 55h. Добавим ещё две строчки в нашу программу:


.386p

CSEG segment use16

ASSUME cs:CSEG, ds:CSEG, es:CSEG, fs:CSEG, gs:CSEG, ss:CSEG

begin:                     jmp short execute

                             nop


                BPB_OEMname          db    'BOOTDISK'

                BPB_bytespersec       dw    512

                BPB_secperclust        db     1

                BPB_reserved            dw    1

                BPB_numFATs           db     2

                BPB_RDentries          dw    224

                BPB_sectotal             dw    2880

                BPB_mediatype         db     0F0h

                BPB_FATsize             dw     9

                BPB_secpertrack        dw     18

                BPB_numheads         dw     2

                BPB_hiddensec          dd     0

                BPB_sectotal32          dd     0


                EBPB_drivenum         db     0

                EBPB_NTflags            db     0

                EBPB_extsign            db     29h

                EBPB_volID               dd     0

                EBPB_vollabel            db     'BOOTLOADER '

                EBPB_filesys              db     'FAT12   '


execute:                 cli

                             hlt


               org 510

                dw 0AA55h


CSEG ends

end begin


Команда org 510 заполнит нулями место от текущей позиции до 510 байта, а в последние два мы поместили метку загрузочного сектора. Вуаля, проблема 2 решена.


Выражалось мнение, что всё это ебучее легаси и современные пацаны предпочитают UEFI, но UEFI не даст вам того интимного, я бы сказал, понимания железа, на котором работает ваша ось, так что основная серия будет продолжена по старинке.


Нужны ли туторы по UEFI?
Да
88 (69.3%)
Нет
8 (6.3%)
Я не знаю, заебал свою гиковскую xуйню сюда постить, вали на гитxаб!
31 (24.4%)
Развернуть

арифмометр geek porn geek 

Работа автоматического арифмометра, который помнит Ленина

Ура! Ещё одна мечта реализована! Привёз из Германии и за неделю плотной работы починил первый в мире автоматический арифмометр, Mercedes Euklid VIII.

Его бесклавиатурная версия появилась ещё до первой мировой, а мой экземпляр 1922 года помнит Ленина!

Выпускалось это чудо до 1934 года, потом на его место пришли новые модели, похожие по функциональности, но более эргономичные. Потому что у Mercedes Euklid VIII эргономика чудовищная: например, в 1931 году на Rheinmetall SASL, как и на современном калькуляторе, для запуска деления надо было нажать одну кнопку, а здесь - установить положение 7 (семи!) рычагов!Но работает ведь!

Развернуть

geek песочница видео 

Развернуть

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

Violator Violator10.11.201900:36ссылка
+37.7

geek stackoverflow 

Наконец-то дошла кружка со StackOverflow за победу в конкурсе историй

Теперь можно понтоваться перед коллегами на работе и получиться пассивку +10 к уважению

geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,stackoverflow

geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,stackoverflow

Сам конкурс

Развернуть

geek lolnein Комиксы 

ОН МЕНЯ ЬЬЕХ — ЗНАЧИТ ЛЮБИТ
LOLNEIN.com,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,lolnein,Смешные комиксы,веб-комиксы с юмором и их переводы
Развернуть

it-юмор geek 

Как выглядят ошибки в Python
Как выглядят ошибки в С++,it-юмор,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор
Развернуть

Дай Дорогу! музыкальный клип музыка киберпанк geek 

Развернуть

it-юмор geek 

fr Г	V
Я использую MacOS, - потому что люблю софт от Apple
ЯЧТсщхпьзую Windows, потому что она лучше, чем MacOS и там
Я использую Linux, ^ потому что он бесплатный,
все понятно
опенсорсныи, я могу там настроить все
поД|ёебя
и еще Tbicgia причин
Кстати, я использую Arch. Все бегу-бегу, не
Развернуть

политика gitlab русские назад it-юмор geek 

Компания GitLab из-за политики прекращает набор инженеров из России и Китая

cUtUtltníEUcH (ЗЯЯЗ(СЙ!С(СЯЯ(СЙ!С n:<!(Of)P!íOOPi?ÍOnP: (ЗЯЯЗЯйЯФЕЯФФГС IIIIIIIIIIII фффффффффффф ssssssssssss ïHïïïnïïïï OÜOOOÜOOÜOOO OUOOUÜÜUUÜOC aaûaaaûaaaaa,политика,политические новости, шутки и мемы,gitlab,русские назад,it-юмор,geek,Прикольные гаджеты. Научный, инженерный и



2 недели назад в публичном трекере компании GitLab, стоящей за популярным одноимённым Open Source-решением для разработчиков и DevOps-инженеров, появился issue под названием «WIP: блокировка инженерных должностей по стране проживания». Сегодня о нём стало известно широкой общественности, и это событие вызвало огромный резонанс в англоязычном интернете. Достаточно сказать, что на одной только странице оригинала злополучного issue уже оставлено более 100 комментариев, и их число увеличивается буквально с каждой минутой…

Итак, публикуем перевод виновника бурных обсуждений:

Поправка: это всё ещё обсуждение, и конечного подтверждения по принятой политике нет.

В групповом обсуждении, состоявшемся в понедельник 15 октября 2019, мы приняли решение активировать «блокировку рабочих мест по принадлежности к стране» для членов команды, у которых есть доступ к данным клиентов. Причиной тому послужила выраженная озабоченность ситуацией некоторых корпоративных клиентов, а также то, что уже становится привычной практикой в нашей индустрии ввиду текущей геополитической ситуации.

Это касается следующих стран:

Китай,Россия.
Этот issue призван отслеживать процесс соответствующих дополнений в руководство по поддержке и всего, что касается изменения процессов найма, с конечной целью добиться следующего:

Мы не делаем предложения о работе индивидуумам, проживающим в этих странах.Текущим членам команды не позволено переезжать в такие страны, оставаясь в должности, где это запрещено.
На сегодняшний день у нас нет технического способа добиться нужного с помощью системы прав. Его использование также вынужденно столкнёт нас с возможностью создания «граждан второго сорта» в определённых командах, которые не смогут выполнять 100% своих обязательств, что, по имеющемуся у некоторых из нас опыту в других компаниях, приводит к сильно негативным последствиям. Посему мы считаем, что блокировка по стране — самое гуманное решение на данный момент, особенно по той причине, что не затронет ни одного из действующих сотрудников.

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

Дискуссия проводится в #job-family-country-blocks (Slack-канал в проекте GitLab — прим. перев.), поскольку открыто множество связанных проблем, содержимое которых должно быть, если уж не общим, то хотя бы последовательным.

Примечание: вдобавок к команде поддержки (Support), это изменение также затрагивает SRE-инженеров по инфраструктуре (Infra), а также SecOps и Anti-Abuse в отделе безопасности (Security) — см. соответствующий issue.https://habr.com/ru/company/flant/blog/474436/
Развернуть

гифки голограмма проектор geek 

Развернуть

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

Dardevil Dardevil06.11.201917:04ссылка
-79.9
У него в Киеве так же! Удаляйте нахер!
jgotin jgotin06.11.201917:08ссылка
+34.4
В этом разделе мы собираем самые смешные приколы (комиксы и картинки) по теме гик (+17044 картинки, рейтинг 190,960.2 - гик)