简单的Linux驱动程序以及如何加载/卸载驱动

今天记录一下简单的Linux驱动程序怎么写以及如何加载/卸载驱动

以hello.c为例:

hello.c

#ifndef __KERNEL__
#  define __KERNEL__
#endif
#ifndef MODULE
#  define MODULE
#endif

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void){
    printk(KERN_ALERT "HELLO WORLD\n");
    return 0;
}
static void hello_exit(void){
    printk(KERN_ALERT "GOODBYE CRUEL WORLD\n");
}
module_init(hello_init);
module_exit(hello_exit);

/*
3.5.0-23-generic
make -C /lib/modules/3.5.0-23-generic/build M=`pwd` modules
*/

  

用Makefile来编译:

Makefile

obj-m := hello.o

all :
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

以下终端是编译命令,下图所示编译成功:

加载和移除驱动:

sudo insmod ./hello.ko
sudo rmmod hello

  

查看日志

tail /var/log/kern.log 

参考博客https://www.cnblogs.com/QuLory/archive/2012/10/23/2736339.html

原文地址:https://www.cnblogs.com/GotWindy/p/11067015.html

时间: 2024-08-03 10:05:11

简单的Linux驱动程序以及如何加载/卸载驱动的相关文章

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

驱动学习 - 加载.卸载驱动

#ifdef __cplusplus extern "C" { #endif #include <ntddk.h> //以"C"语言的方式编译 #ifdef __cplusplus } #endif #define PAGECODE code_seg("PAGE") //分页内存中运行 #pragma PAGECODE void UnLoadDriver(IN PDRIVER_OBJECT pDriverObj); //卸载驱动 //

Linux内核启动及加载根文件系统

</pre></h1><p><span style="font-family:KaiTi_GB2312;font-size:18px;">上接博文<<a target=_blank href="http://blog.csdn.net/gqb_driver/article/details/8931775" style="text-decoration: none; font-family: 'Mi

发生系统错误 1275.此驱动程序被阻止加载

安装书中第一章成功安装first服务之后,在cmd窗口使用命令行 "net start first" 时, 出现 "发生系统错误 1275.此驱动程序被阻止加载" 后来多方查找,发现问题 WIN7 X64系统中对驱动程序要求有数字签名,否则无法正常使用 解决方法如下: 64位win7禁用驱动程序签名强制 开机之后在登录等待界面按下F8键,进入Windows系统的高级启动项,我们会发现与原有的XP系统多了一些不同的地方,最后一项中为禁用驱动程序签名强制,按照此项进入系

Linux程序动态库加载优化

作者:zhanhailiang 日期:2014-10-26 linux程序动态库加载流程简介 linux从程序(program或对象)变成进程(process或进程),简单说来需要经过三步: fork进程,在内核创建进程相关内核项,加载进程可执行文件: 查找依赖的.so,逐一加载映射虚拟地址: 初始化程序变量: 如下例通过strace查看pwd命令执行过程: [root@~/wade/codeReview/learningc]# strace pwd execve("/bin/pwd"

java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类的私有方法么?private()方法 答:可以,class取出method,method继承executable类,executable类继承AccessibleObject类,AccessibleObject有个setAccessiable()设置这个方法是否可访问. 则设置成true,就可将pr

一个简单的Linux驱动程序:统计单词个数

Linux驱动和普通的Linux API 没本质区别,只是二者使用方式不同. Linux系统将每一个驱动都映射成一个文件,即设备文件,保存在/dev目录中. Linux驱动编写关键在于回调函数编写. 编写Linux驱动程序的步骤: 建立Linux驱动骨架(装载和卸载Linux驱动):即驱动的装载和卸载: 注册和注销设备文件:即创建和移除设备: 指定驱动相关信息:驱动程序是自描述的: 指定回调函数:做好数据接收响应: 编写业务逻辑:Linux驱动的核心部分,由多个函数.多个文件或者多个Linux驱

java加载jdbc驱动三种方式的比较

平时连接数据库的时候首先要加载jdbc驱动,这一步骤其实有三种方式,他们的区别?优劣? 快速了解三种加载方式 Class.forName("com.mysql.jdbc.Driver"); DriverManager.registerDriver(new com.mysql.jdbc.Driver()) System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver"); 注释: 第二种与第三种注

hibernate 加载 jdbc驱动出错Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; not set

Exception in thread "main" org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set程序基本没动过,以前用的3.3.2的版本,今天换成4.3.4的版本后,改了一下sessionFactory的生成方法,其他的不变,开始还能运行,过了30min左右,就不能运行了! hibernate4 已经废弃