Ремесло программиста

Объявление

форум на движке phpBB доступен для тестирования
www.strategia.space
www.strategia.space/forum/
по предложению Лиса - канал на Matrix - #remdev:matrix.org

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



знакогенераторы

Сообщений 1 страница 26 из 26

1

облазил пару-тройку ресурсов и застопорился на таком вот вопросе.
сразу уточню, что детально с вопросом не знаком и хотел бы как раз получить разъяснения в тех моментах в которых не сведущ

вот простейший код вывода строки на экран, слизанный с osdev.org

Код:
void write_string( int colour, const char *string )
{
    volatile char *video = (volatile char*)0xB8000;
    while( *string != 0 )
    {
        *video++ = *string++;
        *video++ = colour;
    }
}

все как везде все ясно понятно .
вопрос в том, что - верно ли я понимаю, что код записанный по адресу начиная от 0xB8000 печатает символы записанные заблаговременно (вшитые) в биос?
то есть мой вопрос - верно ли утверждение что анси строки вшиты во все системы на уровне биоса с самого начала.
ну и буду благодарен если у кого завалялся пример кода переопределения шрифта для знакогенератора.

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

2

Яр
Все современные компьютеры являются наследниками IBM PS/2.
Документация:
http://www.mcamafia.de/pdf/pdfref.htm
Читать Video Subsystem

вопрос в том, что - верно ли я понимаю, что код записанный по адресу начиная от 0xB8000 печатает символы записанные заблаговременно (вшитые) в биос?

Если рассматривать предшествующие архитектуры то изначально символы были вшиты в знакогенератор.  Отдельная микросхема с ПЗУ на 128 знаков или 256.
Как в IBM PC смотрите документацию выше я в такие подробности не вдавался.
Сейчас они прописаны в видео БИОСе при старте компьютера они загружаются в видео память и оттуда их берёт видеокарта.
Хотя не исключают, что возможен вариант что по одним  и тем же адресам расположен ПЗУ и ОЗУ и в зависимости от настроек берётся разный шрифт.

то есть мой вопрос - верно ли утверждение что анси строки вшиты во все системы на уровне биоса с самого начала.

Да верно вшит в видео-биос ASCII 8-бит.

ну и буду благодарен если у кого завалялся пример кода переопределения шрифта для знакогенератора.

Я вам уже говорил KeyRus там и исходники, они считаются самыми правильными. По слухам их даже Майкрософт использовала в своих ОС.
http://www.softpanorama.org/People/Gurtyak/index.shtml

3

БИОС устаревающая технология. В Uefi содержится гораздо больше сведений. Практически мини ОС.  Поэтому:

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

используйте графику :). Uefi тоже умеет

4

У меня вопрос к Павиа (ему 2000 лет и он знает всё).

когда появится форк
http://librecore.info/
на русском языке?

5

Лис (теперь ВежливыйЛис) написал(а):

когда появится форк
http://librecore.info/
на русском языке?

- Такой "форк" - покатит?  :surprise:

6

Кто может помочь собрать минимальное ядро с русским шрифтом? Здесь не вопрос о том где посмотреть и как- вопрос кто?

7

Яр
Ядро чего? Linux, самопальной ОС, UEFI ?

8

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

9

Я пересмотрел множество исходников. Вариантов загрузки шрифтов много. Реализации есть на разных языках си паскаль ассемблер идр. Но некоторые написаны для сборки на винде. Некоторые морально устарели, в том плане что или мейк или насм или фасм выдают какойто бред. Но чаще всего gnu си компилятор отказывается в корне собирать одно с другим. Я перелопатил tcc и собрал его с ключевыми словами на русском но перелопать libc его внутреннюю на русский у меня пока что не хватило сил и опыта. Потому желательно что бы пример смены шрифта был минимален. И если возможно на си или асме.

10

Яр
Тут способов вагон и маленькая тележка. Нужна конкретика.
libc - это системная библиотека, а как известно системные библиотеки под каждую ОС свои. С какой ОС начнём?

 
Компьютер с UEFI поддерживает 2 режима загрузки родной(Native) и совместимости(CMS).
CMS - режим совместимости со старыми не UEFI-БИОС'ами.

CMS грузит загрузчик, загрузчик грузит образ ОС.
Можно выделить 4 стадии в нашем случае варианта.
1) Мы пишем свой загрузчик. В 512 байт шрифт размером с 4 кб не уместить.  Но можно их подгрузить.
Процессор работает в 16 битном режиме.
2) Стадия вторая первичный загрузчик грузит вторичный загрузчик. Нам доступно BaseMemory 640 кб минус служебные данные (таблица прерываний, резиденты программы.).
Процессор работает в 16 битном режиме. Но уже не сложно перепрыгнуть в защищённый режим или остаться посерёдке в нереальном режиме.
Можно сменить 16 битный режим на 32 битный.
3) Вторичный загрузчик грузит образ ОС и передаёт управление.
ОС работает в 32 битном режиме или же в 64 битном. Так как полно старых загрузчиков то скорее всего вас загрузят в 32 битный режим, а в 64 битный вы должны будете сами прыгнуть.
4) Мы в современном 64 битном режиме нас сюда кто-то загрузил.

