The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Rust 1.45"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Rust 1.45" +/
Сообщение от Ordu (ok), 21-Июл-20, 13:56 
Знаешь, твоё непонимание небезопасности этого массива говорит не столько о том, что раст какой-то не такой, сколько о том, что из тебя совершенно никакой системный программист.

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

Как это делать? Надо настроить регистры VGA на копирование, может быть нужные операции над битами вставить, и после этого ты запускаешь цикл где копируешь строками. На уровне асма это сводится к чему-то типа movsb, где, например, каждый копируемый бит соответствует одному пикселю на экране. Тут очень важно, чтобы за чтением байта из видеопамяти следовала бы его запись туда. Если между этим чтением и записью байта вмешается, скажем, ещё какое-то чтение из другого места, то будет записано 8 левых пикселей.

А теперь прикинь, что в процессе выполнения этого цикла случилось прерывание, и какой-то совершенно другой код начал выполнять какие-то операции с видеокартой -- перенастроил режимы/регистры, и начал что-то там творить. Что будет? Будет мусор на экране.

Чтобы такого не случалось, люди выкручиваются как могут. В DOS'е было довольно просто с этим, были простые правила:
1. не выводить ничего из обработчиков прерываний
2. однопоточная программа, никакой многозадачности, лучше в том числе и кооперативной.

Но если мы прикинем вариант, что с VGA карточкой работает современная операционная система, то тут встаёт куча проблем с синхронизацией. Например надо X11 одеть поверх видеокарты, чтобы приложения бы общались с X11, заказывая выполнение операций, а X11 бы уже упорядочивал бы их и выполнял бы "атомарно".

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

В ядре делается именно то, к чему тебя будет подталкивать rust, разница лишь в том, что в ядре тебя к правильному стилю будут подталкивать ревьюеры кода, здесь же всё начнётся раньше: тебя будет к этому подталкивать rustc.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Rust 1.45, opennews, 20-Июл-20, 10:21  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру