驱动程序编写实验
sja1000 can 驱动程序演示实验

SJA1000 CAN驱动程序演示实验一.实验目的本驱动程序展示了如何在Small RTOS中编写SJA1000 的驱动程序。
通过调用CAN 程序库SJA1000_PEI.LIB 的基本函数,实现实验板上CAN 节点的初始化以及CAN 节点数据收发测试。
二.实验设备及器件PC 机一台DP-51PROC 单片机综合仿真实验仪一台CAN PARK 模块一台CAN 连接线一根三.实验步骤1、将CAN-bus PARK 插入到A6 区中,用导线连接A6 区的P1_IO2 到A2 区的P1 0,连接A6 区的P1_CS1 到A2 区的A15。
2、使用导线把A2 区的P16 和P17 分别于D5 区的SCL 和SDA 相连。
使用导线把D 5区的/RST 与VCC 相连。
3、由于本程序使用中断方式响应SJA1000 中断,故将A5 区的P1_INT 接到A2 区的INT0。
4、利用CAN 连接线将两台已经安装了CAN-Bus 模块的DP-51PROC 连接起来,以组成简单的CAN 网络实现CAN 的接收和发送。
5、本驱动程序已经将输出文件路径设置为“E:\Temp”,用户可自行更改输出文件路径。
将路径“E:\Temp”中的CAN. hex 文件下载到两台DP-51PROC 中运行。
四.实验参考程序主要部分/*******************************************************描述:独立的CAN 控制器SJA1000PeliCAN 在small rtos 中的应用示例*文件名: PELIRTOS.c*应用语言: KEIL C51*应用系统: small rtos*版本: V1.0*广州周立功单片机发展有限公司保留所有的版权****************************************************/#define _TIME_MODULE_H#define _SERIAL_H/********************************************************** 导入头文件******************************************************/#include "INCLUDES.h"#include "Sja1000_peli.h"sfr IPH=0xb7;sbit RESET_PIN=P1^0;// 验收代码/屏蔽寄存器的内容(4+4)uint8 xdata Send_CAN_Filter[8]={0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff};// 帧信息和标示码(1+4)分别对应TX,TX1,TX2,TX3,TX4uint8 xdata Send_CAN_Info_ID[3]={0xc7,0x0A,0x0B};uint8 xdata Recv_CAN_Info_ID[3];// 待发送数据(8)uint8 xdataSend_CAN_Data[13]={0xc7,0x0A,0x0B,0x04,0x05,0x06,0x07,0x08,0x07,0x0 8,0x07,0x08,0x08};uint8 xdata Recv_CAN_Data[14];uint8 xdata time_Counter=0;uint8 xdata BTR0,BTR1;uint16 xdata *p;uint8 xdata disp_buf[8];void CAN_Send(void);void display(void);void CAN_Rcv(void);void TimeSum(void);void Delay_ms(uint8 j);void SJA1000_Config_Normal(void);void Init(void){CKCON=1; //应用6clockTMOD = (TMOD & 0XF0) | 0X01;TCON=TCON|0x04; //MCU 的INT1 下降沿触发,INT0 电平触发TH0 = (65536 - (11059200 / 12) / 100) / 256;TL0 = (65536 - (11059200 / 12) / 100) % 256;TR0 = 1;ET0 = 1;TF0 = 0;}/************************************************************** ****函数名称:void CAN_Init(void)**功能描述:复位SJA1000,并设置其工作在正常模式************************************************************** ***/void CAN_Init(void){RESET_PIN=0; //将SJA1000 的复位线与P1.0 相连接Delay_ms(1);RESET_PIN=1; //控制P1.0 来实现SJA1000 的复位SJA_CS_Point=&CAN_SJA_BaseAdr;SJA1000_Config_Normal();WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000 接收中断EX0=1;}/************************************************************** ** 函数原型: void Delay_ms(uchar j)** 功能描述: 该函数用于不精确的延时。
计算机操作系统实验二

