?

Log in

entries friends calendar profile Мой сайт Previous Previous Next Next
Solaris device drivers. Introduction. - Opensolaris
generos
ru_opensolaris
generos
Solaris device drivers. Introduction.
Это начало перевода статьи Макса Брюнинга, оригинал статьи можно найти здесь.  Работа над переводом всё ещё в процессе, но если вам просто будет содержимое, дайте об этом знать, это придаст сил переводчикам. Если есть какие-то моменты, которые кажутся спорными, опять же дайте пожалуйста знать переводчикам через этот пост.


Введение.

Этот параграф описывает, каким образом выглядят устройства для пользователей Solaris а именно, раположение и организация файлов устройств. Таже даётся обзор драйверов устройств для Solaris'a и Linux'a, список процедур и структур данных, необходимых для написания драйверов устройств на обоих системах, вкупе с кратким описанием. Список сходств и различий между процедурами и структурами данных представлен в таблице.

И в Solaris, и в Linux драйверы устройств служат одной и той же цели: предоставить средство управления и доступа к устройствам как для системы, так и для пользователей системы. По большей части пользователи получают доступ к устройствам через стандартные системные вызовы ввода/вывода: open(2), close(2), read(2), write(2), ioctl(2), poll(2), mmap(2), readv(2), writev(2). Эти системные вызовы в итоге вызывают процедуры драйвера устройства. Кроме того, сама операционная система вызывает драйверные процедуры для обработки страничных прерываний (page fault) и управления различными типами шин, которые могут присутствовать в системе.  Административные системные вызовы также могут вызывать процедуры драйвера устройства.


Архитектура системы и дерево устройств

В Solaris устройства организованы в виде "дерева устройств". Каждый узел дерева представляет устройство.  Дерево устройств показывает топологию устройств в системе. Другими словами, оно показывет дерево каталогов которое соответствует местоположению в устройства в системе. Пользователи и програмы могут исследовать его через дерево каталогов /devices и при помощи команды  prtconf(1). Вот пример несколько урезанного вывода:

bash-2.05b# ls -R /devices
/devices: <--->"корень" дерева устройств
isa      pci@0,0         pseudo:devctl     xsvc
objmgr   pci@0,0:devctl  scsi_vhci         xsvc:xsvc
options  pseudo          scsi_vhci:devctl

/devices/isa: <--->в системе присутствует шина isa
asy@1,2f8    asy@1,2f8:b,cu  i8042@1,60  lp@1,3bc:ecpp0 <--->устройства на шине isa
asy@1,2f8:b  fdc@1,3f0       lp@1,3bc

/devices/isa/fdc@1,3f0: <--->контроллер дисковода на шине isa
fd@0,0   fd@0,0:a,raw fd@0,0:b,raw fd@0,0:c,raw <--- дисководы/слайсы
fd@0,0:a fd@0,0:b     fd@0,0:c

/devices/isa/i8042@1,60: <--->
контроллер i8042
keyboard@0 keyboard@0:kb8042 mouse@1 mouse@1:l

/devices/pci@0,0: <--->мост pci-host
pci-ide@7,1      pci8086,7112@7,2    pci8086,7112@7,2:hubd
pci1014,130@2    pci8086,7112@7,2:1  pci8086,7191@1
pci1014,130@2,1  pci8086,7112@7,2:2  pci8086,7191@1:devctl

/devices/pci@0,0/pci-ide@7,1: <--->мост pci-ide
ide@0  ide@0:control  ide@1  ide@1:control

/devices/pci@0,0/pci-ide@7,1/ide@0: <--->первый контроллер ide
cmdk@0,0        cmdk@0,0:e      cmdk@0,0:i,raw  cmdk@0,0:n      cmdk@0,0:r,raw <--->disks/slices
cmdk@0,0:a      cmdk@0,0:e,raw  cmdk@0,0:j      cmdk@0,0:n,raw  cmdk@0,0:s
cmdk@0,0:a,raw  cmdk@0,0:f      cmdk@0,0:j,raw  cmdk@0,0:o      cmdk@0,0:s,raw
cmdk@0,0:b      cmdk@0,0:f,raw  cmdk@0,0:k      cmdk@0,0:o,raw  cmdk@0,0:t
cmdk@0,0:b,raw  cmdk@0,0:g      cmdk@0,0:k,raw  cmdk@0,0:p      cmdk@0,0:t,raw
cmdk@0,0:c      cmdk@0,0:g,raw  cmdk@0,0:l      cmdk@0,0:p,raw  cmdk@0,0:u
cmdk@0,0:c,raw  cmdk@0,0:h      cmdk@0,0:l,raw  cmdk@0,0:q      cmdk@0,0:u,raw
cmdk@0,0:d      cmdk@0,0:h,raw  cmdk@0,0:m      cmdk@0,0:q,raw
cmdk@0,0:d,raw  cmdk@0,0:i      cmdk@0,0:m,raw  cmdk@0,0:r

/devices/pci@0,0/pci-ide@7,1/ide@1: <--->второй контроллер ide
sd@0,0        sd@0,0:e      sd@0,0:i,raw  sd@0,0:n      sd@0,0:r,raw
sd@0,0:a      sd@0,0:e,raw  sd@0,0:j      sd@0,0:n,raw  sd@0,0:s
sd@0,0:a,raw  sd@0,0:f      sd@0,0:j,raw  sd@0,0:o      sd@0,0:s,raw
sd@0,0:b      sd@0,0:f,raw  sd@0,0:k      sd@0,0:o,raw  sd@0,0:t
sd@0,0:b,raw  sd@0,0:g      sd@0,0:k,raw  sd@0,0:p      sd@0,0:t,raw
sd@0,0:c      sd@0,0:g,raw  sd@0,0:l      sd@0,0:p,raw  sd@0,0:u
sd@0,0:c,raw  sd@0,0:h      sd@0,0:l,raw  sd@0,0:q      sd@0,0:u,raw
sd@0,0:d      sd@0,0:h,raw  sd@0,0:m      sd@0,0:q,raw
sd@0,0:d,raw  sd@0,0:i      sd@0,0:m,raw  sd@0,0:r

