Вопрос про спин-блоки

Discussion in 'WASM.NT.KERNEL' started by ov4inka, Feb 18, 2009.

  1. ov4inka

    ov4inka New Member

    Blog Posts:
    0
    Joined:
    Dec 1, 2008
    Messages:
    37
    Всем здравствуйте! Начал разбираться с написанием драйверов и вот вопросик появился. Поможите.

    Написал вот такую простенькую функцию-обработчик.

    NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
    {
    PIO_STACK_LOCATION io_stack;
    int n = 1;

    io_stack = IoGetCurrentIrpStackLocation(Irp);

    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_MY_FYRST_ZAP:
    for(;n == 1;);
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(
    Irp,
    (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ?
    IO_DISK_INCREMENT : IO_NO_INCREMENT)
    );

    break;
    case IOCTL_MY_SECOND_ZAP:
    n = 2;
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(
    Irp,
    (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ?
    IO_DISK_INCREMENT : IO_NO_INCREMENT)
    );
    break;
    default:
    break;
    }

    return STATUS_SUCCESS;
    }

    Произвожу обращение к устройству сначала вызовом IOCTL_MY_FYRST_ZAP. Он входит в бесконечный цикл проверки n. После чего вызываю IOCTL_MY_SECOND_ZAP. Ожидал, что закончится выполнение обоих запросов. Но вот нет! Первый так и продолжает думать что n = 1. Получается, что при вызове данных функций происходит сохранение всех переменных в каком-то контексте, а после возвращения, вновь извлечение. Тогда вопрос: зачем нужны спин-блокировки, если и так не получается затереть переменную? Или я чего-то не улавливаю?

    Заранее спасибо.
     
  2. SashaTalakin

    SashaTalakin New Member

    Blog Posts:
    0
    Joined:
    Dec 15, 2008
    Messages:
    261
    n-то у тебя локальная переменная а не глобальная
     
  3. s0larian

    s0larian New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2004
    Messages:
    489
    Location:
    Крыжёпполь
    ну а при глобальной надо использовать volatile, и на dual core будет глючить. Используй системный spinlock.
     
  4. ov4inka

    ov4inka New Member

    Blog Posts:
    0
    Joined:
    Dec 1, 2008
    Messages:
    37
    Не понял, что будет глючить на dual core - моя локальная переменная или глобальная? и почему?
     
  5. s0larian

    s0larian New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2004
    Messages:
    489
    Location:
    Крыжёпполь
    ov4inka, локальная - просто маразм. У каждого потока свой стек, на котором и выделена переменная.

    Глобальная + volatile будет работать т.к. ты хочешь, но для нормальной синхронизации (более сложные случаи) надо использовать spinlock.
     
  6. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    При чем тут вообще спинлоки?

    PS. так же можно сделать ее static внутри функции. Хотя, по сути, та же фигня, что глобальная.

    UPD: Понял, при чем тут спинлоки.))
     
  7. z0mailbox

    z0mailbox z0

    Blog Posts:
    0
    Joined:
    Feb 3, 2005
    Messages:
    635
    Location:
    Russia СПБ
    кстати о птычках - если процесс вызвал ДевицеИоКонтрол которое внутри зависло - то процесс этот не убить вообще ничем, кроме ребута
    Видел такое на виртуал-боксе недавно ;')
     
  8. x64

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    Это очевидно.
     
  9. s0larian

    s0larian New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2004
    Messages:
    489
    Location:
    Крыжёпполь
    "Девице" это мощно :) Тов-щ програмер, а транскрипцию в словарике посмотреть слабо? Ну или сразу произношение на http://www.merriam-webster.com
     
  10. z0mailbox

    z0mailbox z0

    Blog Posts:
    0
    Joined:
    Feb 3, 2005
    Messages:
    635
    Location:
    Russia СПБ
    s0larian
    я учился в англ.спецшколе, жыл немного в юса и инглиш соответственно флюент
    это я балуюс :_)