计算机操作系统实验二一、实验目的本实验旨在通过实际操作,深入理解和掌握计算机操作系统中的进程与线程管理。
通过实验,我们将了解进程的创建、执行、阻塞、唤醒等状态以及线程的创建、同步、通信等操作。
同时,通过实验,我们将学习如何利用进程和线程提高程序的并发性和效率。
二、实验内容1、进程管理a.进程的创建与执行:通过编程语言(如C/C++)编写一个程序,创建一个新的进程并执行。
观察和记录进程的创建、执行过程。
b.进程的阻塞与唤醒:编写一个程序,使一个进程在执行过程中发生阻塞,并观察和记录阻塞状态。
然后,通过其他进程唤醒该进程,并观察和记录唤醒过程。
c.进程的状态转换:根据实际操作,理解和分析进程的状态转换(就绪状态、阻塞状态、执行状态)以及转换的条件和过程。
2、线程管理a.线程的创建与同步:编写一个多线程程序,创建多个线程并观察和记录线程的创建过程。
同时,使用同步机制(如互斥锁或信号量)实现线程间的同步操作。
b.线程的通信:通过消息队列或其他通信机制,实现多个线程间的通信。
观察和记录线程间的通信过程以及通信对程序执行的影响。
c.线程的状态转换:根据实际操作,理解和分析线程的状态转换(新建状态、就绪状态、阻塞状态、终止状态)以及转换的条件和过程。
三、实验步骤1、按照实验内容的要求,编写相应的程序代码。
2、编译并运行程序,观察程序的执行过程。
3、根据程序的输出和实际操作情况,分析和理解进程与线程的状态转换以及进程与线程管理的相关原理。
4、修改程序代码,尝试不同的操作方式,观察程序执行结果的变化,进一步深入理解和掌握进程与线程管理。
5、完成实验报告,总结实验过程和结果,提出问题和建议。
四、实验总结通过本次实验,我们深入了解了计算机操作系统中的进程与线程管理原理和实践操作。
在实验过程中,我们不仅学习了如何利用编程语言实现进程和线程的操作,还通过实际操作观察和分析了进程与线程的状态转换以及进程与线程管理的基本原理。
华科操作系统实验报告

华科操作系统实验报告一、实验目的操作系统是计算机系统的核心组成部分,对于理解计算机的工作原理和提高计算机应用能力具有重要意义。
本次华科操作系统实验的主要目的是通过实际操作和实践,深入理解操作系统的基本概念、原理和功能,掌握操作系统的核心技术和应用方法,提高我们的实践能力和问题解决能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),开发工具包括 Visual Studio Code、GCC 编译器等。
实验硬件环境为个人计算机,配置为英特尔酷睿 i7 处理器、16GB 内存、512GB 固态硬盘。
三、实验内容1、进程管理进程创建与销毁进程调度算法模拟进程同步与互斥2、内存管理内存分配与回收算法实现虚拟内存管理3、文件系统文件操作与管理文件系统的实现与优化4、设备管理设备驱动程序编写设备分配与回收四、实验步骤及结果1、进程管理实验进程创建与销毁首先,使用 C 语言编写程序,通过系统调用创建新的进程。
在程序中,使用 fork()函数创建子进程,并在子进程和父进程中分别输出不同的信息,以验证进程的创建和执行。
实验结果表明,子进程和父进程能够独立运行,并输出相应的信息。
进程调度算法模拟实现了先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)三种进程调度算法。
通过模拟多个进程的到达时间、服务时间和优先级等参数,计算不同调度算法下的平均周转时间和平均等待时间。
实验结果显示,SJF 算法在平均周转时间和平均等待时间方面表现较好,而 RR 算法能够提供较好的响应时间和公平性。
进程同步与互斥使用信号量和互斥锁实现了进程的同步与互斥。
编写了生产者消费者问题的程序,通过信号量控制生产者和消费者对缓冲区的访问,避免了数据竞争和不一致的情况。
实验结果表明,信号量和互斥锁能够有效地实现进程间的同步与互斥,保证程序的正确性。
2、内存管理实验内存分配与回收算法实现实现了首次适应(First Fit)、最佳适应(Best Fit)和最坏适应(Worst Fit)三种内存分配算法。
实验二:字符设备驱动实验

