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

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 18 фев 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    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

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    n-то у тебя локальная переменная а не глобальная
     
  3. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    ну а при глобальной надо использовать volatile, и на dual core будет глючить. Используй системный spinlock.
     
  4. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Не понял, что будет глючить на dual core - моя локальная переменная или глобальная? и почему?
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    ov4inka, локальная - просто маразм. У каждого потока свой стек, на котором и выделена переменная.

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

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    При чем тут вообще спинлоки?

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

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

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    кстати о птычках - если процесс вызвал ДевицеИоКонтрол которое внутри зависло - то процесс этот не убить вообще ничем, кроме ребута
    Видел такое на виртуал-боксе недавно ;')
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это очевидно.
     
  9. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    "Девице" это мощно :) Тов-щ програмер, а транскрипцию в словарике посмотреть слабо? Ну или сразу произношение на http://www.merriam-webster.com
     
  10. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    s0larian
    я учился в англ.спецшколе, жыл немного в юса и инглиш соответственно флюент
    это я балуюс :_)