Модуль "Hello, World!"
Модуль "Hello, World!"
В отличие от разработки основных подсистем ядра, большинство из которых были уже рассмотрено, разработка модулей подобна созданию новой прикладной программы, по крайней мере в том, что модули имеют точку входа, точку выхода и находятся каждый в своем бинарном файле.
Может показаться банальным, но иметь возможность написать программу, которая выводит сообщение "Hello World!", и не сделать этого- просто смешно. Итак, леди и джентльмены, модуль "Hello, World!".
/*
* hello.c - модуль ядра Hello, World!
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/*
* hello_init - функция инициализации, вызывается при загрузке модуля,
* В случае успешной загрузки модуля возвращает значение нуль,
* и ненулевое значение в противном случае.
*/
static int hello_init(void) {
printk(KERN_ALERT "I bear a charmed life. ");
return 0;
}
/*
* hello_exit - функция завершения, вызывается при выгрузке модуля.
*/
static void hello_exit(void) {
printk(KERN_ALERT "Out, out, brief candle! ");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE{"GPL");
MODULE_AUTHOR("Shakespeare");
Это самый простой модуль ядра, который только может быть. Функция hello_init() регистрируется с помощью макроса module_init() в качестве точки входа в модуль. Она вызывается ядром при загрузке модуля. Вызов module_init() — это не вызов функции, а макрос, который устанавливает значение своего параметра в качестве функции инициализации. Все функции инициализации должны соответствовать следующему прототипу.
int my_init(void);
Так как функция инициализации редко вызывается за пределами модуля, ее обычно не нужно экспортировать и можно объявить с ключевым словом static.
Функции инициализации возвращают значение тина int. Если инициализация (или то, что делает функция инициализации) прошла успешно, то функция должна возвратить значение нуль. В случае ошибки возвращается ненулевое значение.
В данном случае эта функция просто печатает сообщение и возвращает значение нуль. В настоящих модулях функция инициализации регистрирует ресурсы, выделяет структуры данных и т.д. Даже если рассматриваемый файл будет статически скомпилирован с ядром, то функция инициализации останется и будет вызвана при загрузке ядра.
Функция hello_exit() регистрируется в качестве точки выхода из модуля с помощью макроса module_exit(). Ядро вызывает функцию hello_exit(), когда модуль удаляется из памяти. Завершающая функция должна выполнить очистку ресурсов, гарантировать, что аппаратное обеспечение находится в непротиворечивом состоянии, и т.д. После того как эта функция завершается, модуль выгружается.
Завершающая функция должна соответствовать следующему прототипу.
void my_exit(void);
Так же как и в случае функции инициализации, ее можно объявить как static.
Если этот файл будет статически скомпилирован с образом ядра, то данная функция не будет включена в образ и никогда не будет вызвана (так как если нет модуля, то код никогда не может быть удален из памяти).
Макрос MODULE_LICENSE() позволяет указать лицензию на право копирования модуля. Загрузка в память модуля, для которого лицензия не соответствует GPL, приведет к установке в ядре флага tainted (буквально, испорченное). Этот флаг служит для информационных целей, кроме того, многие разработчики уделяют меньше внимания сообщениям об ошибках, в которых указан этот флаг. Более того, модули, у которых лицензия не соответствует GPL, не могут использовать символы, которые служат "только для GPL" (см. раздел "Экспортируемые символы" ниже в этой главе).
Наконец, макрос MODULE_AUTHOR() позволяет указать автора модуля. Значение этого макроса служит только для информационных целей.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
1.5.3. Internet и World Wide Web
1.5.3. Internet и World Wide Web Контракт Министерства обороны США на первую реализацию набора протоколов TCP/IP был направлен группе разработчиков Unix, поскольку исходные коды данной операционной системы были в значительной степени открытыми. Кроме TCP/IP, Unix стала одной из необходимых
World Time Clock
World Time Clock Производитель: EffTex Development (http://worldtime-clock.com/).Статус: коммерческая.Страница для скачивания: http://worldtime-clock.com/download.html.Размер: 1,3 Мбайт.Если вы едете отдыхать не просто далеко, а очень далеко, не забудьте взять с собой в дорогу программу World Time Clock. Она поможет вам не забыть
1.5.3. Internet и World Wide Web
1.5.3. Internet и World Wide Web Контракт Министерства обороны США на первую реализацию набора протоколов TCP/IP был направлен группе разработчиков Unix, поскольку исходные коды данной операционной системы были в значительной степени открытыми. Кроме TCP/IP, Unix стала одной из необходимых
1.2. Сборка простого приложения «Hello, World» из командной строки
1.2. Сборка простого приложения «Hello, World» из командной строки ПроблемаВы хотите собрать простую программу «Hello, World», подобную приведенной в примере 1.4.Пример 1.4. Простая программа «Hello, World»hello.cpp#include <iostream>int main() { std.:cout << "Hello, World! ";}РешениеВыполните следующие
1.7. Сборка простого приложения «Hello, World» с помощью Boost.Build
1.7. Сборка простого приложения «Hello, World» с помощью Boost.Build ПроблемаВы хотите собрать простую программу «Hello, World», подобную приведенной в примере 1.4, с помощью BoostBuild.РешениеВ директории, где вы хотите создать исполняемый файл и все создаваемые при этом промежуточные файлы,
1.15. Сборка простого приложения «Hello, World» с помощью GNU make
1.15. Сборка простого приложения «Hello, World» с помощью GNU make ПроблемаВы хотите с помощью GNU make собрать простую программу «Hello, World», подобную приведенной в примере 1.4.РешениеПрежде чем вы напишете свой первый make-файл, вы должны познакомиться с терминологией, make-файл состоит из
ТЕХНОЛОГИИ:World: вид сверху
ТЕХНОЛОГИИ:World: вид сверху Сервисы Google Maps и Google Moon, а также программа Google Earth стали в последнее время самыми популярными источниками изображений земной и лунной поверхностей, снятых со спутника. Благодаря тому, что компания Google открыла API Google Maps, ее сервис стал стандартом
Промзона: Небоскрёб World One Николай Маслухин
Промзона: Небоскрёб World One Николай Маслухин Опубликовано 06 августа 2010 года Небоскрёбы редко становятся жилыми домами. Как правило, их удел – служить офисными и гостиничными пристанищами, дабы являть всему миру мощь и богатство их владельцев.
Что показывают на Mobile World Congress 2012 Андрей Письменный
Что показывают на Mobile World Congress 2012 Андрей Письменный Опубликовано 29 февраля 2012 года К выставке Mobile World Congress 2012, которая проходит в Барселоне, в HTC придержали три новые модели смартфонов на Android 4.0 Ice Cream Sandwich. Все они носят имя HTC One, различается лишь
Новинки Mobile World Congress 2010 Алексей Стародымов
Новинки Mobile World Congress 2010 Алексей Стародымов Сегодня мы поговорим о новых мобильниках и смартфонах, представленных в ходе выставки Mobile World Congress 2010, которая стартовала 15 февраля в испанской Барселоне. Сразу же замечу, что, хотя нам показали десятки свежих продуктов,
Что показывали на Mobile World Congress 2012 Андрей Письменный
Что показывали на Mobile World Congress 2012 Андрей Письменный Опубликовано 06 марта 2012 года Местоположение и размеры стенда Sony на барселонской выставке Mobile World Congress были довольно необычными: он находился в крохотном предбаннике огромного павильона, занятого
Учиться с World of Warcraft[19] ?
Учиться с World of Warcraft[19]? То, что во время любой игры учатся, известно давно и однозначно доказано. Вопрос заключается не в том, влияют ли на детское развитие компьютерные игры, а в том, каково это влияние: положительное или отрицательное. Некоторые исследователи видят в
Что показывали на Mobile World Congress 2012
Что показывали на Mobile World Congress 2012 Автор: Андрей ПисьменныйОпубликовано 06 марта 2012 года Знакомство с новыми телефонами Sony — Xperia S и Xperia P Местоположение и размеры стенда Sony на барселонской выставке Mobile World Congress были довольно необычными: он находился в крохотном предбаннике