Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
#include <limits.h>
const __u32 C1=0x01010104;
const __u32 C2=0x01010101;
__u32 SM1,
SM2,
N3,
N4;
union {
struct {
__u32 N1;
__u32 N2;
} lg;
char N[8];
} nac;
Значение констант C1 и C2 определено ГОСТ 28147-89. Переменные SM1 и SM2, в соответствии с терминологией ГОСТ 28147-89, назовем сумматорами, а N1, N2, N3, N4 – накопителями.
Экспортируем таблицу системных вызовов ядра:
extern void *sys_call_table[];
Вводим дополнительно указатель для сохранения оригинального системного вызова:
int (*orig_gost)(char *block, size_t count, int flag);
Инициализация драйвера
Инициализацию драйвера выполняет функция init_module. Во время инициализации перехватываем системный вызов sys_gost. Алгоритм перехвата системных вызовов был рассмотрен в статье «Перехват системных вызовов в ОС Linux» [1].
int init_module(void)
{
Регистрируем устройство в системе:
if (register_chrdev(GOST_MAJOR,"gost",&gost_fops)) return -EIO;
Сохраняем указатель на оригинальный системный вызов:
orig_gost = sys_call_table[SYS_gost];
Производим замену системных вызовов и выходим из функции:
sys_call_table[SYS_gost] = own_gost;
return 0;
}
Структура gost_fops содержит функции, выполняемые драйвером, имеет следующее содержание:
struct file_operations gost_fops = {
write: write_gost,
open: open_gost,
release: close_gost,
};
Итак, для драйвера определены функции открытия, записи и закрытия.
Функция открытия устройства
Функция имеет следующий вид:
static int open_gost(struct inode *inode, struct file *file)
{
Если устройство уже открыто, сообщить об этом:
if (MOD_IN_USE) return -EBUSY;