Есть ли способ позвонить в ядро ​​Linux с моей собственной Softirq

Аналогично тому, как работает системный вызов int 0x80Можно ли реализовать свой собственный ISR внутри ядра, чтобы на softirq предполагать int 0x120 или с любым другим программным счетчиком softirq можно переходить из пространства пользователя в пространство ядра?

Вход в ядро ​​в привилегированном режиме связан только с int 0x80или с любой реализацией softirq я могу войти в привилегированный режим автоматически или для отключения защищенного режима и входа в привилегированный режим мы должны сделать это вручную, написав соответствующий флаг?

и еще одна вещь, если возможно реализовать этот тип ISR, является ли наилучшим из возможных способов обмена данными с регистрами EBX, ECX, EDX, ESI, EDI и EBP или каким-либо другим способом все еще существует?

Я уже видел, как определить и запустить мой собственный новый softirq в ядре Linux? но не получил решение, которое я искал.

Я сделаю это более ясным, зачем мне это нужно
Я реализовал несколько функций ядра, которые напрямую взаимодействуют с аппаратными периферийными устройствами, и я хочу, чтобы они запускались из пространства пользователя с помощью программного прерывания. не могу использовать системные вызовы с доступной архитектурой драйвера, потому что мне нужно сократить время выполнения.

1 ответ

Решение

Во-первых, программные прерывания и softirq совершенно разные: программное прерывание - это инструкция по сборке для переключения из пользовательского режима в режим привилегий, и это то, что вам нужно, softirq - это механизм разделения аппаратного обработчика прерываний на верхнюю и нижнюю половины.

На ваш вопрос - вам нужно написать ассемблерный код и изменить код, специфичный для платформы

  1. Вам нужно определить номер int в Linux arch/x86/include/asm/irq_vectors.h:

    #define MY_SYSCALL_VECTOR             0x120
    
  2. Измените функцию trap_init в Linux arch/x86/kernel/traps.c:

    set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32);
    
  3. Теперь вам нужно написать функцию сборки entry_INT120_32, Вы можете увидеть пример в файле: arch/x86/entry/entry_32.S начинается с ENTRY(entry_INT80_32),

Вам нужно будет позаботиться о регистрах процессора, как описано в начале entry_32.S файл.

Другие вопросы по тегам