⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zjdev.c

📁 在Linux下实现文件的拷贝
💻 C
字号:
#ifndef __KERNEL__#define __KERNEL__ #endif#ifndef MODULE#define MODULE     #endif#include </home/zhangjian/ostask/linux-2.6.18/include/asm/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/kernel.h>#include <linux/sched.h>#include <asm/uaccess.h>#include <asm/io.h>#define CHAR_MAJOR_NUM 300	#define OPENSPK 1#define CLOSESPK 2#define DEVICE_NAME "zjdev"//static int test_major=0;static int device_open=0;//static char message[]="This is from device driver!";static int dev_open(struct inode *, struct file *);static int dev_release(struct inode *, struct file *);static ssize_t dev_read(struct inode *, struct file *, char *,unsigned long );static ssize_t dev_write(struct file *, const char *, size_t, loff_t *);//static int dev_ioctl(struct inode *,struct file *,unsigned int ,unsigned int ); char *message_ptr;struct file_operations dev_fops ={          	 open: dev_open,	 release: dev_release,  	 read: dev_read,    write: dev_write,}; int dev_init(void){  	int result;   result=register_chrdev(CHAR_MAJOR_NUM, "zjdev", &dev_fops);    if (result)		printk("mydev register failure!");   else		printk("mydev register success!");	return result;} void dev_exit(void){       	unregister_chrdev(CHAR_MAJOR_NUM, "zjdev");}/*static int dev_open(struct inode *inode, struct file *file){        // MOD_INC_USE_COUNT;     printk("This module is in open!\n");     return 0;}static int dev_release(struct inode *node, struct file *filp){          // MOD_DEC_USE_COUNT;     printk("This module is in released!\n");     return 0;}*/static int dev_open(struct inode *inode, struct file *file){         printk("\ndevice_open(%p,%p)\n",inode,file);     if(device_open)          return -EBUSY;           device_open++;     try_module_get(THIS_MODULE);     return 0;}static ssize_t dev_release(struct inode *node, struct file *filp){           printk("\ndevice_release(%p,%p)\n",node,filp);     device_open--;     module_put(THIS_MODULE);     return 0;  }/*static ssize_t dev_read(struct file *f, char *buf, size_t len, loff_t *off){	int i;      	for(i=len;i>0;i--) {		__put_user(5,buf);		buf++;	}	return len;}static ssize_t dev_write(struct file *f, const char *buf,		size_t len, loff_t *off){       	if (copy_from_user(&test_major, buf, sizeof(int)))		return 0;  	return sizeof(int);}*//*static ssize_t dev_read(struct file *f, char *buf, size_t len, loff_t *off){        int bytes_read=0;        #ifdef DEBUG           printk("\nmy_read is called.User buffer is %p,size is %d\n",buf,len);        #endif        if(verify_area(VERIFY_WRITE,buf,len)==-EFAULT)           return -EFAULT;        message_ptr=message;        while(len&&*message_ptr)                    {            if(put_user(*(message_ptr++),buf++))                return -EINVAL;            len--;            bytes_read++;                   }        return bytes_read;}*/static static ssize_t dev_read(struct file *f, char *buf, size_t count, loff_t *off))       {       /* identify your data (device-specific code) */         int i;       for(i=count;i>0;i--)                          __put_user(5,buf++);                       return count;}static ssize_t dev_write(struct file *f, const char *buf,size_t len, loff_t *off){      int i;      unsigned char uc;      #ifdef DEBUG        printk("\ndev_write is called.User buffer is %p,size is %d\n",buf,len);      #endif     // if(verify_area(VERIFY_WRITE,buf,len)==-EFAULT)      //   return -EFAULT;      printk("\nData below is from user programme:\n");      for(i=0;i<len;i++)         if(!get_user(uc,buf))            printk("%02x",uc);      return len;}/*static int dev_ioctl(struct inode *inode,struct file *f,unsigned int arg1,unsigned int arg2){      #ifdef DEBUG      printk("\nmy_ioctl is called.Paraeter is %p,size is %d\n",arg1);      #endif      switch(arg1)         case OPENSPK:              printk("\nNow,open PC's speaker.\n");              outb(inb(0x61)|3,0x61);              break;         case CLOSESPK:              printk("\nNow ,close PC's speaker.");              outb(inb(0x61)&0xfc,0x61);              break;             }}*/      module_init(dev_init);module_exit(dev_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -