Есть ли способ позвонить в ядро Linux с моей собственной Softirq
Аналогично тому, как работает системный вызов int 0x80
Можно ли реализовать свой собственный ISR внутри ядра, чтобы на softirq предполагать int 0x120
или с любым другим программным счетчиком softirq можно переходить из пространства пользователя в пространство ядра?
Вход в ядро в привилегированном режиме связан только с int 0x80
или с любой реализацией softirq я могу войти в привилегированный режим автоматически или для отключения защищенного режима и входа в привилегированный режим мы должны сделать это вручную, написав соответствующий флаг?
и еще одна вещь, если возможно реализовать этот тип ISR, является ли наилучшим из возможных способов обмена данными с регистрами EBX, ECX, EDX, ESI, EDI и EBP или каким-либо другим способом все еще существует?
Я уже видел, как определить и запустить мой собственный новый softirq в ядре Linux? но не получил решение, которое я искал.
Я сделаю это более ясным, зачем мне это нужно
Я реализовал несколько функций ядра, которые напрямую взаимодействуют с аппаратными периферийными устройствами, и я хочу, чтобы они запускались из пространства пользователя с помощью программного прерывания. не могу использовать системные вызовы с доступной архитектурой драйвера, потому что мне нужно сократить время выполнения.
1 ответ
Во-первых, программные прерывания и softirq совершенно разные: программное прерывание - это инструкция по сборке для переключения из пользовательского режима в режим привилегий, и это то, что вам нужно, softirq - это механизм разделения аппаратного обработчика прерываний на верхнюю и нижнюю половины.
На ваш вопрос - вам нужно написать ассемблерный код и изменить код, специфичный для платформы
Вам нужно определить номер int в Linux
arch/x86/include/asm/irq_vectors.h
:#define MY_SYSCALL_VECTOR 0x120
Измените функцию trap_init в Linux
arch/x86/kernel/traps.c
:set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32);
Теперь вам нужно написать функцию сборки
entry_INT120_32
, Вы можете увидеть пример в файле:arch/x86/entry/entry_32.S
начинается сENTRY(entry_INT80_32)
,
Вам нужно будет позаботиться о регистрах процессора, как описано в начале entry_32.S
файл.