实验二:字符设备驱动实验一、实验目的通过本实验的学习,了解Linux操作系统中的字符设备驱动程序结构,并能编写简单的字符设备的驱动程序以及对所编写的设备驱动程序进行测试,最终了解Linux操作系统如何管理字符设备。
二、准备知识字符设备驱动程序主要包括初始化字符设备、字符设备的I/O调用和中断服务程序。
在字符设备驱动程序的file_operations结构中,需要定义字符设备的基本入口点。
open()函数;release()函数read()函数write()函数ioctl()函数select()函数。
另外,注册字符设备驱动程序的函数为register_chrdev()。
register_chrdev() 原型如下:int register_chrdev(unsigned int major, //主设备号const char *name, //设备名称struct file_operations *ops); //指向设备操作函数指针其中major是设备驱动程序向系统申请的主设备号。
如果major为0,则系统为该驱动程序动态分配一个空闲的主设备号。
name是设备名称,ops是指向设备操作函数的指针。
注销字符设备驱动程序的函数是unregister_chrdev(),原型如下:int unregister_chrdev(unsigned int major,const char *name);字符设备注册后,必须在文件系统中为其创建一个设备文件。
该设备文件可以在/dev目录中创建,每个设备文件代表一个具体的设备。
使用mknod命令来创建设备文件。
创建设备文件时需要使用设备的主设备号和从设备号作为参数。
阅读教材相关章节知识,了解字符设备的驱动程序结构。
三、实验内容根据教材提供的实例。
编写一个简单的字符设备驱动程序。
要求该字符设备包括open()、write()、read()、ioctl()和release()五个基本操作,并编写一个测试程序来测试所编写的字符设备驱动程序。
实验一 内存读写驱动

实验一内存读写实验一、实验目的:1、熟练掌握驱动程序的框架结构及对应函数实现。
2、掌握各系统调用函数的典型用法。
3、明确内核空间与用户空间数据的交换方法。
4、可以根据需求灵活更改驱动程序及验证应用程序。
二、实验设备:FS2410开发板、学生自带笔记本、USB转串口线、电源、网线。
三、实验地点及时间地点:A2-303a时间:教学周第三周四、实验内容:1、在PC机上面,编写模块框架驱动程序Helloworld,并加载成功。
2、编写操控一块内存区域的字符框架程序,在通用PC上面调试成功,并移植到开发板上。
五、实验原理:1、模块驱动原理Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件呢:方法一:把所有的组件都编译进内核文件,即:zImage或bzImage,但这样会导致两个问题:一是生成的内核文件过大;二是如果要添加或删除某个组件,需要重新编译整个内核。
有没有一种机制能让内核文件(zImage或bzImage)本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中呢?Linux提供了一种叫做“内核模块”的机制,就可以实现以上效果。
以下是helloworld的实例:安装模块时被系统自动调用的函数,通过module_init宏来指定,卸载模块时被系统自动调用的函数,通过module_exit宏来指定,此外还有一些宏定义;比如所有模块代码都应该指定所使用的许可证:MODULE_LICENSE("DualBSD/GPL");其他描述性定义:MODULE_AUTHOR("");MODULE_DESCRIPTION("");MODULE_VERSION("");MODULE_ALIAS("");MODULE_DEVICE_TABLE("");等等。
七段数码显示驱动实验

第 3 步:运行 make 编译命令,用 ls 命令查看编译后的结果,在该目录中应生成 xsb_seg.ko 模块文件,利用 file 命令查看 xsb_seg.ko 文件的格式,应为 ARM 格 式的 ELF 文件。
第 4 步:利用 vi 编辑器在 test 目录下编译测试驱动的 seg_test.c 源文件。
(3)写具体某位七段数码光驱动管显示函数
void value_seting(struct seg *seg_7, char position, char value)
{ if (seg_7->negative==0) value=~value & ~(0x1<<7); else value=(0x1<<7)|value; if (position==1) seg_7->LED1_Val=value; else if(position==2) seg_7->LED2_Val=value; else if(position==3) seg_7->LED3_Val=value; else if(position==4) seg_7->LED4_Val=value; }
(7)实现七段数码管驱动释放函数
static int XSB_Seg_release(struct inode *inode, struct file *filp) { printk(KERN_EMERG "The Module is release,XSB_Seg_release\n"); kfree(filp->private_data); return 0; }
char number[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; void clear_led(int fd) { int i; char val=0; for(i=1;i<=4;i++) ioctl(fd, i, &val); sleep(1); } void display_led(int fd) { int i; char val=0x7f; for(i=1;i<=4;i++) ioctl(fd, i, &val); sleep(1); } void appear_same(int fd) { char i,j,base=0; for (j=0, base=0 ;j<=9; j++, base++) { for(i=1; i<=4; i++) ioctl(fd, i, number+base); sleep(1); } } void appear_roll(int fd) { char i, j, base=0; for (j=0, base=0; j<=9; j++, base++) { for(i=1; i<=4; i++) ioctl(fd, i, number+(base+i-1)%10); sleep(1); } } void display_menu() { printf(" *****Choice Menu*********\n"); printf(" [0] Open Device\n");
windows操作实验报告

windows操作实验报告一、实验目标通过本实验掌握是用硬件厂商提供的驱动程序,或从网络上下载驱动程序压缩包各类硬件设备的驱动程序。
二、实验内容练习使用硬件厂商提供的驱动程序或从网络上下载在驱动程序压缩包。
三、知识准备1、驱动程序概述驱动程序是对基本系统功能不能支持的各种硬件设备进行解释,是计算机能识别这些硬件设备,从而保证它们的正常运行。
2、什么情况下需要安装设备驱动程序在安装微机系统时,硬件设备虽然已经安装连接好了,但却无法正常使用,这时就需要安装厂商提供的驱动程序了。
3、安装驱动程序的原则4、常见驱动程序安装方式四、操作步骤1、利用驱动盘安装程序(1)找到硬件安装向导,选择安装方式(2)、如果操作系统没有支持这个硬件的驱动的话,那么如图4,就无法完成驱动程序的安装。
如果操作系统包含了支持这个硬件的驱动程序的话,如图5,那么系统将自动为这个硬件安装驱动。
2、安装intel芯片组主板的驱动程序(1)将购买的主板时附带的驱动光盘放入光驱中,程序自动运行,出现安装向导,在主菜单界面单击“intelchipsetsoftwareinstallationutility”选项,进入安装向导。
(2)单击“下一步”按钮,出现许可协议,单击“是”。
(3)浏览自述文件,单击“下一步”,程序开始复制文件。
(4)复制文件完成后,单击“完成”按钮,程序重启计算机,完成安装工作。
五、实验结论通过实验我学会了硬件厂商提供的驱动程序或从网络上下载在驱动程序压缩包。
一、实验任务:通过学习本次实验了解系统备份的重要性,掌握使用ghost 软件实现系统数据备份和还原的方法。
二、实验内容:练习使用ghost软件实现系统备份和还原以及硬盘的复制。
三、实验要点:通过学习了解系统数据的重要性,熟练掌握利用软件对系统进行备份、还原及备份。
四、知识准备:1、系统的备份和还原2、了解ghost软件的概述3、了解什么情况下应该备份和还原系统。
4、掌握ghost的各种界面。
实训8-驱动程序和应用程序安装实验报告

实训8-驱动程序和应用程序安装实验报告
1. 实验目的
本实验旨在通过驱动程序和应用程序的安装,让学生掌握安装
过程中的注意事项和步骤。
2. 实验内容
2.1 驱动程序安装
1. 首先,确定需要安装的驱动程序,可以通过厂商官网或设备
手册获取相应的驱动程序。
2. 下载驱动程序文件,并将其保存在本地计算机的指定位置。
3. 双击打开驱动程序文件,开始安装程序。
根据安装向导的指示,完成驱动程序的安装过程。
4. 在安装完成后,根据需要重新启动计算机。
2.2 应用程序安装
1. 确定需要安装的应用程序,可以通过官网或应用商店获取相
应的应用程序。
2. 在手机或计算机上找到应用商店,搜索并找到所需应用程序。
3. 点击下载并安装应用程序。
根据应用商店的指示,完成应用程序的安装过程。
4. 完成安装后,可以在应用列表或桌面上找到新安装的应用程序。
3. 实验结果
通过以上步骤,我成功安装了所需的驱动程序和应用程序。
安装过程中没有出现任何错误或异常情况。
4. 实验总结
通过本次实验,我了解了驱动程序和应用程序的安装过程,并熟悉了相应的操作步骤。
安装驱动程序时,需要注意选取正确的驱动文件和按照安装向导的指示进行操作。
安装应用程序时,需要确保下载和安装的来源可靠,并按照应用商店的指示进行操作。
在实际应用中,安装和更新驱动程序和应用程序是保持设备正常运行和获得最新功能的重要操作。
因此,掌握安装过程的步骤和注意事项对于用户来说是非常有价值的。
附录:参考链接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六驱动程序编写实验一、实验目的1、掌握Linux下驱动程序开发过程2、了解驱动程序框架3、熟练使用gcc编译器4、理解makefile文件作用5、学会安装驱动程序,熟悉指令insmod,mknod,rmmod。
二、实验设备1、硬件:PC机。
2、软件:vmware虚拟机,win7/XP三、实验内容1、编写pc机下的驱动程序,并安装驱动2、编写应用程序调用驱动程序。
四、程序代码#include<linux/module.h>#include<linux/init.h>#include<linux/kernel.h>#include<linux/fs.h>#include<linux/uaccess.h>#include<linux/semaphore.h>#include<linux/cdev.h>#include<linux/device.h>#include<linux/ioctl.h>#include<linux/slab.h>#include<linux/errno.h>#include<linux/string.h>#include"hello_mod_ioctl.h"#define MAJOR_NUM250#define MINOR_NUM0#define IN_BUF_LEN256#define OUT_BUF_LEN512MODULE_AUTHOR("Tishion");MODULE_DESCRIPTION("Hello_mod driver by tishion");static struct class*hello_class;static struct cdev hello_cdev;static dev_t devnum=0;static char*modname="hello_mod";static char*devicename="hello";static char*classname="hello_class";static int open_count=0;static struct semaphore sem;static spinlock_t spin=SPIN_LOCK_UNLOCKED;static char*inbuffer=NULL;static char*outbuffer=NULL;static lang_t langtype;static int hello_mod_open(struct inode*,struct file*);static int hello_mod_release(struct inode*,struct file*);static ssize_t hello_mod_read(struct file*,char*,size_t,loff_t*);static ssize_t hello_mod_write(struct file*,const char*,size_t,loff_t*);static int hello_mod_ioctl(struct inode*,struct file*,unsigned int,unsigned long);struct file_operations hello_mod_fops={.owner=THIS_MODULE,.open=hello_mod_open,.read=hello_mod_read,.write=hello_mod_write,.ioctl=hello_mod_ioctl,.release=hello_mod_release,};static int hello_mod_open(struct inode*inode,struct file*pfile){printk("+hello_mod_open()!/n");spin_lock(&spin);if(open_count){spin_unlock(&spin);return-EBUSY;}open_count++;spin_unlock(&spin);printk("-hello_mod_open()!/n");return0;}static int hello_mod_release(struct inode*inode,struct file*pfile){printk("+hello_mod_release()!/n");open_count--;printk("-hello_mod_release()!/n");return0;}static ssize_t hello_mod_read(struct file*pfile,char*user_buf,size_t len,loff_t*o ff){printk("+hello_mod_read()!/n");if(down_interruptible(&sem)){return-ERESTARTSYS;}memset(outbuffer,0,OUT_BUF_LEN);printk("+switch()/n");switch(langtype){case english:printk(">in case:english/n");sprintf(outbuffer,"Hello!%s.",inbuffer);break;case chinese:printk(">in case:chinese/n");sprintf(outbuffer,"你好!%s.",inbuffer);break;case pinyin:printk(">in case:pinyin/n");sprintf(outbuffer,"ni hao!%s.",inbuffer);break;default:printk(">in case:default/n");break;}printk("-switch()/n");{up(&sem);return-EFAULT;}up(&sem);printk("-hello_mod_read()!/n");return0;}static ssize_t hello_mod_write(struct file*pfile,const char*user_buf,size_t len,lo ff_t*off){printk("+hello_mod_write()!/n");if(down_interruptible(&sem)){return-ERESTARTSYS;}if(len>IN_BUF_LEN){printk("Out of input buffer/n");return-ERESTARTSYS;}{up(&sem);return-EFAULT;}up(&sem);printk("-hello_mod_write()!/n");return0;}static int hello_mod_ioctl(struct inode*inode,struct file*pfile,unsigned int cmd, unsigned long arg){int err=0;printk("+hello_mod_ioctl()!/n");printk("+switch()/n");switch(cmd){case HELLO_IOCTL_RESETLANG:printk(">in case:HELLO_IOCTL_RESETLANG/n");langtype=english;break;case HELLO_IOCTL_GETLANG:printk(">in case:HELLO_IOCTL_GETLANG/n");err=copy_to_user((int*)arg,&langtype,sizeof(int));break;case HELLO_IOCTL_SETLANG:printk(">in case:HELLO_IOCTL_SETLANG/n");err=copy_from_user(&langtype,(int*)arg,sizeof(int));break;default:printk(">in case:default/n");err=ENOTSUPP;break;}printk("-switch()/n");printk("-hello_mod_ioctl()!/n");return err;}static int__init hello_mod_init(void){int result;printk("+hello_mod_init()!/n");devnum=MKDEV(MAJOR_NUM,MINOR_NUM);result=register_chrdev_region(devnum,1,modname);if(result<0){printk("hello_mod:can't get major number!/n");return result;}cdev_init(&hello_cdev,&hello_mod_fops);hello_cdev.owner=THIS_MODULE;hello_cdev.ops=&hello_mod_fops;result=cdev_add(&hello_cdev,devnum,1);if(result)printk("Failed at cdev_add()");hello_class=class_create(THIS_MODULE,classname);if(IS_ERR(hello_class)){printk("Failed at class_create().Please exec[mknod]before operate the devic e/n");}else{device_create(hello_class,NULL,devnum,NULL,devicename);}open_count=0;langtype=english;inbuffer=(char*)kmalloc(IN_BUF_LEN,GFP_KERNEL); outbuffer=(char*)kmalloc(OUT_BUF_LEN,GFP_KERNEL); init_MUTEX(&sem);printk("-hello_mod_init()!/n");return0;}static void__exit hello_mod_exit(void){printk("+hello_mod_exit!/n");kfree(inbuffer);kfree(outbuffer);cdev_del(&hello_cdev);device_destroy(hello_class,devnum);class_destroy(hello_class);unregister_chrdev_region(devnum,1);printk("-hello_mod_exit!/n");return;}module_init(hello_mod_init);module_exit(hello_mod_exit);MODULE_LICENSE("GPL");hello_mod_iotcl.h[cpp] view plaincopyprint?/**=====================================================================================**Filename:hello_mod_ioctl.h**Description:define the cmd supported by hello_mod**Version:1.0*Created:06/19/201110:24:20PM*Revision:none*Compiler:gcc**Author:Tishion(shion),tishion@*Company:LIM**================================================================== ===================*/#ifndef__HELLO_MOD_IOCTL_H__#define__HELLO_MOD_IOCTL_H__#define HELLO_MAGIC12#define HELLO_IOCTL_RESETLANG_IO(HELLO_MAGIC,0)//set langtype=engli sh#define HELLO_IOCTL_GETLANG_IOR(HELLO_MAGIC,1,int)//get langtype#define HELLO_IOCTL_SETLANG_IOW(HELLO_MAGIC,2,int)//set langtypetypedef enum_lang_t{english,chinese,pinyin}lang_t;#endifMakefile#**********************************************#Makefile linux2.6Module#This makefile is written for Ubuntu10.10#It may not perfomance without erros on the#other version or distributions.#**********************************************#BY:tishion#Mail:tishion@#2011/06/19#**********************************************obj-m+=hello_mod.oCURRENT_PATH:=$(shell pwd)LINUX_KERNEL:=$(shell uname-r)LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)all:make-C$(LINUX_KERNEL_PATH)M=$(CURRENT_PATH)modules clean:make-C$(LINUX_KERNEL_PATH)M=$(CURRENT_PATH)clean install:insmod hello_mod.kounistall:rmmod hello_mod附上一用户层测试文件,编译后需要root身份执行。