Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
}
Таблица символьных устройств определена в файле fs/devices.c и также является массивом структур, который заполняется при регистрации устройства в системе:
struct device_struct {
const char * name;
struct file_operations * fops;
};
static struct device_struct chrdevs[MAX_CHRDEV];
Структура struct file_operations определена в файле <linux/fs.h> и содержит функции, выполняемые драйвером символьного устройства.
Когда пользовательский процесс читает данные из файла устройства или записывает их, ядро, используя старший номер устройства в качестве индекса, находит в соответствующей таблице нужную процедуру драйвера и выполняет запрашиваемое действие.
Кроме операций чтения/записи драйвер также предоставляет возможность управления устройством. Операция управления осуществляется при помощи функции ioctl. Эта функция вызывается пользовательским процессом и имеет следующий прототип:
int ioctl(int fd, int cmd, ...);
Аргументы функции: int fd – файловый дескриптор устройства; int cmd – команда, посылаемая устройству. Третий параметр является специфичным для каждого устройства, поэтому в прототипе функции не указан.
Доступ к жесткому диску через файл устройства
Предположим, что в системе присутствует один накопитель на жестком магнитном диске, который подключен как Primary Master. Согласно обозначениям блочных устройств, принятым в ОС Linux, ему соответствует файл устройства /dev/hda. Разработаем программный модуль, выполняющий чтение первого сектора (MBR) и получающий информацию об устройстве, такой, как модель жесткого диска, его серийный номер, геометрию (число цилиндров/головок/секторов) и число логических блоков.
Нам понадобятся следующие заголовочные файлы:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <linux/hdreg.h>
В файле <linux/hdreg.h> определена структура struct hd_driveid, предназначенная для хранения информации идентификации устройства, и перечень команд управления устройством.
int main()
{
struct hd_driveid ide;
int hda, sect;
char sector[512];
Для доступа к устройству достаточно стандартным способом открыть соответствующий файл устройства:
hda=open("/dev/hda",O_RDONLY);
if(!hda) {
perror("hda");
}
sect=open("mbr",O_CREAT|O_RDWR,0600);