Работа системы с аппаратными устройствами

Многозадачные операционные системы не позволяют программным приложениям напрямую работать с аппаратными компонентами компьютерной системы. Если нескольким программам в одно и то же время «заблагорассудится» вывести данные на один и тот же принтер или монитор, последствия могут быть непредсказуемы. Поэтому инструкции, позволяющие непосредственно обращаться к портам ввода/вывода в защищенном режиме центрального процессора, являются привилегированными. Взаимодействие программ с устройствами происходит через ядро операционной системы посредством программных модулей, именуемых драйверами.

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

Файлы специальных устройств внешне напоминают обычные файлы. Их можно перемещать из каталога в каталог с помощью команды mv (move) и удалять командой rm (remove). Но с этими файлами не связаны блоки данных на машинном носителе. Данные, помещаемые в такой файл, передаются драйверу устройства, а читаемые из файла - запрашиваются у драйвера. Копирование специального файла приведет к чтению из соответствующего устройства.

Различают символьные и блочные устройства, так же называются и соответствующие им специальные файлы. При выводе информации о файлах с помощью команды Is -la файлы символьных устройств можно распознать по первой букве «с», а блочные - по символу "Ь". К символьным относятся устройства, читающие и записывающие данные в виде потока байтов (ленточные накопители, клавиатура, звуковые адаптеры, устройства, подключенные к последовательным или параллельным портам). Примером блочного устройства является магнитный или оптический диск - информация записывается на них и соответственно считывается блоками фиксированного размера (секторами).

Зная имя устройства, можно создать для него специальный файл. Это производится с помощью команды mknod, исполнение которой разрешается только суперпользователю. Обычно создавать файлы специальных устройств не требуется, поскольку они присутствуют в стандартной инсталляции операционной системы. Располагаются файлы устройств в каталоге /dev (device - устройство). Узнать, какому устройству соответствует специальный файл, можно по характерным именам:

>- fdO, fdl (fd - floppy disk) - соответственно первый и второй дисководы ГМД, > hdXY (hd - hard disk) - логический раздел жесткого диска (магнитного или оптического) с IDE-контроллером. Х - символы a,b,c,d, обозначающие порядковый номер шлейфа (а - первый (master) накопитель основного шлейфа, b - второй (slave) накопитель основного шлейфа и т.д.),

sdXY (sd - SCSI disk) - логический раздел жесткого диска со SCSI-интерфейсом,

1р0, lpl (lp - line port) - параллельные порты,

ttySO, ttySl(tty - teletype) - последовательные порты,

tty - терминал,

audio - звуковой адаптер,

>- htO, stO - IDE и SCSI накопители на магнитной ленте.

IDE-устройства в ОС Linux представлены следующими файлами:

/dev/hda - "master" на первом интерфейсном канале,

/dev/hdb - "slave" на первом интерфейсном канале,

/dev/hdc - "master" на втором интерфейсном канале,

/dev/hdd - "slave"Ha втором интерфейсном канале.

Обращение к разделам на диске производится по их номерам, указываемым в конце имени файла диска. Всего на IDE-диске может быть адресовано 32 раздела. Первые 4 номера используются для обозначения первичных разделов, а остальные 28 номеров - для логических. Например:

/dev/hda2 - второй первичный раздел диска,

/dev/hda6 - второй логический раздел диска.

Например, при подключении исследуемого IDE-диска в качестве "master"-устройства к "secondary" интерфейсному каналу, диск будет представлен как файл /dev/hdc.

Для того чтобы выяснить трехмерную логическую геометрию диска CHS, количество и типы находящихся на нём разделов, необходимо, работая в режиме суперпользователя, выполнить команду fdisk -1 device, где device - файл конкретного устройства (исследуемого диска):

Disk /dev/hdc: 10.2 GB, 10248118272 bytes 16 heads, 63 sectors/track, 19857 cylinders Units = cylinders of 1008 * 512 = 516096 bytes

19857

Device

Boot

Start

/dev/hdcl

*

1

(LBA)

/dev/hdc2

4162

/dev/hdc3

4365

/dev/hdc4

19468

(LBA)

/dev/hdc5

19468

End

Blocks

Id

System

4161

2097112+

с

W95 FAT32

4364

102312

83

Linux

19467

7611912

83

Linux

19857

196560

f

W95 Ext'd

196528+ 82 Linux swap

Листинг 19. Информация, выводимая командой fdisk -1 /dev/hdc

