亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4033 | 回復(fù): 1
打印 上一主題 下一主題

內(nèi)核態(tài)下的設(shè)備文件操作(filp_open) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-07-31 19:59 |只看該作者 |倒序?yàn)g覽
   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

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2014-06-25 14:06 |只看該作者
謝謝LZ,學(xué)習(xí)了,有個(gè)小疑問。LZ里面用到的ioctl鉤子函數(shù),我看原型不是int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);這樣的嗎?LZ使用的時(shí)候第一個(gè)參數(shù)索引目錄節(jié)點(diǎn)卻使用的是file結(jié)構(gòu),到了第二個(gè)參數(shù)file的地方,使用的是讀取到底buff,這樣沒有問題嗎?回復(fù) 1# red_eyed_hare


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP