Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб авг 19, 2017 4:09 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:05 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Mario
Одного 1КГц таймера разумеется мало. Нужен и планировщик чтобы переключиться в нужный момент на требуемую задачу.

art_zh писал(а):
А всего делов-то: попросить ядро прогнать короткий кусок юзерского кода, перезапустить таймер и выйти из прерывания
И каким образом ядро это сделает без смены контекста если адресные пространства не совпадут ? Напоминает старый анекдот "и что только не придумают русские программисты, лишь бы не строить хорошие дороги писать драйверы"


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:07 am 
Ну, русские программисты всякой фигней страдают, а ты еще не видел какой фигней татарские программисты страдают! :lol:
Serge писал(а):
Одного 1КГц таймера разумеется мало. Нужен и планировщик чтобы переключиться в нужный момент на требуемую задачу.

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

Помнится я в свое время сделал механизм как раз для того чтобы переключиться на нужную задачу при чтении через DMA, но ты его успешно похерил (закомментил) заявив что я создаю неравноправные потоки, а теперь вот сам к такому же пришел но в другой ситуации.


Вернуться к началу
   
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:23 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Mario
Плееру для начала и быстрый таймер сгодится. Потому что типичная ситуация: все потоки в состоянии ожидания и os_idle мирно спит на hlt, хотя кадр надо было вывести 0.005 секунды назад.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:27 am 
Хм, а я думал что когда все потоки спят (по 10 функции к примеру), а один не спит, то этому поросенку достается главная сисьска с молоком. Разве не так?


Вернуться к началу
   
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:37 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Mario
Скорее всего. Но плеер так не свинячит. Если потоку надо подождать, честно отдаёт управление ядру.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 09, 2012 12:43 am 
Тогда надо изобрести 68.1 с параметром "Вот тебе мой велик квант, но чтобы через 2 часа миллисекунды вернул".


Вернуться к началу
   
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Чт апр 12, 2012 5:23 pm 
Не в сети
Just Flooding

Зарегистрирован: Сб янв 06, 2007 2:30 pm
Сообщения: 269
вот так люди постепенно доходят до jiffies. А потом и до dynticks.
Я неслабо прифигел, когда узнал что в винде последнее только в Win8 появилось.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Чт апр 12, 2012 9:00 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Serge писал(а):
art_zh писал(а):
А всего делов-то: попросить ядро прогнать короткий кусок юзерского кода, перезапустить таймер и выйти из прерывания
И каким образом ядро это сделает без смены контекста если адресные пространства не совпадут ?

Легко: перемаппит страницу юзеркода на кернелспейс, и запомнит точку входа.

Цитата:
Напоминает старый анекдот "и что только не придумают русские программисты, лишь бы не строить хорошие дороги писать драйверы"

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


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Чт апр 12, 2012 10:43 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
art_zh писал(а):
Легко: перемаппит страницу юзеркода на кернелспейс, и запомнит точку входа.
Вот тут "враг рода человеческого" и вылазит.
Или весь код должен быть позиционно-независимым или привязан к конкретному адресу, а страница должна быть расшарена на все адресные пространства. В итоге загрузка такого кода будет мало отличаться от загрузки драйвера. Даже адрес будет в кернелспейс. Вызвать функции ядра проблематично, линковки с ядром нет, а если есть, то нет разницы с PE или COFF.
Берём твою задачу - копирование пикселов из одного буфера в другой.
Оба буфера MMIO ? Значит должны быть замаплены в ядро и код должен иметь доступ к указателям. Код из юзерспейс такую операцию провести не может, значит нужен костыль в ядре и т.д. В итоге проще добавить весть код обработчика в ядро, как с клавиатурой, и не мучиться с костылями и хаками.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пт апр 13, 2012 1:24 am 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Serge
Не проще: юзерское окно должно отрисовываться приложением, а не ядром (это был бы полный изврат).
Кстати, а ты не путаешь Колибри с Линуксом :? - у нас уже давно "враг рода человеческого" в ядре прописался, можно удобно общаться с MMIO из юзерспейса.

А-ядро вообще кощунствует аки пусикатки - там железо может грузить данные прямо в буфер приложения, даже когда приложение спит - ядро только предоставило заинтересованным сторонам физ.адрес буфера - и отошло в сторонку.

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

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

Вот это будет реально аццкий отжиг. :twisted:


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пт апр 13, 2012 5:30 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
art_zh писал(а):
можно удобно общаться с MMIO из юзерспейса
В сильно хакнутой/заточенной -А ветке ? Так о том и речь.
Цитата:
юзерское окно должно отрисовываться приложением
В ядре есть способ донести в юзерспейс прерывание, и не только, через систему событий.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пт апр 13, 2012 8:06 pm 
Не в сети

