LINUX.ORG.RU

Посоветуйте курс лекций по программированию в x86-64 long mode

 , , ,


1

2

Стало интересным попробовать себя в osdev, точнее в самых основах osdev - в программировании современных x86-64 процессоров в long mode режиме (не путать с 32-х битным защищённым режимом).

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

Можете ли посоветовать что-то, по уровню подачи материала, похожее на курс лекций о C++ от Ильи Мещерина?

Обычный ассемблер 8086 я знаю, хотя и не пользовался им уже довольно давно.


Если ориентируетесь на ширпотреб с x64, замените assembly на Си, FreePascal или какой-нибудь новомодный язык, для которого есть система сборки PE-бинарника UEFI.

И постарайтесь самые базовые части ОС реализовать многоплатформенно. И потом перейти к деталям конкретных платформ на RISC-V, x64, s390 и т.д.

anonymous
()
Ответ на: комментарий от anonymous

Хотелось бы начать с самого начала, а не с PE-бинарников под UEFI. То есть с загрузки в x86 реальном режиме, самостоятельного перехода в x86-64 long mode, инициализации всех нужных регистров, реализации обработчиков прерываний и тд. Разумеется я не собираюсь писать всё на ассемблере и поверх ассемблерного кода будет код на более высокоуровневом языке, но мне необходимо знать и понимать что происходит на достаточно низком уровне.

hummer
() автор топика

предлагаю читать мануалы от интела или AMD

Harald ★★★★★
()

Сначала прочитай "Assembler для Windows" В.Ю.Пирогова.
А потом как уляжется "Assembler для ВУЗОВ" В.Ю.Юрова.
И ещё мне тут в поисковике попалось: Ассемблер – это просто. Олег Калашников

torvn77 ★★★★★
()
Ответ на: комментарий от hummer

Хотелось бы начать с самого начала, а не с PE-бинарников под UEFI.

Для современных Ubuntu и Windows на современных писюках приложение UEFI – это, как правило, и есть самое начало.

с загрузки в x86 реальном режиме, самостоятельного перехода в x86-64 long mode,

Некоторые новые системы на x64 вообще не умеют эмулировать протокол IPL с дискеты 40- летней давности. На таких компьютерах Вам придётся написать и запустить x86.efi, который сбрасывает процессор в реальный режим. Впрочем, можно баловаться с реальным режимом на дополнительных ядрах, а основной оставить в long mode.

Даже если legacy реализовано, и UEFI умеет сама переключаться в реальный режим, чтобы имитировать чтение с флешки и выполнение Boot record реального режима, то очень многие устройства не будут эмулироваться. Например, не будет эмуляции VGA.

Или Вы хотите написать собственный BIOS, UEFI или LibreBoot?

vM ★★
()
Ответ на: комментарий от torvn77

Сначала прочитай «Assembler для Windows»

А лучше забудьте слово «ассемблер», пока не сможете написать на любимом языке высокого уровня простенький генератор x64-кода.

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от vM

На таких компьютерах Вам придётся написать и запустить x86.efi, который сбрасывает процессор в реальный режим. Впрочем, можно баловаться с реальным режимом на дополнительных ядрах, а основной оставить в long mode.

Тогда может лучше эксперементировать не на реальном железе, а на виртуальной машине QEMU или KVM?

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

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

Но если в процессе изучения и разработки частей ОС уже используется QEMU, то почему бы заодно не изучить RISC-V и другие актуальные и перспективные архитектуры?

vM ★★
()

Ну сходи на osdev wiki, там это описано. Но по факту никто это на чистом асме не делает. Даже в лялексе это обёрнуто в C и асма там минимум.

hateyoufeel ★★★★★
()
Ответ на: комментарий от vM

Но если в процессе изучения и разработки частей ОС уже используется QEMU, то почему бы заодно не изучить RISC-V и другие актуальные и перспективные архитектуры?

Согласен.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)

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

Обычный ассемблер 8086 я знаю, хотя и не пользовался им уже довольно давно.

Одному мне кажется что имеет место быть откровенный троллинг?

bugfixer ★★★★★
()

как реализовывать самые базовые части ОС, например простой планировщик задач

Планировщик задач в целом кроссплатформенный и от архитектуры процессора не зависит.

X512 ★★★★★
()
Ответ на: комментарий от bugfixer

Вполне возможно. Но отчего бы не написать очередной гипервизор Just for троллинг? ;)

Весь osdev.org можно рассматривать как сплошной троллинг.

vM ★★
()
Ответ на: комментарий от hummer

То есть с загрузки в x86 реальном режиме, самостоятельного перехода в x86-64 long mode, инициализации всех нужных регистров, реализации обработчиков прерываний и тд.

На новом железе вы такое уже так просто не запустите. Надо будет прикладывать усилия уровня CoreBoot. UEFI запускает вашу ОС уже в x86-64 long mode.

X512 ★★★★★
()
Ответ на: комментарий от X512

И можно сначала смоделировать и отладить планировщик как обычную программу под управлением обычной многозадачной ОС. А затем заменить средства, предоставляемые ОС, на те, что доступны на целевых платформах.

vM ★★
()

Для понимания общих принципов работы ОС и железа RISC-V подходит намного лучше, там намного проще настроить MMU, обрабатывать прерывания, переключать режимы и т.д.. Например можно посмотреть на исходники xv6.

X512 ★★★★★
()
Ответ на: комментарий от X512

Планировщик задач в целом кроссплатформенный и от архитектуры процессора не зависит.

Как он может быть полностью кроссплатформенным? Процессорное время делится на кванты, между которыми происходит смена контекстов процессов, то есть переключение процессора от исполнения кода одного процесса к исполнению другого. Эта смена контекстов выполняется при помощи прерываний и их обработчиков. Как можно написать обработчик этих прерываний полностью кроссплатформенно? Вероятно так можно написать лишь какую-то его часть. Например раннюю смену контекстов процессов после блокирующего ввода/вывода.

Я сейчас начал смотреть серию лекций, которые не вполне про то, о чём я спросил, но достаточно понятно рассказывается про архитектуру операционной системы, защищённого режима (32 бита) и прочее. Так там лектор, на первой вводной лекции, именно так и объясняет. Разумеется с кучей упрощений.

hummer
() автор топика
Ответ на: комментарий от hummer

Эта смена контекстов выполняется при помощи прерываний и их обработчиков.

Это всего несколько строчек кода вызова планировщика по прерыванию таймера. Сама логика планировщика от архитектуры процессора особо не зависит. От архитектуры зависят обработка прерываний таймера, сохранение/загрузка регистров и установка начального состояния регистров при создании нового потока.

X512 ★★★★★
()
Ответ на: комментарий от X512

На новом железе вы такое уже так просто не запустите. Надо будет прикладывать усилия уровня CoreBoot. UEFI запускает вашу ОС уже в x86-64 long mode.

Речь идёт не о самом новом железе. Например у меня компьютер с процессором i7-4790, BIOS поддерживает legacy режим, то есть не только UEFI. Ну и пробовать запускать я буду вовсе не на настоящем железе, а в виртуальной машине. Я не хочу полагаться на UEFI, поскольку это не вполне открытая технология и инициализация x86-64 long mode режима скорее всего не всегда будет такой, как мне хотелось бы. Хочется самому в этом покопаться, даже если я не прав и UEFI обеспечивает достаточно стандартную инициализацию.

hummer
() автор топика
Последнее исправление: hummer (всего исправлений: 2)
Ответ на: комментарий от X512

Например можно посмотреть на исходники xv6

В той серии лекций, ссылку на которые я дал выше, эта xv6 как раз и используется в учебных целях.

hummer
() автор топика
Ответ на: комментарий от X512

Это всего несколько строчек кода вызова планировщика по прерыванию таймера. Сама логика планировщика от архитектуры процессора особо не зависит. От архитектуры зависят обработка прерываний таймера, сохранение/загрузка регистров и установка начального состояния регистров при создании нового потока.

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

hummer
() автор топика
Ответ на: комментарий от vM

Старая 32-разрядная версия для x86?

Ещё не знаю. Я успел посмотреть лишь вводную лекцию, в которой xv6 лишь упоминается и приводится список её системных вызовов.

Кстати, лектор ругает системный вызов ioctl из Linux, за несоответствие общим принципам, но как бы он сделал иначе не говорит или ещё не успел рассказать.

