一、基本理論
二、基本資料結構和例項
一、基本理論
本文例項參考《linux裝置驅動開發詳解第二版》,例項只是為了入門測試,初始化基本沒有錯誤檢查。這次基於前面的例項,在filp->private_data新增自定義的裝置指標,這個是許多驅動都採取的做法。
二、基本資料結構和例項
#ifndef _glbmem_h_
#define _glbmem_h_
#include #include #define globalmem_size 0x1000
#define globalmem_clear 0x1
#define globalmem_major 0
#define globalmem_node_name "glbmem"
#define globalmem_file_name "glbmem"
#define globalmem_class_name "glbmem"
static int globalmem_major=globalmem_major;
struct globalmem_dev;
#endif
#include #include #include #include #include #include #include #include #include #include #include "glbmem.h"
static struct globalmem_dev *dev;
static struct class *glbmem_class;
static int glbmem_open(struct inode *inode,struct file *filp)
static void glbmem_close(struct inode *inode,struct file *filp)
static ssize_t glbmem_read(struct file *filp,char __user *buffer,size_t len,loff_t *offset)
if((len+p)>globalmem_size)
len=globalmem_size-p;
if(copy_to_user(buffer,(void*)(dev->mem+p),len))
else
return ret;
}static ssize_t glbmem_write(struct file *filp,char __user *buffer,size_t len,loff_t *offset)
if((p+len)>globalmem_size)
if(copy_from_user(dev->mem+p,buffer,len))else
return ret;
}static int glbmem_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
return 0;
}static const struct file_operations glbmem_fops=;
static void globalmem_setup_cdev(struct globalmem_dev *dev)
static int __init glbmem_init(void)
if(ret<0)
return ret;
printk("device number register successed.\n");
printk("major number is:%d.\nminor number is:%d.\n",major(devno),minor(devno));
dev=kmalloc(sizeof(struct globalmem_dev),gfp_kernel);
memset(dev,0,sizeof(struct globalmem_dev));
globalmem_setup_cdev(dev);
glbmem_class=class_create(this_module,globalmem_node_name);
device_create(glbmem_class,null,devno,null,globalmem_node_name);
printk(kern_alert "glbmem init success.\n");
return 0;
}static void __exit glbmem_exit(void)
module_init(glbmem_init);
module_exit(glbmem_exit);
module_license("dual bsd/gpl");
module_author("wen");
module_description("this is a example to display char device driver");
module_version("v1.0");
makefile:
ifneq ($(kernelrelease),)
obj-m :=glbmem.o
else
kerneldir :=/lib/modules/$(shell uname -r)/build
pwd :=$(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd) modules
endif
clean:
rm *.ko *.o *mod*
測試:
三 、總結
驅動 入門例項hello驅動(一)
一 基本理論 二 基本資料結構和例項 三 總結 一 基本理論 雖然基本的linux核心是乙個大的image檔,也可以當做是乙個bin檔,可執行檔案。但是核心是模組化組成的,它允許在核心執行時向其中動態的插入或刪除 二 基本資料結構和例項 以下是module init和module exit巨集函式 ...
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
Linux驅動開發之字元裝置驅動例項
1 驅動標頭檔案mem dev.h ifndef memdev h define memdev h ifndef memdev major define memdev major 238 預設的mem的主裝置號 endif ifndef memdev nr devs define memdev nr...