Linuxデバイス駆動-シンプルな文字駆動

14029 ワード

Linux文字デバイスの静的登録方法について説明します.
モジュールのロードについては、まず参照してください.
モジュールの構築と実行
1.またはラインソース:

//memdev.h
# ifndef _MEMDEV_H_
# define _MEMDEV_H_
 
# ifndef MEMDEV_MAJOR
# define MEMDEV_MAJOR 200
# endif
 
# ifndef MEMDEV_NR_DEVS
# define MEMDEV_NR_DEVS 2
# endif
 
# ifndef MEMDEV_SIZE
# define MEMDEV_SIZE 4096
# endif
 
struct mem_dev{
     char * data;
     unsigned long size;
 
};
 
# endif
 
//memdev.c  
# include < linux / module.h >
# include < linux / types.h >
# include < linux / fs.h >
# include < linux / errno.h >
# include < linux / mm.h >
# include < linux / sched.h >
# include < linux / init.h >
# include < linux / cdev.h >
# include < asm / io.h >
# include < asm / system.h >
# include < asm / uaccess.h >
# include < linux / wait.h >
# include < linux / completion.h >
 
# include "memdev.h"
 
MODULE_LICENSE( "Dual BSD/GPL" );
 
static int   mem_major = MEMDEV_MAJOR;
 
struct mem_dev * mem_devp; /* */
 
struct cdev cdev;
 
/* */
int mem_open( struct inode * inode, struct file * filp)
{
printk( "open own file
"
);
      return 0 ;
}
 
/* */
static const struct file_operations mem_fops =
{
  .owner = THIS_MODULE,
  .open = mem_open,
};
 
/* */
static int memdev_init( void )
{
    int result;
    int i;
 
  dev_t devno = MKDEV(mem_major, 0 );
 
    /* */
    result = register_chrdev_region(devno, 2 , "memdev" );
    if (result < 0 )
      return result;
 
    /* cdev */
  cdev_init( & cdev, & mem_fops);
 
    /* */
  cdev_add( & cdev, MKDEV(mem_major, 0 ), MEMDEV_NR_DEVS);
 
    return result;
}
 
/* */
static void memdev_exit( void )
{
  cdev_del( & cdev);     /* */
  unregister_chrdev_region(MKDEV(mem_major, 0 ), 2 ); /* */
}
 
module_init(memdev_init);
module_exit(memdev_exit);
 
#Makefile
ifneq ($(KERNELRELEASE),)
    obj -m : = memdev.o
else
    KERNELDIR ? = /lib /modules /$(shell uname -r) /build
    PWD = $(shell pwd)
default :
    $(MAKE) -C $(KERNELDIR) M =$(PWD) modules
clean :
    rm memdev.mod *  module * memdev.o memdev.ko Module. *
endif
 
 
2.
     make , memdev.ko
     insmod memdev.ko memdev
     :sudo mknod /dev/memdev_t c 200 0
    
    

   // memusr.c
# include <stdio.h >
# include <string.h >
 
int main()
{
    FILE *fp0;
     /* */
    fp0 = fopen( "/dev/memdev_t", "r+");
     if (fp0 == NULL) {
        printf( "Open Memdev0 Error!
"
);
         return - 1;
    }
}
 
 
 
 
 
 
, dmesg
[38439.741816] Hello World!
[38657.654345] Goodbye
[40393.039520] open own file
 
sudo memusr   。
 

:https://www.cnblogs.com/Windeal/p/4284680.html