Зарегистрирован: Ср сен 15, 2010 7:22 pm
Сообщения: 101
art_zh писал(а):
... то для второго - процесс переключения будет занимать в тысячи раз больше времени, чем сама задача. А всего делов-то: попросить ядро прогнать короткий кусок юзерского кода, перезапустить таймер и выйти из прерывания.
...


Во-первых, на мой взгляд, выражение "кусок юзерского кода" и "кусок кода в ring-3" - это несколько разные вещи;
во-вторых, автор явно писал в контексте проектирования (то есть не о том, что уже есть, а о том, что может быть было бы неплохо реализовать),
в-третьих, автор явно это писал для примера.

Лично я понял "кусок юзерского кода" в контексте драйвера Kolibri, а драйверы работают в ring-0. Поэтому последний спор для меня выглядит довольно странным... Или я что-то пропустил либо не знаю?

P.S. Пожалуйста простите, если я кого-то обидел :wink:


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пт апр 13, 2012 9:44 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 25, 2009 4:45 pm
Сообщения: 788
ring -3? А зачем в Колибри столь специфичная вещь (да и к тому же, только интеловская)?


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пт апр 13, 2012 10:43 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Serge писал(а):
art_zh писал(а):
можно удобно общаться с MMIO из юзерспейса
В сильно хакнутой/заточенной -А ветке ? -

нет, в самом что ни на есть кошерном транке: fn62:11,12,13.

A-ветка изначально задумывалась для железячников и любителей экстрима (и еще потому что в транк такие финты тащить нельзя). Потом я там слегка поэкспериментировал с графикой (и еще кое с чем), и заточил все под АМД-чипсеты - в транк теперь это при всем желании не влить.

Да и желания особого нет. Поскольку заинтересованных лиц за эти 2 года не появилось, а мне лично А-ветка очень нужна (именно в таком виде и даже хуже), то весьма вероятно что я ее в скором времени "закрою". Просто перестану выкладывать новые версии до прихода новых девелоперов.

FireWall
Я наверное неудачно выразил свою мысль: по запросу приложения после истечения заданного интервала времени ядро должно прогнать "кусок юзерского кода" не в Ring-3, а в Ring-0, куда его предварительно нужно перемаппить из юзерспейса.
В Третьем кольце такой обработчик нафиг не нужен.

Другое дело, что в транке такой сервис точно противопоказан - обязательно какой-нибудь пакостник повесит в ядро бомбу.


Вернуться к началу
 Заголовок сообщения: Re: Таймер
СообщениеДобавлено: Пн апр 16, 2012 8:39 pm 
Не в сети

Зарегистрирован: Ср сен 15, 2010 7:22 pm
Сообщения: 101
art_zh ! Вы то как раз хорошо выразили свою мысль, только Вас несколько "неудачно" поняли, что и привело к несколько странному спору! Но речь не об этом ... Вашу идею не так уж трудно реализовать - надо в таймер добавить код вроде (только на ассемблере :wink: ):

Код:
extern  timer_callback_t timer_cb[TIMER_CB_MAX]; /* TIMER_CB_MAX == 16 : вполне достаточно */

void timer_iirq_handler()
{
/*... */
for (int i = 0; i < TIMER_CB_MAX; i++)
{
  if (timer_cb[i] != NULL) timer_cb[i]();
}
/* ... */
}


А для драйверов ввести функцию, позволяющую добавлять и удалять обратные вызовы в timer_cb[TIMER_CB_MAX].

Если же говорить о конкретной теме, то я за системный вызов, позволяющий мультиплексировать обработчик таймера по принципу:

Код:
static int multiplex_index = 1; /* Предполагается, что таймер работает с частотой  multiplex_index*100 */
static int multiplex_i = 0;
void timer_iirq_handler()
{
if (multiplex_i == 0)
{
  multiplex_i = multiplex_index - 1;

... Старый код здесь ...

... А также новый:
if (timer_cb[i] != NULL) timer_cb[i]();

} else {
multiplex_i--;
if (timer_cb[i] != NULL) timer_cb[i]();
} /* if ... else */
}


P.S.

Что касается безопасности, то у меня приходят на ум три меры:
-1- вынести из корневой директории всё, что не запускается по умолчанию, но поместить туда все драйверы;
-2- на уровне файловой системы запретить какой-либо иной доступ к этой директории, за исключением запуска приложений и загрузки драйверов (т.е. файловый менеджер даже не должен видеть содержимое корневой директории загрузочного диска);
-3- запретить что-то грузить в ring-0 приложениям, не загруженным из корневой директории методом авто-загрузки;


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB