В общем такая ситуация: есть набор прерываний (protected mode) и обработчиков, а-ля МС-ДОС, и есть жалкое подобие "потоков". Вдруг какой то поток вызвал прерывание (например печать символа), тут же заработал обработчик, начал чё то делать. Внимание, вопрос: как обработчик может узнать, какой поток вызвал прерывание? Можно конечно глянуть в диспетчер процессов и там узнать, какой поток был последний активный, но это как то скучно :] Может есть иные способы?
а где его получить? к примеру этот код: Код (Text): mov al, 1h int 030h очищает экран, но пользоваться этим прерыванием могут только привилегированные приложения. а вот кусок кода обработчика: Код (Text): int30function1: call cleanScreen jmp EOI
Daggo Реализация потоков подразумевает управление списком thread control blocks (TCB) вида: Код (Text): typedef struct _TCB { struct _TCB *next; struct _TCB *prev; uint8_t quantums_total; uint8_t quantums_left; uint16_t tid; uint16_t parent_tid; uint16_t owner_pid; uint16_t reserved; uint16_t terminated; PCB *owner_pcb; CONTEXT context; addr_t stack_ptr; size_t stack_size; addr_t entry_point; } TCB; При передаче управления некоторому потоку из такого списка планировщик потоков обязан для каждого процессора/ядра сохранять указатель на TCB потока, которому было передано управление. Кроме того планировщик должен предоставлять набор API для работы с потоками. Среди них должна присутствовать функция аналогичная GetCurrentTCB, которая возвращает указатель на текущий TCB текущего ядра.
А вообще достаточно сложно предполагать в каком режиме вы работаете. Может в реальном и линейных адресов, может процессор не x86 семейства.
Если что, программные прерывания обычно обрабатываются в том же потоке, в котором они вызываются, поэтому либо "GetCurrentTCB", либо прямое обращение к соответствующей переменной ядра, если обработку выполняет код ядра.