Page 1 of 2

Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 12:53 pm
by Mario
Заметил тут такую вещь - упакованные версии плеера Fplay блокируют при запуске систему. Особенно заметно на курсоре - он замирает достаточно надолго. Я попробовал прописать вызов отрисовки курсора в обработчик irq0, в самое начало, но не помогло. Получается на время распаковки бинарника, упакованного LZMA, система тупо теряет обработку прерываний.

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

Я посмотрю, что можно сделать с распаковщиком в ядре, но не факт что быстро решу проблему.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 1:15 pm
by Mario
В dll.inc есть процедура load_file, в ней присутствует следующее гениальное решение:

Code: Select all

        pushfd
        cli
        stdcall unpack, [file], eax
        popfd
Плевать на прерывания, многозадачность и прочие мелкие радости жизни! РаспакоФка наше фсе! Чем собственно и занимается трудолюбивый CPU. :mrgreen:

Если убрать cli то блокировка исчезает. Однако у меня нет уверенности, что это не вызовет каких либо дополнительных конфликтов.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 1:38 pm
by Mario
Итак счастье случилось в r. 1275 или сразу после выпуска K0750.
Остается гадать - это случайно забытая временная затычка для отладки или постоянное решение для загрузки видеодрайвера ATI. У меня нет видеокарт ATI, чтобы проверить и вынести точный вердикт.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 2:55 pm
by Mario
SVN r. 2486 - исправление для ревизии 1275.

Заменил CLI на мьютекс:
Spoiler:

Code: Select all

        push    eax
.wait_lock:
        cmp     [unpack_mutex], 0
        je      .get_lock
        call    change_task
        jmp     .wait_lock

.get_lock:
        mov     eax, 1
        xchg    eax, [unpack_mutex]
        test    eax, eax
        jnz     .wait_lock
        pop     eax

        stdcall unpack, [file], eax

        mov     [unpack_mutex], 0
Да, и эти люди запрещают мне ковыряться в носу лишний раз вызывать перерисовку курсора. "Лучше день потерять, а потом за 5 минут долететь!" говорят они. :wink:

З.Ы. Зашибись! Пообщался с умным человеком - с самим собой. :?

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 7:53 pm
by kogemyaka
Есть как раз ATI. Дай этот fplay -проверю.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 8:02 pm
by Mario
Уже не нужно. Я не стал убирать блокировку. поскольку процедура распаковки не реентерабельна (используются глобальные переменные вместо локальных). Просто заменил "тяжелый" вариант CLI на более "легкий" вариант с мьютексом. Теперь блокируется только вызов процедуры распаковки (кто первым встал - того и тапки), а прерывания и остальные вещи происходят нормально.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:23 pm
by Serge
Mario
У ядра есть свои блокирующие мьютексы: mutex_init() mutex_lock() mutex_unlock()

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:29 pm
by Mario
Вообще то, по хорошему, такие фундаментальнsе вещи должны иметь документацию, хотя бы краткую. Пока такой документации нету - я не буду переделывать свой код. Если есть желание сделать лучше чем сделано - я не возражаю.

З.Ы. Да, и как я уже сказал в чате - я не сам выдумал код мьютекса, а взял готовое решение из taskman.inc и значит раз оно там присутствует, то оно вполне жизнеспособно.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:35 pm
by Serge
Я давал описание в одной из тем, а насчёт общей документации согласен.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:43 pm
by Mario
Ну, раз ты сам не помнишь - где ты давал описание, то я тем более его не смогу выделить из обсуждаемых вопросов, где вы с Артемом просто болтали.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:53 pm
by Serge
Все описания функций ядра я даю в одной теме, разумеется её никто не читает и поиском не пользуется.

Re: Запуск тяжелых приожений

Posted: Wed Mar 21, 2012 11:59 pm
by Mario
Я не работал с линуксовыми мьютексами и понимаю отнюдь не всю специфику обсуждаемую.
Еще я плохо знаю Сишный синтаксис и не знаю как запись вида:

Code: Select all

void __attribute__ ((fastcall)) mutex_lock(struct mutex*);
должна выглядеть для ассемблера.

Re: Запуск тяжелых приожений

Posted: Thu Mar 22, 2012 12:11 am
by Serge
Например так

Code: Select all

        mov     ecx, heap_mutex
        call    mutex_lock
В ядре много примеров.

Re: Запуск тяжелых приожений

Posted: Thu Mar 22, 2012 12:14 am
by Mario
Хорошо, попробую.

Re: Запуск тяжелых приожений

Posted: Thu Mar 22, 2012 1:40 am
by Mario
И вот это вот портянка:
Spoiler:

Code: Select all

align 4
mutex_lock:

        dec     [ecx+MUTEX.count]
        jns     .done

        pushfd
        cli

        sub     esp, sizeof.MUTEX_WAITER

        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head

        mov     edx, [TASK_BASE]
        mov     [esp+MUTEX_WAITER.task], edx

.forever:

        mov     eax, -1
        xchg    eax, [ecx+MUTEX.count]
        dec     eax
        jz      @F

        mov     [edx+TASKDATA.state], 1
        call    change_task
        jmp     .forever
@@:
        mov     edx, [esp+MUTEX_WAITER.list.next]
        mov     eax, [esp+MUTEX_WAITER.list.prev]

        mov     [eax+MUTEX_WAITER.list.next], edx
        mov     [edx+MUTEX_WAITER.list.prev], eax
        cmp     [ecx+MUTEX.lhead.next], ecx
        jne     @F

        mov     [ecx+MUTEX.count], 0
@@:
        add     esp, sizeof.MUTEX_WAITER

        popfd
.done:
        ret
стоит того чтобы заменить:
Spoiler:

Code: Select all

        push    eax
.wait_lock:
        cmp     [unpack_mutex], 0
        je      .get_lock
        call    change_task
        jmp     .wait_lock

.get_lock:
        mov     eax, 1
        xchg    eax, [unpack_mutex]
        test    eax, eax
        jnz     .wait_lock
        pop     eax
В обоих случаях есть столь "ненавистный":

Code: Select all

        call    change_task
Да еще и CLI задействуется. :(

Я конечно переделаю, но люди иногда хотят странного - моя не понимат!