Из сложностей. Компилятор как правило поддерживает выходной ассемблер только для одного режима! Так как для каждого требуется свой генератор.
Взять хотя-бы формат указателей. Он разный!
Вторая проблема многие вещи можно сделать только в определённом режиме. Есть стандарты API которые поддерживают, а вернее в своё время поддерживали производители железа.
Поэтому приходиться либо прыгать обратно в старые режимы либо заводить БД и по мере загрузки накапливать необходимые данные.
Либо есть третий вариант делать только под один компьютер. Ваша ОС попросту не сможет работать на другом компьютере.

Для примера биос Award и AMI по разному стартуют. Одни устанавливают режим VGA 7 а другие CGA 2. (А ещё  это зависит от монитора ч/б или цветной) Соответственно программироваться для установки шрифтов они должны по разному.
Да и для каждого нужен свой шрифт.

А теперь рассмотрим UEFI. Его сделали очень быстро, в результате чего он ещё хуже чем унаследованный БИОС.
По UEFI я не большой знаток. Но там тоже вам на выбор несколько путей.
а) Работаем с UEFI
б) Переходим в режим ядра.
Это надо перемножить на варианты работы
- 32 битный код
-64 битный код
- байт код.
А теперь перемножаем ещё третий раз теперь(тут сразу вспоминаю тензорную математику)
VESA, VGA,
Тут надо по разбираться. Но судя по всему придётся заглянуть в исходники UEFI. Скорее всего вас сразу включат в VESA, так вот что-бы переключиться в VGA вам придётся написать драйвер для каждой видео карты. И только тогда вы сможете запрограммировать знакогенератор.
Короче говоря тут проще уже выводить напрямую.

4 - версии кода, 3 стандарта вывода, 2 шрифта.
Ах да совсем забыли о кодировке и формате строки.

Для правильного вывода кодировка в исходном фале и загруженная должны совпадать. А ещё ОС не всегда даёт её сменить. Или попросту не установлен или не выбран нужный шрифт.
И в ОС у каждый свой формат шрифтов.  И ещё надо различать стандартный ввод вывод и оконный текст.
И в линуксе там свои заморочки по этому поводу. Так как позволяют терминальное подключение.  А там есть ряд проколов где 255 это служебный символ, а у нас есть кодировка 866 что-ли где на этом месте стоит буква я.

И на напоследок. Эти проблемы не автоматизируются. От слов совсем. Системный программист должен будет выставить 10 ключей что-бы правильно собрать настройку знакогенератора.
Он должен будет во всём этом разбираться иначе ну никак.

11

Когда взял себе эту материнку - был приятно удивлён тем фактом, что её
"Технология UEFI DualBIOS™, совместимая с жесткими дисками емкостью свыше 3 Tбайт" - свободно переключается на русский язык и все настройки - спокойно "читабельны", но вот где и как хранится её русский шрифт - пока не знаю...

12

Зло в деталях. Да.
Мы для начала рассмотрим grub , elf, 32bit
Тестируем на виртуалке по вкусу.

Про libc - да и да. Вот потому этих пару тысяч строк я не брался перелопачивать.

Системный программист и будет разбираться. Не думаю что там каждый день все перепичывается. Один раз хорошо написал и будет работать.

13

Яр написал(а):

Мы для начала рассмотрим grub , elf, 32bit


Если у тебя GRUB2, то в нём есть команда конфига для включения видеорежима.
https://www.gnu.org/software/grub/manua … ml#gfxmode
http://forum.osdev.org/viewtopic.php?f=1&t=29758
Поэтому включаешь графический режим и рисуешь по точкам что угодно, не распаривая нам мозги.

То есть, когда grub загрузит твоё ядро, в видеоадаптере уже всё будет настроено (и защищённый режим тоже можно заранее установить).
Так что тупо копируешь байты с одного места на другое (из описания шрифта в буфер видеоадаптера)

Для того, чтобы сделать твоё ядро, читаешь эту спеку:
https://www.gnu.org/software/grub/manua … iboot.html

14

Нет. Я не хочу рисовать. Я хочу чтоб рисовалось само и стандартными средствами.это как :нет русского языка программирования ну и ничего пиши транслитом.

Лис, ты знаешь как это сделать?
Если да то давай код, если нет подождем что скажет Павиа.

15

давай

Лис даже не огрызнулся. Вежливость +1.

Я хочу чтоб рисовалось само и стандартными средствами.

Это очень странное желание завязаться на legacy. Что такое "стандартные средства"? Это иностранная программа, написанная кем-то другим. Как раз то, что мы хотим переписать.

Сейчас можно сделать свою прошивку (то, что раньше называлось BIOS, а теперь UEFI). Ты не хочешь, тебе GRUB подавай. Тебе рассказали, что есть в GRUB, ты снова против.

16

Яр написал(а):

Нет. Я не хочу рисовать.

