3

Я экспериментирую с Linux и пытаюсь понять процесс начальной загрузки. По крайней мере, в системах, в которые я играл с udev, есть "модуль", который обнаруживает устройства. Однако, как только он обнаружен, он каким-то образом "добавляется" в список доступных интерфейсов, и вы можете выполнить команду "ip link set dev up". До этого шага, хотя он не будет распознавать имя устройства.

У меня вопрос, где это происходит, и какая команда используется?

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

Это должно произойти довольно рано, и в моей системной среде, когда я выполняю команду systemctl, есть запись "device" как sys-subsystem-net-devices-ens33.device.

Не совсем понятно, как эта запись добавляется в список устройств или какие команды она выполняет.

Спасибо за любую помощь, я искал, но детали этого процесса не было легко найти.

1 ответ1

2

Там нет команды. Во-первых, это делается не пользовательским пространством, а полностью Ethernet-драйвером карты, который использует register_netdev() из подсистемы "net" ядра для создания нового интерфейса.

Процесс примерно такой:

  1. Ядро обнаруживает устройство PCI или USB, создает "модалии", описывающие его, и отправляет событие, объявляющее об устройстве, udev. Например:

    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
    DEVTYPE=usb_device
    SUBSYSTEM=usb
    ...
    
    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0
    DEVTYPE=usb_interface
    MODALIAS=usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00
    SUBSYSTEM=usb
    ...
    
  2. udev получает событие, обрабатывает его в соответствии с правилами (запускает вспомогательные инструменты, добавляет различные метаданные, создает символические ссылки) и отправляет его снова, на этот раз различным программам, использующим libudev.

  3. Один из файлов правил udev, 80-drivers.rules , обрабатывает события, содержащие MODALIAS= и использует libkmod для загрузки любых модулей ядра, соответствующих этому псевдониму. (Раньше он запускал modprobe для загрузки модуля. Вы все равно можете передать модалию в modprobe или modinfo .)

    $ modinfo usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00
    filename:       /lib/modules/4.7.2-1-ARCH/kernel/drivers/net/usb/ax88179_178a.ko.gz
    description:    ASIX AX88179/178A based USB 3.0/2.0 Gigabit Ethernet Devices
    alias:          usb:v0DF6p0072d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v2001p4A00d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0B95p178Ad*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0B95p1790d*dc*dsc*dp*ic*isc*ip*in*
    depends:        usbnet,usbcore,mii
    ...
    

    Так что для этого устройства udev загрузит драйвер ax88179_178a .

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

  5. Функция probe драйвера выполняет любую необходимую микросхему чипа для включения устройства, его инициализации, настройки и, наконец, вызова register_netdev() для создания реального интерфейса Ethernet для себя.

    (Для USB-устройств некоторые драйверы откладывают зондирование до модуля usbnet , который выполняет большую часть стандартной работы USB и создает реальный интерфейс Ethernet, а вызывает только основной драйвер для выполнения аппаратно-специфической магии.)

    Sep 04 21:25:11 kernel: ax88179_178a 2-1.3:1.0 eth1: register 'ax88179_178a'
    ↵ at usb-0000:00:1d.0-1.3, ASIX AX88179 USB 3.0 Gigabit Ethernet, 8c:ae:4c:f4:06:33
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .