Роберт Лав - Разработка ядра Linux
- Название:Разработка ядра Linux
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва
- ISBN:5-8459-1085-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роберт Лав - Разработка ядра Linux краткое содержание
В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Положение объекта на файловой системе sysfs зависит от его положения в объектной иерархии. Если установлен указатель parent
объекта, то объект будет отображен внутри каталога, соответствующего объекту, на который указывает указатель parent. Если указатель parent
не установлен, то объект будет отображен в каталоге, соответствующем значению переменной kset->kobj
. Если для некоторого объекта не установлены ни значение поля parent, ни значение поля kset
, то считается, что данный объект не имеет родительского и будет отображаться в корневом каталоге файловой системы sysfs
. Такое поведение практически всегда соответствует тому, что нужно. Поэтому одно из полей parent или kset
(или оба) должно быть установлено правильным образом перед вызовом функции kobject_add()
. Имя каталога, который представляет объект kobject
в файловой системе sysfs, будет определяться значением поля kobj->name
.
Вместо того чтобы последовательно вызывать функции kobject_init()
и kobject_add()
, можно вызвать функцию kobject_register()
.
int kobject_register(struct kobject *kobj);
Удаление объекта из файловой системы sysfs выполняется с помощью функции kobject_del()
.
void kobject_del(struct kobject *kobj);
Функция kobject_unregister()
сочетает в себе выполнение функций kobject_del()
и kobject_put()
.
void kobject_unregister(struct kobject* kobj);
Все эти четыре функции определены в файле lib/kobject.c
и объявлены в файле .
Добавление файлов на файловой системе sysfs
Объекты kobject
отображаются на каталоги, и такое отображение выполняется естественным образом. А как насчет создания файлов? Файловая система sysfs — это не что иное, как дерево каталогов без файлов.
Набор файлов, которые создаются в каталоге по умолчанию, определяется с помощью поля ktype
объектов kobject
и множеств kset
. Следовательно, все объекты kobject
одного типа имеют один и тот же набор файлов в каталогах, которые этим объектам соответствуют. Структура kobject_type
содержит поле default_attrs
, которое представляет собой массив структур attribute
. Атрибуты отображают данные ядра на файлы в файловой системе sysfs.
Структура attributes
определена в файле .
/* структура attribute - атрибуты позволяют отобразить данные ядра
на файлы файловой системы sysfs */
struct attribute {
char *name; /* имя атрибута */
struct module *owner; /* модуль, если есть, которому
принадлежат данные */
mode_t mode; /* права доступа к файлу */
};
Поле name
содержит имя атрибута. Такое же имя будет иметь и соответствующий файл на файловой системе sysfs. Поле owner
— это указатель на структуру module
, которая представляет загружаемый модуль, содержащий соответствующие данные. Если такого модуля не существует, то значение поля равно NULL
. Поле mode
имеет тип mode_t
и указывает права доступа к файлу на файловой системе sysfs. Если атрибут предназначен для чтения всеми, то флаг прав доступа должен быть установлен в значение S_IRUGO
, если атрибут имеет право на чтение только для владельца, то права доступа устанавливаются в значение S_IRUSR
. Атрибуты с правом на запись, скорее всего, будут иметь права доступа S_IRUGO | S_IWUSR
. Все файлы и каталоги на файловой системе sysfs принадлежат пользователю с идентификаторами пользователя и группы равными нулю.
Структура attribute
используется для представления атрибутов, а структура sysfs_ops
описывает, как эти атрибуты использовать. Поле sysfs_ops
— это указатель на одноименную структуру, которая определена в файле следующим образом.
struct sysfs_ops {
/* метод вызывается при чтении файла на файловой системе sysfs */
ssize_t (*show)(struct kobject *kobj,
struct attribute *attr, char *buffer);
/* метод вызывается при записи файла на файловой системе sysfs */
ssize_t (*store)(struct kobject *kobj,
struct attribute *attr, const char *buffer, size_t size);
};
Метод show()
вызывается при чтении файла. Он должен выполнить копирование значения атрибута, который передается в качестве параметра attr
, в буфер, на который указывает параметр buffer
. Размер буфера равен PAGE_SIZE
байт. Для аппаратной платформы значение PAGE_SIZE
равно 4096 байтов. Функция должна возвратить количество байтов данных, которые записаны в буфер в случае успешного завершения, и отрицательный код ошибки, если такая ошибка возникает.
Метод store()
вызывается при записи. Он должен скопировать size
байт данных из буфера buffer
в атрибут attr
. Размер буфера всегда равен PAGE_SIZE
или меньше. Функция должна возвратить количество байтов данных, которые прочитаны из буфера при успешном выполнении, и отрицательный код ошибки в случае неудачного завершения.
Так как этот набор функций должен выполнять операции ввода-вывода для всех атрибутов, то необходимо выполнить некоторые дополнительные действия, чтобы вызвать обработчик, специфичный для каждого атрибута.
Обычно атрибутов, которые используются по умолчанию и предоставляются типом ktype
, связанным с объектом kobject
, оказывается достаточно. Действительно, все объекты kobject
одного типа должны быть чём-то похожи друг на друга или даже быть идентичными по своей природе. Например, для всех разделов жестких дисков один и тот же набор атрибутов должен подходить для всех объектов kobject
. Это не просто упрощает жизнь, но и позволяет упорядочить код и получить одинаковый способ доступа ко всем каталогам файловой системы sysfs, связанным с родственными объектами.
Тем не менее иногда требуется, чтобы определенный экземпляр объекта kobject
имел некоторые специфические свойства. Для таких объектов может оказаться желательным (или необходимым) создать атрибут, которого нет у общего типа данного объекта. Для такого случая ядро предоставляет функцию sysfs_create_file()
для добавления атрибута к существующему объекту.
int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);
Эта функция позволяет привязать структуру attribute, на которую указывает параметр attr
, к объекту kobject
, на который указывает параметр kobj
. Перед тем как вызвать эту функцию, необходимо установить значение атрибута (заполнить поля структуры). Эта функция возвращает значение нуль в случае успеха и отрицательное значение в случае ошибки.
Обратите внимание, что для обработки указанного атрибута используется структура sysfs_ops
, соответствующая типу ktype
объекта. Иными словами, существующие функции show()
и store()
, которые используются для объекта по умолчанию, должны иметь возможность обработать вновь созданный атрибут.
Интервал:
Закладка: