Устройства, драйвера, и все это
До сих пор, мы весьма немного говорили относительно сетевых интерфейсов и общих проблем TCP/IP, но не говорили о том, что происходит, когда "сетевой код" в ядре обращается к аппаратным средствам. Для этого, мы должны немного поговорить о концепциях интерфейсов и драйверов.
Во-первых, конечно, имеются непосредственно аппаратные средства, например Ethernet карта: пластина из эпоксидной смолы, утыканная большим количеством крошечных чипов с глупыми номерами на них, и воткнутая в слот вашего PC. Это - то что мы обычно называем устройством.
Для того чтобы использовать Ethernet карту, необходимы специальные функции, расположенные в ядре вашего Linux, которые знают как работать с этим устройством. Это так называемые драйвера устройств. Например, Linux имеет драйвера устройства для нескольких марок Ethernet плат которые очень похожи по выполняемым функциям. Они известны как "Becker Series Drivers" ,и называются так по имени их автора, Donald Becker. Другой пример - D-link драйвер, который работает с адаптером D-link пакетов, присоединяемым к параллельному порту.
Но, что мы подразумиваем, когда говорим что драйвер "управляет" устройством? Давайте вернемся к Ethernet плата, которую мы уже упоминали. Драйвер должен быть способен работать с переферией этой платы: он должен посылать команды и данные плате, в то время как плата должна передать полученные данные драйверу.
В PC, эта связь устанавливается через область памяти ввода-вывода которая является отображением регистров платы и т.п. Все команды и данные которые ядро посылает плате проходят через эти регистраторы. Память ввода-вывода описывается указанием начального(или основного) адреса Типичные основные адреса для Ethernet плат 0x300, или 0x360.
Обычно, Вы не должны волноваться относительно проблем аппаратных средств, типа основного адреса, потому что ядро делает попытку во время загрузки обнаружить местоположение платы. Это называется autoprobing(автоматический поиск), который означает что ядро во время загрузки считывает несколько участков памяти и сравнивает считанные данные с тем, что должны быть, если установлена Ethernet. Однако, существуют Ethernet платы, которые ядро не может автоматически обнаружить; это часто случается с дешевыми Ethernet картами.
Также, во время загрузки, ядро будет пытаться обнаружить только одно Ethernet устройство. Если вы используете больше чем одну плату, Вы должны явно сообщить ядру об этой плате.
Другой параметр, который Вы могли бы сообщить ядру -- interrupt request channel (канал прерывания запроса). Компоненты аппаратных средств обычно прерывают ядро когда они нуждаются во внимании, например когда прибыли данные, или произошли другие события. В PC, прерывание может происходить на одном из 15 каналов (0, 1, 3 и до 15). Номер прерывания назначенный компоненту аппаратных средств называется interrupt request channel или IRQ.
Как описано в главе 3., ядро обращается к устройствам через так называемый интерфейс. Интерфейсы предлагают абстрактный набор функций, которые являются стандартными для всех типов аппаратных средств, типа посылки или получения дэйтаграм.
Интерфейсы идентифицируются посредством имен. Эти имена определенны внутри ядра, это не файлы устройств в директории /dev. Типичные имена для интерфейсов Ethernet. - eth0, eth1, и т.д. Назначение интерфейсов для определенных устройств обычно зависит от способа, которым устройства конфигурированы; например первая установленная Ethernet плата станет eth0, следующая -- eth1, и так далее. Исключение из этого правила - SLIP интерфейсы, которые назначаются динамически; То есть всякий раз, когда устанавливается SLIP связь, последовательному порту назначается интерфейс
Картинка пробует показать связь между аппаратными средствами, драйверами устройств и интерфейсами.
Во время загрузки, ядро показывает какие устройства обнаружены, и какому какой интерфейс будет установлен. Фрагмент типичного экрана загрузки:
This processor honours the WP bit even when in supervisor mode. Good. Floppy drive(s): fd0 is 1.44M Swansea University Computer Society NET3.010 IP Protocols: ICMP, UDP, TCP PPP: version 0.2.1 (4 channels) OPTIMIZE FLAGS TCP compression code copyright 1989 Regents of the University of California PPP line discipline registered. SLIP: version 0.7.5 (4 channels) CSLIP: code copyright 1989 Regents of the University of California dl0: D-Link DE-600 pocket adapter, Ethernet Address: 00:80:C8:71:76:95 Checking 386/387 coupling... Ok, fpu using exception 16 error reporting. Linux version 1.1.11 (okir@monad) #3 Sat May 7 14:57:18 MET DST 1994
Здесь показано что ядро компилировалось с TCP/IP, и с драйверами для SLIP, CSLIP, и PPP. Третья строка c низу сообщает, что был обнаружен адаптер d-link, и он установился как интерфейс dl0. Если Вы имеете Ethernet карту, ядро обычно печатает строку, начинающуюся с eth0, и сопровождаемую типом обнаруженной карты. Если Вы имеете Ethernet карту, но не увидели это сообщение, это означает что ядро неспособно обнаружить вашу плату. Об этом мы поговорим позже.