hummer
() автор топика
Ответ на: комментарий от hummer

Начните с низкоуровнего RISC-V. Подключитесь к университетскому курсу на основе той же xv6 ( они обычно как раз осенью начинаются ), выполняйте лабораторки вместе со студентами, и к концу семестра у Вас будет работающая заготовка супервизора.

vM ★★
()
Ответ на: комментарий от hummer

хочется с чего-то простого и низкоуровневого. … пригодного на пощупать

Уважаемый @hummer, у Вас же есть на чём запустить qemu и/или GDB? Запускайте на одном экране, на другом – PDFки в случае обсуждаемой архитектуры – с портала https://developer.amd.com/resources/developer-guides-manuals/

и щупаете.

Потом можете попробовать портировать на x64 что-нибудь из древности.

vM ★★
()
Ответ на: комментарий от hummer

Подобных курсов куча и в других вузах. https://pdos.csail.mit.edu/6.828/2021/tools.html

Можно проходить курс этого года или прошлогодний на RISC-V и сравнивать с Мамонтовым добром из курсов 2017-2018 года.

vM ★★
()
Ответ на: комментарий от u-235

Да вообще подавляющее большинство книг с такими ключевыми словами, если эти книги написаны после 1983 года.

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Когда копро уже не вставляет.

Расскажи, почему копро тебя уже не вставляет или что не так с теми лекциями по C++?

hummer
() автор топика
Ответ на: комментарий от hummer

щас лекции по низкоуровневому программированию популярно смотреть в тиктоке

anonymous
()

Я листал вот эту книгу.

Руслан Аблязов. Программирование на ассемблере на платформе x86–64.

tlx ★★★★★
()

Когда-то у меня было много времени и рвения. Я взял ядро, сконфигурированное под ARM v8 (тоже 64-х разрядное) и собрал на его основе файл примерно в 50 тыс. строк, который компилировался и мог запускать ash. Тестил выполняя ls в RAM-диске. Убито много времени, но удовольствия получил тоже кучу :)

Вот если интересно https://github.com/kliga/one-file-linux

tlx ★★★★★
()
Последнее исправление: tlx (всего исправлений: 1)
Ответ на: комментарий от vM

> Некоторые новые системы на x64 вообще не умеют эмулировать протокол IPL с дискеты 40- летней давности.

А как тогда обновлять прошивку на контроллерах жёстких дисков, если не загрузив DOS с дискеты?

ZenitharChampion ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Обновлял на трёх дисках с помощью hdparm --fwdownload. Диски живы.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от tlx

Это оттуда? Из книжки Руслана Аблязова про FASM?

Начнём с начала – с 70-х годов прошлого века. Тогда компьютер с памятью 64Кб считался суперкомпьютером – если она была установлена, это было вообще чудо. Для адресации такой памяти хватало 16 бит

vM ★★
()
Ответ на: комментарий от tlx

Я листал вот эту книгу.

Руслан Аблязов. Программирование на ассемблере на платформе x86–64.

Спасибо за рекомендацию, тоже сейчас полистал. Похоже на полезную, для меня, книгу.

hummer
() автор топика
Ответ на: комментарий от hummer

У Руслан Зуфярыча подобных лирических отступлений хватает.

В этом разделе нами были изучены механизмы, обеспечивающие многозадачность в защищённом режиме. Тем не менее, как это ни прискорбно, наиболее распространённые операционные системы (Window и UNIX) по каким-то причинам не используют аппаратый механизм поддержки многозадачности, а вместо этого реализуют многозадачность программно.

https://img2.labirint.ru/rcimg/55f7eb154882579797f8f19917095fab/1920x1080/books50/497082/ph_1.jpg

Возможно, потому что Руслан Зуфярыч в душе – писатель-фантаст и не так давно осмелился представить на суд благодарных читателей очередную свою книгу https://programmersforum.ru/showthread.php?t=327278 , с чем его можно только поздравить.

А на официальном сайте книги по теме http://assembler-x86-64.ru/ Руслан Зуфярыч предлагает найтии скачать электронный вариант.

А Вы какой из электронных вариантов скачали, если не секрет?

vM ★★
()
Ответ на: комментарий от anonymous

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

hummer
() автор топика
Ответ на: комментарий от anonymous

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

hummer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.