Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?
» » » Операционные системы. Устройства. Лабораторная работа №5.

Реклама


Операционные системы. Устройства. Лабораторная работа №5.

Просмотров: 2135 Автор: admin
Операционные системы. Устройства. Лабораторная работа №5.

Цель работы: дать обучающимся понятия об устройствах в операционных системах Unix.

Методический материал.

Linux, как и большинство операционных систем, взаимодействует с аппаратнымиустройствами посредством модульных программных компонентов, называемых драйверами.
Драйвер скрывает от операционной системы детали взаимодействия с устройством ипредоставляет в распоряжение системы стандартный интерфейс обращения к устройству.
В Linux драйверы устройств являются частью ядра и могут подключаться к ядрустатически либо по запросу в виде модулей. Драйверы недоступны напрямуюпользовательским процессам. Но в Linux имеется особый механизм — специальныефайловые объекты, позволяющие процессам взаимодействовать с драйверами, а через них саппаратными устройствами. Такие объекты являются частью операционной системы,поэтому программы могут открывать их, читать из них данные и осуществлять запись в нихточно так же, как если бы это были обычные файлы. С помощью низкоуровневых вызововили стандартных библиотечных функций ввода-вывода программы могут обмениватьсяданными с устройствами через файловые объекты.
В Linux есть также ряд файловых объектов, предназначенных для доступа к ядру, а нек драйверам устройств. Такие объекты не связаны с аппаратными устройствами. Ониреализуют специальные функции, используемые приложениями и системными программами.
Типы устройств.
Файлы устройств не являются обычными файлами: с ними не связаны блоки данных надиске. Данные, помещаемые в такой файл или извлекаемые из него, передаютсясоответствующему драйверу устройства или принимаются от него, а драйвер, в своюочередь, осуществляет обмен данными с обслуживаемым устройством. Устройстваклассифицируются по двум типам.
– Символьные (байт-ориентированные) устройства читают и записывают данные в видепотока байтов. Сюда входят последовательные и параллельные порты, накопители намагнитной ленте, терминалы и звуковые платы.
– Блочные (блок-ориентированные) устройства читают и записывают данные блокамификсированного размера. В отличие от символьных устройств блочные устройствапредоставляют произвольный доступ к своим данным. В качестве примера можно назватьжесткий диск.
Как правило, приложения не работают с блочными устройствами. В каждом раздележесткого диска содержится файловая система, которая монтируется к дереву корневойфайловой системы Linux. Лишь ядро, реализующее функции файловой системы, получаетпрямой доступ к блочному устройству. Программы обращаются к содержимому диска черезобычные файлы и каталоги.
Номера устройств.
ОС Linux идентифицирует устройства двумя числами: старшим номером устройства имладшим номером устройства. Старший номер указывает на то, какой драйвер соответствуетустройству. Соответствие между старшими номерами устройств и драйверами жесткозафиксировано в исходных файлах ядра Linux. Двум разным драйверам может соответствовать одинаковый старший номер. Это значит, что один драйвер управляетсимвольным устройством, а второй — блочным. Младшие номера позволяют различатьотдельные устройства или аппаратные компоненты, управляемые одним драйвером. Значениемладшего номера зависит от драйвера.
Например устройству со старшим номером 3 соответствует основной контроллер IDE.
К этому контроллеру могут быть подключены два устройства (жесткие диски, накопитель намагнитной ленте, или дисковод CD-ROM или DVD-ROM). «Главному» устройству будетсоответствовать младший номер 0, а «подчиненному» устройству — номер 64. Отдельныеразделы главного устройства (если он поддерживает разбивку на разделы) будут иметьмладшие номера 1,2, 3 и т. д. Разделы подчиненного устройства представляются младшиминомерами 65, 66, 67 и т. д.
Список старших номеров устройств можно узнать в документации к исходнымтекстам ядра Linux. Во многих дистрибутивах эта информация храниться вфайле /usr/src/linux/Documentation/devices.txt (если установлены исходные тексты ядра).В специальном файле /proc/devices перечислены старшие номера устройств,соответствующие загруженным в данный момент драйверам.Файловые ссылки на устройства.
Ссылки на устройства напоминают обычные файлы. Их можно перемещать с помощьюкоманды mv и удалять командой rm. Правда, если попытаться скопировать такую ссылку спомощью команды cp, из устройства будут прочитаны данные (при условии, что устройствоподдерживает операцию чтения) и эти данные перенесутся в указанный файл. При попыткеперезаписи ссылки в соответствующее устройство будут записаны данные.
Ссылка на устройство создается с помощью команды mknod или функции mknod().
Создание ссылки не означает, что драйвер устройства или само устройство автоматическибудет доступными. Ссылка является лишь своего рода порталом, через который происходитвзаимодействие с драйвером. Создавать такие ссылки разрешается только процессамсуперпользователя.
Первый аргумент команды mknod задает путь, под которым ссылка появится вфайловой системе. Второй аргумент равен b для блочного устройства и c для символьногоустройства. Старший и младший номера устройства задаются в третьем и четвертомаргументах соответственно. Например, следующая команда создает в текущем каталогессылку на символьное устройство lp0 (параллельный порт). Старший номер устройства — 6,младший — 0. Эти номера соответствуют первому параллельному порту Linux.
%mknod ./lp0 c 6 0
Помните, что лишь суперпользователю разрешено создавать ссылки на устройства,поэтому для успешного выполнения показанной команды необходимо зарегистрироваться всистеме под именем root.Команда ls особым образом помечает ссылки на устройства. Если вызвать ее с флагом-l или -o, то первый символ в каждой строке будет обозначать тип записи. Дефиссоответствует обычному файлу, буква d — каталогу, b — блочному устройству, c —символьному устройству. В последних двух случаях команда ls вместо размера файлаотображает старший и младший номера устройства. Давайте, к примеру, получиминформацию о ссылке на символьное устройство, которую мы только создали:
%ls -l lp0crw-r--r-- 1 root root 6, 0 2007-11-01 15:11 lp0В распоряжение программ имеется функция stat(), которая позволяет не только узнать, какому устройству — символьному или блочному — соответствует ссылка, но и определитьномер устройства. Удалить ссылку на устройство (не сам драйвер) можно с помощьюкоманды rm:
%rm -f ./lp0
Каталог /dev.
В Linux имеется каталог /dev, в котором содержаться ссылки на все символьные и блочныеустройства, известные системе. Имена этих ссылок стандартизированы.
Например, главное устройство, подключенное к основному контроллеру IDE, имеетстарший и младший номера 3 и 0 соответственно, а его стандартное имя — /dev/hda.Если данное устройство поддерживает разделы, то первый раздел (младший номер 1) будетназываться /dev/hda1.
В большинстве случаев нет необходимости с помощью команды mknod создаватьсобственные ссылки. Достаточно скопировать нужные ссылки из каталога /dev. У программ,не располагающих привилегиями суперпользователя, нет другого выбора, кроме какпользоваться имеющимися ссылками. Обычно новые ссылки создаются только системнымиадминистраторами и разработчиками драйверов. В Linux имеются специальные средстваупрощающие администраторам процесс создания ссылок с правильными именами.
Доступ к устройству путем открытия файла.
Как работать с аппаратными устройствами? В случае символьного устройства ответ прост:откройте ссылку на устройство как обычный файл и осуществляете чтение-записьтрадиционным образом. Например, если к первому параллельному порту подключенпринтер, то распечатать файл document.txt можно, направив его непосредственно наустройство /dev/lp0:
%cat document.txt > /dev/lp0
Чтобы эта команда завершилась успешно, необходимо иметь право записи в файлпринтера. Во многих Linux-системах таким правом обладают лишь пользователь root исистемный демон печати lpd. Кроме того результат работы принтера зависит от того, как онинтерпретирует посылаемые ему данные. Одни принтеры могут распечатывать текстовыефайлы, другие — нет. PostScript-принтеры распечатывают файлы формата PostScript.
Послать устройству данные из программы несложно:
int fd = open (''/dev/lp0'', O_WRONLY);
write (fd, buffer, buffer_length);
close(fd);
Специальные устройства.
В Linux есть также ряд специальных символьных устройств, которым не соответствуютникакие аппаратные компоненты. Старший номер таких устройств равен 1. Это означает, чтообращение к устройству переадресуется ядру Linux.Устройство /dev/null.
Устройство /dev/null служит двум целям.
– Linux удаляет любые данные, направляемые в устройство /dev/null. В тех случаях, когда выводные данные программы не нужны, в качестве выходного файла назначаютустройство /dev/null.
– При чтении из устройства /dev/null всегда возвращается признак конца строки.
Если открыть файл /dev/null с помощью функции open() и попытаться прочесть данные изнего с помощью функции read(), функция вернет 0 байт. При копировании файла /dev/nullв другое место будет создан файл нулевой длины (пустой файл).
Устройство /dev/zero
Устройство /dev/zero ведет себя так, как если бы оно было файлом бесконечной длины,заполненным одними нулями. Сколько бы данных ни запрашивалось из этого файла, столькои будет «сгенерировано» нулевых байтов.
Файл /dev/zero используется в функциях выделения памяти, которые отображают этот файл впамяти, чтобы инициализировать выделяемые сегменты нулями.
Устройство /dev/full
Устройство /dev/full ведет себя так, как если бы оно было файлом в файловой системе, где неосталось свободного места. Операция записи в этот файл завершается ошибкой, и впеременную errno помещается код ENOSPC, обычно свидетельствующий о том чтоустройство записи переполнено. Этот файл удобен для проверки того, как ведет себяпрограмма, при записи в файл возникает нехватка места.
Устройства генерирования случайных чисел.
Специальные устройства /dev/random и /dev/urandom предоставляют доступ к средствагенерирования случайных чисел, встроенным в ядро Linux.
Большинство аналогичных программных функций, например функция rand()стандартной библиотеки языка C, в действительности генерируют псевдослучайные числа.
Такие числа имеют некоторые свойства случайных последовательностей, но их можновоспроизвести: достаточно задать то же самое инициализирующее значение, чтобы получитьодинаковую последовательность чисел. Такое поведение неизбежно, внутренняя работакомпьютера жестко определена и предсказуема. Но в ряде приложений это крайненежелательно. Например, можно взломать криптографический шифр, если произвестипоследовательность чисел.Чтобы получить настоящие случайные числа, необходим внешний «источник хаоса».
Ядро Linux знает о таком источнике: это вы сами! Замеряя задержки между действиямипользователя, в частности нажатиями клавиш и перемещениями мыши, ядро способногенерировать непредсказуемый поток действительно случайных чисел. Получить доступ кэтому потоку можно путем чтения из устройств /dev/random и /dev/urandom.
Разница между устройствами проявляется, когда запас случайных чисел в ядре Linuxзаканчивается. Если попытаться прочесть большое количество байтов изустройства /dev/random и при этом не выполнять никаких пользовательских действий (ненажимать на клавиши, не перемещать мышь и т.п.) система заблокирует операцию чтения.Только когда пользователь проявит какую-нибудь активность, система сгенерируетдополнительные случайные числа и передаст их программе.
Попытайтесь, к примеру, отобразить содержимое файла /dev/random с помощьюкоманды od. В каждой строке содержится 16 случайных байтов.%od -t x1 /dev/random0000000 b3 80 85 51 81 8f 81 11 aa 19 ac e3 fb f5 39 6c0000020 83 5a 0c c8 d2 8b 48 86 41 ed d5 c2 27 b2 71 470000040 7a f5 1d ca 34 38 59 2b 54 fc 22 c1 f2 b4 29 c50000060 c9 61 eb 91 d0 8d 91 b3 d2 38 49 45 cc 92 cc ab0000100 6d 3b 8f aa 0d 0b d0 4e 80 86 43 7d 9a 4a 2d 560000120 53 54 dd 99 21 ee e3 0b 61 c3 93 cf 70 3f 3d 5a0000140 03 e1 65 74 bc 58 6e 2a bc 94 a0 f7 7d c0 98 f9Число строк в выводе команды будет разным (их может оказаться очень мало). Главное то,что, в конце концов, вывод прекратиться, поскольку операционная система исчерпает запасслучайных чисел. Попробуйте теперь переставить мышь или нажать на клавишу, и выувидите что появятся новые числа.
В противоположность этому операция чтения из устройства /dev/random никогда неблокируется. Если в системе кончаются случайные числа, Linux используеткриптографический алгоритм, чтобы сгенерировать псевдослучайные числа из последнейцепочки случайных байтов.
Следующая команда будет выполнятся до тех пор пока пользователь не нажмет <Ctrl+C>
%od -t x1 /dev/urandom0000000 b3 80 85 51 81 8f 81 11 aa 19 ac e3 fb f5 39 6c0000020 83 5a 0c c8 d2 8b 48 86 41 ed d5 c2 27 b2 71 470000040 7a f5 1d ca 34 38 59 2b 54 fc 22 c1 f2 b4 29 c50000060 c9 61 eb 91 d0 8d 91 b3 d2 38 49 45 cc 92 cc ab0000100 6d 3b 8f aa 0d 0b d0 4e 80 86 43 7d 9a 4a 2d 560000120 53 54 dd 99 21 ee e3 0b 61 c3 93 cf 70 3f 3d 5a0000140 03 e1 65 74 bc 58 6e 2a bc 94 a0 f7 7d c0 98 f9Получить доступ в программе к генератору случайных чисел несложно.В следующем листинге показана функция, которая генерирует случайное число, читая байтыиз файла /dev/random. Помните, что операция чтения из этого файла окажетсязаблокированной в случае нехватки случайных чисел. Если важна скорость работы функциии можно смириться с тем, что некоторые числа окажутся псевдослучайными, воспользуйтесьфайлом /dev/urandom.
Листинг №1.
/* random_number.c Генерирование случайного числа с помощью файла /dev/random */
#include <assert.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
/* Функция возвращает случайное число в диапазоне от MIN до MAX
включительно. Случайная последовательнось байтов читается из
файла /dev/random. */
int random_number (int min, int max)
{
/* Дескриптор файла /dev/random сохраняется в статической переменной,
чтобы не приходилось повторно открывать файл при каждом следующем вызове функции. */ ф
static int dev_random_fd = -1; char* next_random_byte;
int bytes_to_read;
unsigned random_value; /* Убеждаемся, что аргумент MAX больше, чем MIN. */ /
assert (max > min); a
/* Если функция вызывается впервые, открываем файл /dev/random
и сохраняем его дескриптор. */
if (dev_random_fd == -1)
{
dev_random_fd = open ("/dev/random", O_RDONLY); ,
assert (dev_random_fd != -1);
} }
/* Читаем столько байт, сколько необходимо для заполнения целочисленнойпеременной. */ п
next_random_byte = (char*) & random_value;
bytes_to_read = sizeof (random_value);
/* Цикл выполняется до тех пор, пока не будет прочитано требуемое количество байт.Поскольку файл /dev/random заполняется в результате пользовательских действий, придлительном отсутствии активности операция чтения может быть заблокирована иливозвращать лишь один байт за раз. */ в
do{
int bytes_read;
bytes_read = read (dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
}
while (bytes_to_read > 0); )
/* Вычисляем случайное число в правильном диапазоне. */ /
return min + (random_value % (max - min + 1));
} int main (int argc, char * argv [])
{
int min, max; if (argc < 1) printf ("Формат ввода: random_number [минимальное число][максимальное число]\n");
else if (argc < 2) printf ("Не задано максимальное число\n");
else{min = atoi (argv[1]);
max = atoi (argv[2]);
printf ("%d\n",random_number(min,max));
}
return 0;
} }
Устройства обратной связи (петлевые устройства).
Устройство обратной связи позволяют смонтировать блочное устройство с помощьюобычного дискового файла. Представьте жесткий диск, в котором данные находятся не надорожках и секторах, а в файле с именем disk (естественно это файл должен размещаться нареальном диске, размер которого больше имитируемого).
Устройства обратной связи называются /dev/loop0, /dev/loop1 и т.д. Каждому из нихсоответствует одно виртуальное блочное устройство. Создавать такие устройства можеттолько суперпользователь.
Устройства обратной связи используются так же, как и любое другое блочноеустройство. В частности, на нем можно создать файловую систему и смонтировать ееподобно файловой системе обычного диска или раздела. Такая файловая система, целикомразместиться в дисковом файле, называется виртуальной файловой системой (ВФС).
Ниже описана последовательность действий, которые необходимо выполнить, чтобысоздать виртуальную файловую систему и смонтировать ее на устройстве обратной связи.
1. Создайте пустой файл, который будет содержать образ ВФС. Размер файла долженсоответсовать видимому размеру виртуальной файловой системы после еемонтирования.
Проще создать файл фиксированного размера с помощью команды dd Эта командакопирует блоки (по умолчанию каждый имеет размер 512 байтов) из одного файла вдругой. Лучший источник копирования /dev/zero.
Итак создадим файл размером в 5 мегабайт.
% dd if=/dev/zero of=/tmp/disk.img count=10240
2. Только что созданный файл заполнен нулевыми байтами. Теперь следуетсформировать на нем файловую систему. При этом будут созданы управляющиеструктуры предназначенные для организации и хранения файлов, и корневой каталог.
% mke2fs -q /tmp/disk.img
3. Смонтируйте файловую систему с использованием устройства обратной связи. Дляэтого введите команду mount, указав файл образа диска в качестве устройствамонтирования.Необходимо также задать опцию -o loop=устройство_обратной_связи. Нижепоказаны команды, которые это делают. Помните, что только суперпользовательможет монтировать устройства обратной связи.
% mkdir /tmp/mydisk
% sudo mount -o loop=/dev/loop0 /tmp/disk.img /tmp/mydiskТеперь образ диска смонтирован подобно обычному жесткому диску емкостью 5мегабайт.
4. Проверим размер диска:
% df -h /tmp/mydisk
Файловая система Разм Исп Дост Исп% смонтирована на
/tmp/disk.img 4,9M 33K 4,6M 1% /tmp/mydisk
После работы с виртуальной файловой системой, ее следует демонтировать.
% cd
% umount /tmp/mydisk
При желании файл disk.img можно удалить или смонтировать позднее, все данныеестественно остануться, также можно скопировать данный файл на другой компьютер и тамсмонтировать.
Особо часто устройства обратной связи применяются для монтирования виртуальных CD-
ROM и DVD-ROM, в данном случае последоватльнось команд следующая:
1. Создание образа CD-ROM:
% dd if=/dev/cdrom of=/mnt/cd.iso
2. Создание точки монтирования:
% mkdir /mnt/virtual-cd
3. Монтирование устройства:
% mount -o loop=/dev/loop0 /mnt/cd.iso /mnt/virtual-cd -t iso9660
Поскольку образ файловой системы храниться на жестком диске, доступ к такому CD-ROMбудет осуществятся гораздо быстрее.
Порядок проведения работы.
1. Прочитать методический материал, выполнить примеры и проверить в действиипрограмму, исходные тексты которой присутствуют.
Скачать Операционные системы. Устройства. Лабораторная работа №5. operacionnye-sistemy.-ustrojstva.-laboratornaya-rabota-5..zip [120,08 Kb] (cкачиваний: 29)

Информация

Комментировать статьи на нашем сайте возможно только в течении 60 дней со дня публикации.

Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП