- 論壇徽章:
- 0
|
Linux驅(qū)動(dòng)編程書籍大多數(shù)都是介紹怎樣用戶態(tài)下怎么訪問硬件設(shè)備,由于項(xiàng)目的需要,本人做了內(nèi)核態(tài)下訪問設(shè)備文件的方法,現(xiàn)在把程序拿出來和大家分享一下,希望對(duì)剛?cè)腴T的朋友有所幫助。
在我的《內(nèi)核模塊調(diào)用驅(qū)動(dòng)》中給出了簡(jiǎn)單的字符設(shè)備文件程序,可以作為本文的驅(qū)動(dòng)對(duì)象,在此,我就不多介紹了。調(diào)用驅(qū)動(dòng)程序的模塊如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include "chardev.h"
MODULE_LICENSE("GPL");
//#define __KERNEL_SYSCALLS__
#define bao "/dev/baovar"
static char buf1[20];
static char buf2[20];
static int __init testmod_init(void)
{
mm_segment_t old_fs;
ssize_t result;
ssize_t ret;
sprintf(buf1,"%s","baoqunmin");
struct file *file=NULL;
file=filp_open(bao,O_RDWR,0);
if(IS_ERR(file)) goto fail0;
old_fs=get_fs();
set_fs(get_ds());
ret=file->f_op->write(file,buf1,sizeof(buf1),&file->f_pos);
result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
if(result>=0){buf2[20]='\n';printk("buf2-->%s\n",buf2);}
else printk("failed\n");
result=file->f_op->ioctl(file,buf2,sizeof(buf2),&file->f_pos);
result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
set_fs(old_fs);
filp_close(file,NULL);
printk("file loaded\n");
return 0;
fail0:{filp_close(file,NULL);printk("load failed\n");}
return 1;
}
static void __exit testmod_cleanup(void)
{
printk("module exit......................................................\n");
}
module_init(testmod_init);
module_exit(testmod_cleanup);
以上是完整的程序,直接可以編譯運(yùn)行。
#include "chardev.h"頭文件定義如下,此頭文件也必須在驅(qū)動(dòng)中包含!
#include
#define BAO_IOCTL 't'
#define IOCTL_READ _IOR(BAO_IOCTL, 0, int)
#define IOCTL_WRITE _IOW(BAO_IOCTL, 1, int)
#define BAO_IOCTL_MAXNR 1
以下給出了我的Makefile文件:
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include
test.o :test.c
$(CC) $(MODCFLAGS) -c test.c
echo insmod test.o to turn it on
echo rmmod test to turn it off
echo
1.先加載設(shè)備驅(qū)動(dòng),我的設(shè)備文件為bao,
2.再make以上文件
3./sbin/insmod test.o加載模塊
4.dmesg 查看運(yùn)行結(jié)果
5./sbin/rmmod test
6.卸載加載的驅(qū)動(dòng)
我在Linux red hat 9.0下成功運(yùn)行
我實(shí)現(xiàn)的只是在模塊間對(duì)驅(qū)動(dòng)程序的調(diào)用,可以說是這是一個(gè)最簡(jiǎn)單的例子。
希望大家能有所收獲!
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/102361/showart_2014575.html |
|