Разбор информации о диске

Информация, приведенная в листинге 19, выведенная командой fdisk -1 /dev/hdc, говорит о следующем: > Исследуемый диск имеет общую ёмкость 10,2 Гбайт (10248118272 байта);

Логическая геометрия диска: 63 сектора/16 головок/19857 цилиндров. Трехмерная логическая адресация диска CHS (cylinders, heads, sectors) не соответствует реальному физическому размещению данных на магнитных дисках. Действительно, можно ли представить, что внутри герметичного блока жесткого диска размещены 16 магнитных головок или 8 дисков? Чаще всего в корпусе гермоблока имеется всего два жестких диска и, соответственно, 4 магнитных головки. А количество цилиндров в соответственное число раз больше (19857*4=79428). Количество секторов тоже указано неверно; в различных пространственных зонах диска оно в зависимости от длины окружности дорожек находится в диапазоне от нескольких десятков до сотен секторов. Настоящая физическая геометрия диска известна только его контроллеру. Однако человек, не имея доступа внутрь гермоблока, видит дисковое пространство глазами операционной системы.

Единица отображения размещения разделов - цилиндр; размер цилиндра равен 516096 байт (63 *16 * 512 - число секторов * число головок * размер сектора). Поскольку контроллер жесткого диска скрывает истинную геометрию дискового пространства, данная информация не имеет большого значения;

>- /dev/hdcl - активный первичный раздел № 1 с типом системы "W95 FAT32 (LBA)" (Id раздела равен "с" в шестнадцатеричном виде), размещается с 1-го по 4161-й цилиндр и имеет размер 2097112 блоков по 1024 байта;

/dev/hdc2 - первичный раздел № 2 с типом системы "Linux" (Id раздела равен "83" в шестнадцатеричном виде), размещается с 4162 по 4364 цилиндр и имеет размер 102312 блоков по 1024 байта;

/dev/hdc3 - первичный раздел № 3 с типом системы "Linux" (Id раздела равен "83" в шестнадцатеричном виде), размещается с 4365 по 19467 цилиндр и имеет размер 7611912 блоков по 1024 байта;

/dev/hdc4 - расширенный раздел № 4 с типом системы "W95 Ext'd (LBA)" (Id раздела равен "f' в шестнадцатеричном виде), размещается с 19468 по 19857 цилиндр и имеет размер 196560 блоков по 1024 байта;

/dev/hdc5 -логический раздел № 5 с типом системы "Linux swap" (Id раздела равен "82" в шестнадцатеричном виде), размещается с 19468 по 19857 цилиндр и имеет размер 196528 блоков по 1024 байта.

Плюсы после количества блоков в разделах указывают на то, что раздел не кратен целому числу цилиндров.

SCSI-диски в ОС Linux представлены в виде следующих файлов:

/dev/sda - первый диск;

/dev/sdb - второй диск;

/dev/sdc - третий диск;

...

/dev/sdp - шестнадцатый диск.

Обращение к разделам на диске, так же, как и к IDE-дискам, производится по их номерам, указываемым в конце имени файла диска. Всего на диске может быть адресовано 15 разделов. Первые 4 номера используются для обозначения первичных разделов, а остальные 11 номеров - для обозначения логических. Например:

/dev/sda2 - обозначает второй первичный раздел диска;

/dev/sda6 - обозначает второй логический раздел диска.

Для решения некоторых практических задач система содержит несколько виртуальных устройств, которые не нуждаются в аппаратных компонентах:

/dev/null - своеобразная «черная дыра», удаляющая любой поток данных. В этот файл можно только записывать. Если перенаправить вывод в null, данные не будут отображаться на экране,

/dev/zero - «рог изобилия», файл, из которого можно бесконечно читать поток из одних нулей,

/dev/random - устройство, генерирующее поток случайных чисел при активности пользовательского ввода (движение мыши или нажатие нескольких клавиш на клавиатуре вызывает какое-то число случайных байт - от нескольких до нескольких сотен). Это виртуальное устройство может быть использовано и как индикатор присутствия (активности) пользователя за компьютером,

/dev/loop - устройство обратной связи, позволяющее имитировать виртуальное блочное устройство (диск).

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

od /dev/zero > /dev/null

od < /dev/zero > /dev/null

Подобные «процессы» могут изрядно нагрузить центральный процессор, и мы воспользуемся такой имитацией при наблюдении за процессами.