а кто это сделал!? o_O

Тема в разделе "WASM.OS.DEVEL", создана пользователем Daggo, 31 янв 2012.

  1. Daggo

    Daggo Артём

    Публикаций:
    0
    Регистрация:
    12 янв 2012
    Сообщения:
    7
    Адрес:
    Самара
    В общем такая ситуация: есть набор прерываний (protected mode) и обработчиков, а-ля МС-ДОС, и есть жалкое подобие "потоков". Вдруг какой то поток вызвал прерывание (например печать символа), тут же заработал обработчик, начал чё то делать.
    Внимание, вопрос: как обработчик может узнать, какой поток вызвал прерывание?
    Можно конечно глянуть в диспетчер процессов и там узнать, какой поток был последний активный, но это как то скучно :]
    Может есть иные способы?
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Не устраивает адрес возникновения прерывания, передавайте параметр-описатель потока.
     
  3. Daggo

    Daggo Артём

    Публикаций:
    0
    Регистрация:
    12 янв 2012
    Сообщения:
    7
    Адрес:
    Самара
    а где его получить?

    к примеру этот код:
    Код (Text):
    1. mov al, 1h
    2. int 030h
    очищает экран, но пользоваться этим прерыванием могут только привилегированные приложения.

    а вот кусок кода обработчика:
    Код (Text):
    1. int30function1:
    2.     call cleanScreen
    3.     jmp EOI
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Daggo
    Реализация потоков подразумевает управление списком thread control blocks (TCB) вида:
    Код (Text):
    1. typedef struct _TCB
    2. {
    3.     struct _TCB *next;
    4.     struct _TCB *prev;
    5.     uint8_t quantums_total;
    6.     uint8_t quantums_left;
    7.     uint16_t tid;
    8.     uint16_t parent_tid;
    9.     uint16_t owner_pid;
    10.     uint16_t reserved;
    11.     uint16_t terminated;
    12.     PCB *owner_pcb;
    13.     CONTEXT context;
    14.     addr_t stack_ptr;
    15.     size_t stack_size;
    16.     addr_t entry_point;
    17. } TCB;
    При передаче управления некоторому потоку из такого списка планировщик потоков обязан для каждого процессора/ядра сохранять указатель на TCB потока, которому было передано управление. Кроме того планировщик должен предоставлять набор API для работы с потоками. Среди них должна присутствовать функция аналогичная GetCurrentTCB, которая возвращает указатель на текущий TCB текущего ядра.
     
  5. Daggo

    Daggo Артём

    Публикаций:
    0
    Регистрация:
    12 янв 2012
    Сообщения:
    7
    Адрес:
    Самара
    уже понятнее)
     
  6. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    А вообще достаточно сложно предполагать в каком режиме вы работаете.
    Может в реальном и линейных адресов, может процессор не x86 семейства.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если что, программные прерывания обычно обрабатываются в том же потоке, в котором они вызываются, поэтому либо "GetCurrentTCB", либо прямое обращение к соответствующей переменной ядра, если обработку выполняет код ядра.