Мне нужно каким то образом реализовать многопоточность в ядре под UEFI, после того, как оно вызывает Exitbootservices(). Мне дали пример (статья) но там говорилось про псевдо-многопоточность, т.е. разделение функции на части и их выполнение по кускам друг за другом (все это делалось для одноядерного проца), мне же нужна многопоточность для современных пк, которая могла бы быстро выполнять мои функции
У вас есть несколько ядер проца - запустите на каждом ядре какой-либо код, вот вам и многопоточность.
Но для ОС, нужен как минимум планировщик, который сможет по таймеру на каждом ядре отдельно снимать один поток с выполнения и запускать другой.
Структуры, описывающие потоки, надо хранить в какой-то потокобезопасной (а лучше lock-free/wait-free) очереди с приоритетами. Планировщик, снимая поток с выполнения на конкретном ядре, добавляет его в конец очереди, извлекает из очереди самый приоритетный первый поток и ставит его на выполнение на данное ядро.
res2001, Про планировщик я все прекрасно понимаю, а также уже примерно накидал его код. Моя основная проблема именно "Запустите на каждом ядре какой-либо код", т.к. я не знаю, как это сделать
Qreen, Обычно начинать надо с Technical Reference Manual. Да, это документация от производителя процессора.
Берете модель конкретного вашего процессора и ищите по нему доку.
Например, если процессор АРМ, то начинаете с документации от производителя железки (АРМы много кто делает, кроме самого АРМа), а там будут ссылки на документацию от АРМ, а у АРМа то же целая пачка этих документов.
С интелом проще - они сами делают свои железки, так что вся документация в одном месте.
res2001, хммм, может, я чего то не понимаю, но как найти документацию под конкретный проц? Я сижу на интеловском i7 8750h, на сайте у них только общий сборник неких "томов" Для разработчиков, это то, что я ищу?
Qreen, Не знаю, как там у интела все устроено, не было с ними подобного опыта, больше с АРМами.
Видимо вам надо начинать гуглить от архитектуры процессора Intel 64: https://www.intel.com/content/www/us/en/developer/...
В описании разных частей архитектуры могут быть варианты, зависящие от конкретной модели (или поддержки процессором какой-то технологии), сверяетесь со спецификацией процессора и выбираете ваш вариант описания.
Вообще без понятия :) В АРМах нет UEFI и вообще БИОСа как такового.
Но по собственному опыту могу сказать, что все сторонние источники могут только как-то указать направление, за детальной информацией все равно надо идти в документацию производителя. Так что есть смысл сразу оттуда и начинать. Научитесь искать информацию на сайте интел, поймите как у них устроена документация, т.к. документов по разным частям архитектуры много.
Например по вашей ссылке есть список регистров APIC, но для выполнения конкретных действий этого не достаточно - нужно описание каждого битового поля в регистрах, нужно понимать как вообще функционирует устройство.
Можно еще качнуть ядро линукса и параллельно смотреть как у них там реализован данный функционал.
res2001, оо, насчёт линукс ядра - можете даже не говорить xD
Я пробовал, не нашёл вообще ничего, там слишком много информации, а все комментарии сводятся примерно к этому: "Ну, короче там дальше будет 293747 строчек кода, там это.. Ну, драйвер AHCI короче, удачи"))
Qreen, А оно там точно есть :)
А кто говорил, что будет легко?
Программировать на этом уровне довольно тяжелое и нудное занятие.
Лично у меня больше времени уходило на изучение документации (и возможно исходников), чем на собственно программирование.
При этом само программирование может быть достаточно тривиально, но что бы осознанно манипулировать нужными битами, нужно разобраться как устройство работает.
Qreen, Я вовсе не считаю себя экспертом. Пришлось погрузиться в тему низкоуровневой работы с железом около 1.5 лет назад. Решал определенную задачу. Не настолько сложную, как написание ОС, но у меня ушло пол года. До этого никогда на таком уровне не работал.