sfw
nsfw

Результаты поиска потегуOS

Дополнительные фильтры
Теги:
OSновый тег
Автор поста
Рейтинг поста:
-∞050100200300400+
Найдено: 566
Сортировка:

ОСдев №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?
Предыдущие части:

Актуальное положение вещей с играми под linux.

Особенно рады будут любители ретро гейминга.

Опыт настройки басов на звуковой карте, основанной на звучках от Realtek - Creative Sound Blaster Audigy FX

Вряд ли бы я назвал это статьёй. Скорее это чисто баттхёрт на тему того, какую хуйню могут сотворить (в материальном и нематериальном смысле) нынешние производители компьютерной железяки.
Предыстория
Жил себе я спокойно, слушал долбящую в уши музяку через свои любимые наýши и звуковую карту Sound Blaster X-Fi XtremeGamer, пытаясь ещё и играть в кое-какие игры на встроенной Intel HD Graphics 2500…
Сложные названия какие-то.

Г
„одумал, что ху осязать. И юг "P01* чем хуйня:
И НСЦННЧ1НЯЯ. И ДИСК/
микпичюм WASA 14 (ni,звук,Sound blaster,Windows,Операционная система,звуковая карта,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,realtek,песочница,длиннопост

Вот такие наýши. Наушниками даже язык не повернётся назвать такими: весят почти полкило, бас через край и конфигурация на 5.1. Roccat Kave 5.1 Analog.
И вот, после попыток поиграть хоть как-то на встроенной, а также долгого отсутствия хоть какой-либо дискретной видеокарты для игруль, я взял себе в наследие от братишки nVidia GeForce 9600 GT с 1 ГБ памятью, да ещё с достаточно нестандартной системой охлаждения:

,звук,Sound blaster,Windows,Операционная система,звуковая карта,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,realtek,песочница,длиннопост

Ага, вот она. Внушительная и не особо полезная в нынешнее время (в наше время есть нынешний её ребрендинг типа GeForce GT 610 (по мощности)). А на ней — лорд DEEPCOOL V4000.
Кулер такой на данной видюхе должен был оказаться очень хорошим решением, как я подумал тогда (оказался: 40°C в нагрузке против 60°C. Да что там — я референсное охлаждение и то не увидел). И всё вроде бы хорошо, но не тут то было: всё это добро занимало аж 2.5 слота в моей материнской плате, что не ist хорошо: заняло все слоты PCI, кроме одной PCI-E x1 снизу. И тут передо мной встал выбор: в жопу дашь или мать продашь? или звук, братишка, или видюха. Выбор пал на второе.
«Раз от дискретной аудиокарты придётся отказаться, хотя бы на встроенной поживу» - подумал я. Ага, щас. Зайдя в панель управления звука, настроив конфигурацию под 5.1, и наконец найдя эквалайзер и выкрутив низы вверх, я столкнулся с искажениями звука по типу компрессии/тонкомпенсации/сайдчейна/хз-как-назвать в моменты атак басов.
«Уаттафак?» — вновь подумал я и убавил всё обратно. Так и жил с этим месяц.
Отходя от такой ломки, тем временем я задумывался над приобретением другой аудиокарты с аналогичными характеристиками и полезными фичами, которые смогут раскачать звук на 5.1 так же, как это делал мой прошлый X-Fi. И выбор пал на любвеобильный сабж, который вы могли видеть на обложке.
Ну приобрёл ты, и дальше что?
Ну приобрёл я, установил, и в надежде, что «хотя бы на этой такой херни не будет», в надежде опять послушать музяку «как мне нравится», настроив, я столкнулся с точно такой же проблемой: компрессия в моменты атак басов. Сказать, что я охуел - не сказать ничего. Немного приуныв, я перерыл комп и интернеты в надежде найти ответ, но не нашёл (либо я плохо искал, либо ответ лежал на такой поверхности, что вряд ли бы кто-то задался вопросом как убрать эту хрень). И как-то…
Но прежде, чем я зайду вперёд, мой дорогой читатель, я немного с этим затяну, прежде чем скажу, что нужно было сделать.
Особенности звуковой системы Windows для нубов и прочая графомания
Дело вот в чём: на встроенной реалтековской (с лат. переводится как "говно") нельзя было выкрутить басы на максимум без эффекта перегруза и мгновенной компрессии звука из-за того перегруза. Из-за чего приходилось выключать эквалайзер. А после покупки и установки данной Audigy FX выяснилось, что ситуация с басами, когда не можешь выкрутить басы на полную, никуда не делась (там и звуковой проц, и ЦАП - реалтековские (я знал, что там так стоит, но думал, что хуйни с перегрузом не будет)). И вот, проводя очередную ночеечку и тыкаясь в клавиатуру, печатая данный текст, я выяснил, в чём хуйня:
И встроенная, и та дискретная звуковухи как-то связаны с виндосовским микшером WASAPI — Windows Audio Session API (присутствует ещё с Windows Vista), и даже если ты чуть-чуть выкрутил громкость, звук действует так, как если бы прибавили на полную громкость.
Ты, наверняка, мог заметить зелёную и какую-то серую полоски в микшере Windows, когда жмёшь на иконку звука в трее, так вот — именно так работает нынешний звук — звук изначально сделан громким (0дБ), но программно он снижается через микшер системы. И при повышении в эквалайзере тех частот, которые играют громче, повышается общая громкость микшированного звука, и, следовательно, возникает перегруз (clipping, если не ошибаюсь) общего микшера, и чтобы звук не пердел, срабатывает защита от перегруза посредством компрессии.


i, Микшер громкости - Динамики (Sound Blaster Audigy Fx)
X
Устройство	Приложения		
	|Ц	Р	%
Динамики	Системные звуки	Punto Switcher	Mozilla Firefox
49	49	49	49,звук,Sound blaster,Windows,Операционная система,звуковая карта,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,realtek

Ага, вот эти ребята

Параметры
(й Главная
Звук
Найти параметр
Р
Система
Выберите устройство вывода Динамики (Realtek High Definitio... v
Некоторые приложения используют настраиваемые параметры вывода. Вы можете персонализировать их в настройках устройств и громкости приложений ниже.
Свойства устройства С]

UPD: То же самое есть и в Win10 настройках, и там этот оранжевый ползунок будет динамичней, чем микшер сверху

В прошлых версиях винды и аудиокартах, заточенных под неё, действует система DirectSound, и от перегруза там нет никакой защиты, и в случае такового звук будет пердеть как при овергейне в каком-нибудь «earrape» видео, сделанном в Sony Vegas (я убедился сам на Sound Blaster Live! и X-Fi XtremeGamer).
P.S.: сейчас, перечитывая этот абзац, хочу себя исправить, сказав то, что бывают звуковухи как с независимой регулировкой громкости на уровне ЦАП, так и с фиксированной громкостью с программой регулировкой (не совсем понятно, что я сейчас написал, но ок).
Плюс от новой системы WASAPI только то, что звук при любом раскладе не будет пердеть. Ну и буфер ещё (как плацебо для слабых компьютеров).
А минус: хуй определишь, звук изначально компрессирован из-за басов, или ты криворукий мудак и выкрутил басы на +20дБ (особенно если ты слушаешь музыку не в наушниках).
И звук, кстати, уже обрабатывается самой системой, не звуковухой, та лишь выдаёт готовый микшированный звук. А тогда это всё как-то управлялось совместно, да и на аппаратном уровне.
Решение, решение! НУ?!
А решение вот какое: я выкрутил басы в эквалайзере на полную (можно и не на полную, где кому как), а дальше общую громкость в муз. проигрывателе (например, в foobar2000) или в игре (master volume) снижал до нужного значения, когда от басов можно добиться максимума без перегруза, одновременно при этом обращая на серую полоску в микшере Windows, мониторя, не доходит ли серая полоска до самого верха в моменты атаки басов, и если нет, то можно ещё чуть-чуть прибавить. Иначе компрессия.
Плюс: Наконец-то норм басы
Минус: Придётся в каждой программе/игре снижать общую громкость до нужного значения, когда нет перегруза.
Такой способ должен работать на любом реалтеке и в любой встроенной звуковухе (может быть, судя по тому, что цап в audigy fx - реалтековский).
И я такой: «А что, можно было так сделать? Ебааааать»
И да, если думаешь записать что-нибудь с такими настройками на своём встроенном (и не только) реалтеке — забудь. Эквалайзер влияет на общий звук в микшере, и на выходе получишь запись с усиленными басами, а не оригинальную дорожку. И ты всё это успел увидеть. Если, конечно, настраивал и дочитал до сюда. Так что при записи видео басы лучше отключать и общую громкость в приложениях прибавлять. Но меня этот гемор так заебал, что я просто перестал данной звуковухой пользоваться. Записывать с артефактами и лишними телодвижениями видео — не комильфо.
За примерами особо обращаться не надо: в ютубе есть люди типа SHDWSKII, которые записывают видео с искажением звука, сами того не замечая.

TL;DR:
Просто делай басы на полную в панели управления звуковухой и убавляй звук в каждом приложении. А ещё лучше — купи саундбластер из серии X-Fi, или Audigy RX, ну или на худой конец — Sound Blaster Live!. Звук будет на порядок лучше и АЦП для записи тоже хорошего качества.
ВИНДА, КОГДА ТЫ ТОЛЬКО УСТАНОВИЛ ЕЁ
ВИНДА ЧЕРЕЗ МЕСЯЦ ПОЛЬЗОВАНИЯ,Windows,Операционная система

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

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