Модули ядра linux
всем доброго времяни суток. такая у меня проблемма: хочу написать модуль ядра для линукс - драйвер устройства. данные я хочу брать из файла. вопрос в следующем - как открыть и прочитать данные файла из модуля ядра. сейчас попытался взять адреса системных вызовов open, read.... из sys_tables и вызвать. вызов getuid так работает, open нет. я понимаю что у модуля ядра нет контекста процесс и дескриптор будет привязан к процессу обратившегося к драйверу. может кто подскажет как это сделать и есть ли более простой способ обратиться к системным вызовам из ядра.
что возвращает open()?
так я получаю адресс функции open
unsigned long *sys_call_table; //таблица системных вызовов
sys_call_table = (unsigned long *) simple_strtoul("0xc1754cc0",NULL,16);
open_=(sys_call_table[__NR_open]);
так я её вызываю
static int device_open(struct inode *inode, struct file *file)
{
fd=open_("/home/stiv/1", 2, 0);//2=O_RDRW
и дальше в device_read и device_write я хочу читать/писать данные в этот файл
0xc1754cc0 я взял из System.map
я хочу сделать драйвер символьного устройства который будет брать инф. из файла. подскажите в какую сторону рыть.
Опция 1:
Цитата: Shrek19877
поставлю вопрос немного по другому. я могу истользовать системные вызовы в режиме ядра или только функции экспортируемые ядром? если да то как? способ с получением указателя на системный вызов мне кажется жутко кривым.
- Что есть "системные вызовы", зачем и для кого они нужны?
- Чем заполнена таблица системных вызовов, где и в каком виде это что-то лежит?
Опция 2:
Цитата: Shrek19877
я хочу сделать драйвер символьного устройства который будет брать инф. из файла. подскажите в какую сторону рыть.
Цитата: Ramon
.
"- Чем заполнена таблица системных вызовов, где и в каком виде это что-то лежит?" она заполнена адресами функций обслуживающих системные вызовы и лежит она в ядре. адрес этой таблици можно получить так cat /boot/System.map | grep sys_table.
если кто знает можно или нет использовать системные вызовы в модуле ядра напишите. не тонял как отночится этот исходник к моему вопросу.
Major = register_chrdev(0, DEVICE_NAME, &fops);
структура file_operations:
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
вот те функции к которым будут обращаться при обращении к устройству связанным с моим драйвером. в них я собственно хочу открывать файл, брать инфу, обрабатывать и передавать данные пользовательскому процессу.
static int device_open(struct inode *inode, struct file *file)
static int device_release(struct inode *inode, struct file *file)
static ssize_t device_read(struct file *filp, char *buffer,size_t length,loff_t * offset)
static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
как это реализовать?
например в device_open я должен открыть файл. для этого я хочу использовать системный вызов open и сохранить дескриптор. а дескриптор файла привязан к контексту процесса а у модуля его нет(он наследует контекст от вызывающего процесса) могу я это зделать или нет?
вот пример того как я думаю это сделать:
static int device_open(struct inode *inode, struct file *file)
{
if (Device_Open)
return -EBUSY;
Device_Open++;
//1)открываем файл для чтения
printk("try_open_file");
fd=open_("/home/stiv/1", O_RDRW, 0);//2=O_RDRW //возврата не происходит
printk("'file_fd_%d'.\n", fd);
if(fd==-1){try_module_get(THIS_MODULE); return -EBUSY;}//не удалось открыть
try_module_get(THIS_MODULE);
return SUCCESS;
}
откуда я беру open_ я уже писал
В вашем случае вам не требуется работать с таблицей системных вызовов напрямую, используйте предоставляемый ядром вызов open так же как используете printk
спасибо. а можете подсказать годную литературу по программированию модулей ядра?
В основном гугл/интернет, но сильно зависит и от того что хочется почерпнуть. Бывает что и исходный код - литература.
Цитата: Shrek19877
спасибо. а можете подсказать годную литературу по программированию модулей ядра?
Только Linux Device Drivers. )