Есть же готовые точечные шрифты, код отображения элемента на экран займёт несколько строк.
А неточечные - достаточно высокоуровневая графика, непонятно причём тут загрузка ОС и управление памятью, их кто-нибудь смешивает? Зачем?

Сандро написал(а):

свободно переключается на русский язык

Это нормальное пр-во. Телевизоры какие-нибудь поддерживают кучу языков, даже ЭЛТшные поддерживали.
То что в БИОСах нет/не было русского - отсутствие такого требования. Было бы требование на условие разрешение продажи - был бы русский. Русификация его - копеечное дело.

17

MihalNik,
Все верно есть уже подготовленые шрифты. Их я и хочу задать и ими писать.
Про ось и высокий уровень я диалог не веду. Мне это не надо на текущем этапе.

Лис,

Завязаться на легаси до которого нашим производителям еще далеко -вполне нормально. 
Uefi  и остальное это прикольно, но мобильные платфорсы с армами спокойно живут и без этого.
Думвю никто не будет спорить что стандартным писишникам пришел закат.

Стандартные средства это биос. Не больше не меньше. И Лис -1 к внимательности. Прочитай что я говорил про граб

18

То что тебе нужно - это описание, как загрузить шрифт в видеоадаптер VGA (неважно, из BIOS, или из ядра)

Примерно такое:
http://forum.osdev.org/viewtopic.php?f=1&t=25375

дока почитать:
http://www.osdever.net/FreeVGA/vga/vgatext.htm#fonts

Отредактировано ВежливыйЛис (2017-05-29 12:17:09)

19

Смотри. Все просто. Я не писал как, я писал кто.
Как я уже прочел. Спасибо

20

Лис: вежливость +2.

Кстати ещё идея: чтобы не грузить шрифт в ядре, можно воспользоваться загрузкой шрифта при помощи GRUB2:

grub-mkfont -s 16 -o /boot/grub/grubfont.pf2 font.tty
GRUB_FONT=/boot/grub/grubfont.pf2
update-grub

но это только для графического (framebuffer) режима (https://www.gnu.org/software/grub/manua … ile-format),
и как получить адрес загруженного шрифта - сходу не ясно.

Отредактировано ВежливыйЛис (2017-05-29 13:27:16)

21

Лис прочти плиз самое первое сообщение в этой теме. Может тебя осенит. Спасибо

22

вопрос в том, что - верно ли я понимаю, что код записанный по адресу начиная от 0xB8000 печатает символы записанные заблаговременно (вшитые) в биос?
то есть мой вопрос - верно ли утверждение что анси строки вшиты во все системы на уровне биоса с самого начала.


нет, ты понимаешь не верно.

Во-первых, 0xB8000 содержит не код, а данные.
Во-вторых, знакогенератор видеоадаптера использует определения символов не из Биоса, а из видеопамяти
В-третьих, чтобы переопределить символы есть много способов. Два основных - прошить новые в BIOS/UEFI (один раз навеки, они при смене режима будут копироваться биосом в видеопамять) или динамически подгружать в видеопамять.

Лис: вежливость +3

А, да, пример подгрузки определения шрифтов в видеопамять - выше
(это для знакогенератора в текстовом режиме без использования чего-либо, как ты хотел)

Отредактировано ВежливыйЛис (2017-05-29 13:53:31)

23

Лис я думаю ты меня не верно понимаешь. Обсудим это в лс.

Тема остается открытой. Кто все же знает и может сделать это?

24

Прочитал личку.

Я бы оттуда сюда скопировал этот фрагмент (потому что это будет полезно другим, как одно из требований):

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

В остальном,
Лис: Вежливость +4

25

Лис если бы ты читал посты, то знал бы, что это я уже писал здесь.

Я думаю тебе пора начать писать по делу.

26

Одна из основных ошибок начинающего осеписателя. То, что он думает что ОС ему ненужна. Оказывается нужна - как воздух! Он привык работать в ОС и просто этого незамечает.
Он привык что если ему нужно что-то написать он лезит в справочник и находит готовое API или ищет в гугле готовое решение. А так же способ обучения потворстует этому заблуждению.
Человек живущей в своей среде обитания попросту её не замечает. Незамечает как воздух, но стоит его лишить привычной среды перекрыть воздух как он начинает чувствовать дискомфорт.

Стандартные средста это и есть API OS.
Взять BiOs так он для графического режима использует вывод по точкам. 
Или как вы верно заметели в ARM нет знакогенераторов. Там вывод идёт по точечно.
Более того windows OS тоже отказалась от поддержки знакогенератора. И там вывод идёт по точкам.

Взять линукс там тоже вывод поточечный - хотя и умело замаскированный под  знакогенератор. 
Окромя dOS где он только и используется.

Забыл сказать что BIOS вы можете использовать только в реальном режими.  А GRUB вас грузит в защищённый режим.

Собственно так как нет смысла поддерживать старьё я тоже неделал поддержки знаеогенератора. Ожнако оказывается не сложно написать загрузку шрифтов в него.  Там всего пяток функций.