加入内核源码树外
① 建立两个文件scull.c,scull.h,以及Makefile文件
Makefile文件
② 用make进行编译,生成scull.ko驱动程序模块
③ 把scull.ko模块加载到内核,并且查看scull.ko驱动
④ 查看当前设备使用的主设备号,主设备号为260
⑤ 首先应该在/dev/目录下创建与该驱动程序相对应的文件节点,查看创建好的驱动程序节点文件并修改scull的权限。
⑥ 编写test.c程序,来对驱动程序进行测试。编译并执行该程序
移除驱动模块
加入内核源码树里面① 把驱动程序(模块程序)拷贝到内核源码树根目录下/drivers/char下
② 编译配置文件Kconfig,加入驱动选项,使之在make menuconfig的时候出现改模块选项
③ 在内核根目录下执行make menuconfig
④ 没有安装curses库,安装。
⑤ 在内核根目录下执行make menuconfig,找到驱动模块,设置启动为M
⑥ 在模块文件所在目录的Makefile中加入要编译的驱动模块文件
⑦ 在源代码根目录linux下,执行make bzImage后执行make modules
⑧ 在char目录下查看得知device1.ko已经存在
⑨ 用lsmod指令安装模块文件,再对驱动程序进行测试。编译并执行该程序
代码:
#ifndef _MEMDEV_H_
#define _MEMDEV_H_
#ifndef MEMDEV_MAJOR
#define MEMDEV_MAJOR 260 /*预设的mem的主设备号*/
#endif
#ifndef MEMDEV_NR_DEVS
#define MEMDEV_NR_DEVS 2 /*设备数*/
#endif
#ifndef MEMDEV_SIZE
#define MEMDEV_SIZE 4096
#endif
/*mem设备描述结构体*/
struct mem_dev
{
char *data;
unsigned long size;
};
#endif /* _MEMDEV_H_ */
scull.h
------------------------------------------------------------------------
#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/switch_to.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
#include "scull.h"
static int mem_major = MEMDEV_MAJOR;
module_param(mem_major, int, S_IRUGO);
struct mem_dev *mem_devp; /*设备结构体指针*/
struct cdev cdev;