Проблема с чтением HDD в SMP-режиме

Для всех любителей и профессионалов этого нелегкого дела.

Модераторы: Почётные модераторы, Модераторы "Программирование"

Проблема с чтением HDD в SMP-режиме

Сообщение Diablo » 10 окт 2010, 17:40

Имеется следующий код для чтения HDD
Код: Выделить всё
;-------------------------------------------------------------------------------
%macro  ide_cmd 0       ;DX - port, AL - cnt, AH - sec, CX - cyl, BL - hd, BH - cmd
;       mov     dx,%1+2
;       mov     al,al   ;count
        push    ax
        out     dx,al   ;1f2
        inc     dx
        mov     al,ah   ;sec
        out     dx,al   ;1f3
        inc     dx
        mov     ax,cx   ;cyl_l
        out     dx,al   ;1f4
        inc     dx
        mov     al,ah   ;cyl_h
        out     dx,al   ;1f5
        inc     dx
        mov     ax,bx   ;hd     ;101DHEADb
        out     dx,al   ;1f6
        inc     dx
        mov     al,ah   ;cmd
        out     dx,al   ;1f7
        pop     ax
        xor     ah,ah
        or      al,al
        jne     %%cxok
        inc     ah      ;0h=100h=256 sectors
%%cxok  mov     cx,ax
%endmacro
;-------------------------------------------------------------------------------
%macro  ide_rwx 1       ;ARG = INSW/OUTSW
%%wait  in      al,dx
        test    al,00000001b    ;Error
        jne     %%exit
        test    al,00001000b    ;Wait for DRQ
        je      %%wait
        mov     ax,cx
        mov     cx,100h ;One sector - 512 byte - 100h words
        and     dl,0f0h ;1f0
rep     %1
        mov     cx,ax
        or      dl,7
        loop    %%wait
%%exit:
%endmacro
;-------------------------------------------------------------------------------
%macro  ide_io  1
        ide_cmd
        ide_rwx %1
%endmacro
;-------------------------------------------------------------------------------
;Read MBR
        mov     cx,ax
        mov     ax,0101h        ;AH - sec, AL - count(0 -> 256)
;       mov     cx,0000h        ;CX - cyl
        mov     bx,20A0h        ;BH - cmd(20h-read/30h-write), BL - 101DHEADb
        pusha
        push    ide2
;       push    grub
ide_rd  mov     dx,01f2h        ;DX - port+2
        ide_io  a32     insw    ;DX - port,AL - count,AH - sec, CX - cyl, BL - hd, BH - cmd
        ret
;-------------------------------------------------------------------------------

Простенький, без DMA и прочих фишек, но работающий.
Как только добавил в код поддержку Multi-Core и запустил дополнительные ядра, Bochs(виртуальная машина) стал ругаться:
Код: Выделить всё
00001363996e[HD   ] IO read(0x01f0) with drq == 0: last command was 20h

Что я делаю не так? :unknown:
ЗЫ Код, выполняемый на втором CPU ничего вредного не делает - просто выводит на экран различные символы.
Изображение
Аватара пользователя
Diablo
Флудер
 
Сообщения: 997
Зарегистрирован: 25 сен 2007, 12:42

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Diablo » 10 окт 2010, 19:05

Подозреваю, что второй процессор дергает шину и сбрасывает DRQ (DMA Request)
Возможно, надо добавить префикс LOCK перед командами ввода-вывода...
LOCK Запирание шины писал(а):Префикс lock, помещенный перед командой, устанавливает сигнал на линии LOCK системной шины и запрещает доступ к шине другим процессорам на время выполнения данной команды. Этот префикс предназначен для использования в многопроцессорных многозадачных системах для обеспечения исключительного доступа к памяти данного процесса (и данного процессора) на время проверки или модификации некоторой ячейки памяти.
Изображение
Аватара пользователя
Diablo
Флудер
 
Сообщения: 997
Зарегистрирован: 25 сен 2007, 12:42

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Diablo » 10 окт 2010, 19:10

Куда там...
Код: Выделить всё
00001340361i[CPU0 ] LOCK prefix unallowed (op1=0xec, attr=0x0, mod=0x0, nnn=0)
Изображение
Аватара пользователя
Diablo
Флудер
 
Сообщения: 997
Зарегистрирован: 25 сен 2007, 12:42

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Minimaks » 13 окт 2010, 21:47

Мне кажеться твои темы не для этого форума =)
ОП ООО "Минимакс (Питер)"
Minimaks
 
Сообщения: 234
Зарегистрирован: 28 июн 2010, 14:03

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Diablo » 13 окт 2010, 23:44

Minimaks писал(а):Мне кажеться твои темы не для этого форума =)

Да, мне тоже так думается :) Но, хочется в городе найти единомышленников, нереально крутых гуру :)
Чтоб было можно с ними в реале пообщаться, пивка попить, серьёзную команду собрать... А я ведь еще только учусь :-) Только вот учитилей мало :unknown:
wasm.ru далеко, Крис Касперски еще недоступнее навен...
Ну неужели у нас на 500тыс населения только я один на асме пишу? :crazy:
Изображение
Аватара пользователя
Diablo
Флудер
 
Сообщения: 997
Зарегистрирован: 25 сен 2007, 12:42

Re: Проблема с чтением HDD в SMP-режиме

Сообщение MGNSupport » 06 ноя 2010, 22:37

Вполне возможно, что есть еще пара-тройка. но они еще браузер не написали, поэтому тут не тусуются.
;)
Аватара пользователя
MGNSupport
Магинфо
Магинфо
 
Сообщения: 2202
Зарегистрирован: 17 сен 2007, 19:50

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Minimaks » 07 ноя 2010, 12:51

Мне кажеться любую проблему можно решить в связке linux kernel + С++
В ядре уже реализована полноценная поддержка любого процессора в любом режиме и еще много сладостей. А модульность позволяет липить то что нужно.
ОП ООО "Минимакс (Питер)"
Minimaks
 
Сообщения: 234
Зарегистрирован: 28 июн 2010, 14:03

Re: Проблема с чтением HDD в SMP-режиме

Сообщение Seven » 08 ноя 2010, 12:18

ИМХО сейчас ASM используется только для ускорения каких то больших циклов расчетов, но ни как для доступа к винту или в память.... не, можно конечно, но наврятли твой велосипед будет чем то лучше уже изобретенных... я вот асм использовал для перемножения/сложения/вычитания очень больших чисел... а обертка все равно на С++ была.
Аватара пользователя
Seven
 
Сообщения: 1272
Зарегистрирован: 25 сен 2007, 09:12
Откуда: Магнитогорск


Вернуться в Программирование

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

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