Как связаться между сетевой картой и драйвером Ethernet?
Я пытаюсь построить unikernel в Rust, который загрузит и запустит веб-сервер. Я использую Qemu для тестирования.
До сих пор мне удалось написать ОС с поддержкой сегментации, подкачки страниц и прерываний, следя за различными онлайн-блогами и проектами на github. Ядро запущено и работает и способно обнаруживать программные прерывания, а также аппаратные прерывания, если такое прерывание имеет вид int 32
явно называется. После этого я включил порты ввода-вывода и реализовал все функции ввода-вывода портов, такие как inb
,outb
,inl
,outl
,inw
,outw
это помогает мне читать и писать в порт. Я где-то читал, что так драйвер и устройство взаимодействуют друг с другом. Используя их, я использовал метод зонда для обнаружения периферийных устройств. В qemu было обнаружено 3 устройства.
Одним из таких устройств является Intel 82540EM Ethernet Controller
с идентификатором устройства 0x100e
и идентификатор поставщика 0x8086
, Я пытаюсь связаться с этим драйвером для осуществления передачи и приема пакетов, которые завершат мой проект. Я понял, что вся связь между сетевой картой и драйвером происходит через порты ввода-вывода устройства.
Но я не мог четко понять, что происходит на заднем плане. Итак, может кто-нибудь объяснить мне -Как мы узнаем, что какой-то новый пакет прибыл на сетевую карту?