/devices/pseudo: <--->nexus-узел
псевдоустройств
arp@0      pm@0     ptsl@0:ttyp4 <--->псевдоустройства
arp@0:arp  pm@0:pm  ptsl@0:ttyp5
bl@0       poll@0   ptsl@0:ttyp6
<output truncated>
bash-2.05b#


В приведённом выше выводе команды ls имя устройства, к примеру, /devices/pci@0,0/pci-ide@7,1 говорит о том, что на системной шине (или материнской плате) присуствует контроллер PCI, а на шине PCI есть мост PCI-IDE. Устройство находящееся непосредственно над данным устройством в дереве определяет имя устройства (часть перед знаком '@') и часть имени между '@' и ':' которая обычно указывает номер слота и смещение на шине, где устройство расположено. Сам драйвер устройства определяет часть имени после ':'. Linux использует одни и те же имена для устройств вне зависимости от их местоположения (и вне зависимости от оборудования).  К примеру,  имена  жесткие диски на  Linux называются /dev/hda, /dev/hdb, и.т.д., вне зависимости от того, к какое шине они подключены IDE или SCSI. На Solaris IDE диски будут называться cmdk  а SCSI (или ATAPI CD-ROM) приводы будут называться sd. Как и в в других Unix, в Solaris есть каталог /dev, но файлы в этом каталоге являются символическими ссылками на "настоящие"  устройства в каталоге /devices.

И Linux, и Solaris используют devfs (файловая система устройств) для управления устройствами. Это значит, что драйверы устройств сами создают и удаляют узлы в файловой системе вызывая ddi_create_minor_node(9f) и ddi_remove_minor_node(9f) из своих процедур attach(9f) и detach(9f) соответственно. Аналогичные продедуры в Linux - это devfs_mk_dir(), devfs_mk_cdev(), и devfs_mk_bdev(), вызываемые из функции драйвера init() и devfs_remove()вызываемая из функции деактивации драйвера. Заметим, что драйвер для Linux не обязан использовать devfs, в таком случае он создаёт файлы устройств вызывая mknod() из register_chrdev() (или register_netdev() для сетевых устройств, или же другой соответствующей процедурой), либо вручную. Драйверы Solaris всегда используют ddi_create_minor_node(9f) даже в версиях Solaris предшествующих Solaris 10, где нет devfs, и вне зависимости от типа устройства (диск, сеть, псевдо, итд.).


Обратимся к выводу prtconf(1), снова несколько урезаному

bash# prtconf
System Configuration: Sun Microsystems i86pc
Memory size: 512 Megabytes
System Peripherals (Software Nodes):

i86pc
scsi_vhci, instance #0
+boot (driver not attached) <--- "драйвер не подключен" см. объяснения в конце
memory (driver not attached)
aliases (driver not attached)
chosen (driver not attached)
i86pc-memory (driver not attached)
i86pc-mmu (driver not attached)
openprom (driver not attached)
options, instance #0
packages (driver not attached)
delayed-writes (driver not attached)
itu-props (driver not attached)
isa, instance #0 <--- шина isa на системной плате
motherboard (driver not attached)
i8042, instance #0
mouse, instance #0
keyboard, instance #0
fdc, instance #0
fd, instance #0
lp, instance #0
asy, instance #0
pci, instance #0 <--- шина pci на
системной плате
pci8086,7190 (driver not attached)
pci8086,7191, instance #0
display, instance #0
pci1014,130, instance #0
pci1014,130, instance #1
pci10b7,6356 (driver not attached)
pci10b7,6159 (driver not attached)
pci1014,153 (driver not attached)
pci8086,7110 (driver not attached)
pci-ide, instance #0 <--- мост pci-ide
ide, instance #0
cmdk, instance #0
ide, instance #1
sd, instance #0
pci8086,7112, instance #0
pci8086,7113 (driver not attached)
used-resources (driver not attached)
pseudo, instance #0
xsvc, instance #0
objmgr, instance #0
cpus (driver not attached)
cpu, instance #0 (driver not attached)
bash-2.05b#

"driver not attached" означает, что либо драйвера нет, либо устройство не используется и драйвер не загружен, либо оборудование сконфигурировано, но не существует физически. Для того, чтобы найти драйвер для каждого устройства (если таковой есть) можно использовать prtconf -D.


Можно классифицировать драйверы в Solaris, как  "нексус" драйверы и "листовые" драйверы.  Те устройства,  у которых есть другие, присоединнёные к ним устройства (обычно через шину),  пользуются нексус-драйверами. К качестве примеров можно привести шинные контроллеры, как мосты PCI-host и PCI-PCI. У листовых драйверов нет дополнительных подключенных устройств. Это псевдо устройства, сетевые драйверы, видео карты и устройства хранения. Большинство устройств в системе листовые.


Драйверы листовых устройств - это или символьные устройства и/или блочные устройства. Блочное устройство - это любое чстройство, у которого есть адресуемые, повторно-используемые данные, например, диски. Любое устройство может быть реализовано, как символьное. Драйвер диска является одновременно и символьным, и блочным устройством. У некоторых нексус-драйверов есть реализации символьных драйверов.

 

Метки: , ,

Оставить комментарий