После долгого перерыва продолжаем делать интересные штуки, как всегда на чистом железе без операционной системы. В этой части статьи научимся использовать весь потенциал процессоров: будем запускать программу сразу на нескольких ядрах процессора в полностью параллельном режиме. Чтобы провернуть такое, нам потребуется многое сделать для расширения функциональности программы полученной в части 3.
Просто так выполнять какие-то вычисления на ядрах процессора – скучно, поэтому нужна задача, которая требует больших вычислительных ресурсов, хорошо раскладывается на параллельные вычисления, да и выглядит прикольно. Предлагаем сделать программу, которая рендерит простенькую 3D-сцену, используя алгоритм обратной трассировки лучей, или, по-простому, Ray Tracing.
...
...
Теперь, когда с теорией покончено, приступим к написанию программы.
! ВАЖНО!: Все дальнейшие действия могут успешно осуществляться только после успешного прохождения всех 6-ти шагов из третей части статьи "Как запустить программу без операционной системы"
Шаг 1. Сперва чистим лишнее.
В первую очередь нужно немного очистить имеющийся код от лишних файлов и функций. Нам понадобится полноценная математическая библиотека, поэтому нужно удалить лишние файлы из common: удаляем файл common/s_floor.c .
Рисовать фрактал нам не нужно – нам нужен Ray Tracing, поэтому можно удалить fractal.c. Но поскольку графический режим все же нужен, пишем следующий код в kernel.c:
1. добавляем несколько объявлений перед функцией main, которые в том числе задают разрешение экрана и картинки, которую будем рендерить:
int vbe_screen_w = 800, vbe_screen_h = 600;
int VBE_SetMode( ulong mode );
int VBE_Setup(int w, int h);
extern ulong vbe_lfb_addr;
extern ulong vbe_selected_mode;
extern ulong vbe_bytes;
//Про них будет написано позднее
int ray_main();
void SmpPrepare(void);
2. меняем функцию main:
void main()
{
clear_screen();
printf("\n>>> Hello World!\n");
// Будет включать все ядра процессора
SmpPrepare();
VBE_Setup(vbe_screen_w, vbe_screen_h);
VBE_SetMode(vbe_selected_mode | 0x4000);
// Будет инициировать рисование на экране
ray_main();
}
3. удаляем строку:
void DrawFractal(void);
Шаг 2. Добавляем математическую библиотеку fdlibm.
Теперь можно добавить полноценную математическую биьлиотеку. На самом деле нам понадобятся только функции sqrt, tan и pow – они используются в алгоритме Ray Tracing.
Read more: Habrahabr.ru
QR: