hello world 驱动程序编写
操作系统课程设计选题 驱动程序的编写和安装。
经过一天多的努力,终于把我的第一个驱动程序模块成功编写并实现插入内核和移除,在这里把过程记录下来方便以后查看,也给其他为之困扰的朋友一个建议。
环境: windows 7 下 VMware 9.0 中装 Ubuntu12.04 内核版本为3.5.0-32-generic
搭建驱动开发环境:
相应版本的 gcc、gdb、make 。 内核源代码树。在Ubuntu 下内核源代码一般存放在 /usr/src/ 下。 我的Ubuntu /usr/src/下有两个文件夹 linux-headers-3.5.0-23 , linux-header-3.5.0-23-general 。从名字看这两个文件夹中的东西应该不是系统全部的源代码,打开看里面的东西也很少,一开始我以为这不是系统的全部源代码,没法使用。所以就到www.kernel.org上下载了linux-3.5的内核源代码,(为什么下载Linux3.5 而不是 3.5.0 ,因为网站上没找到)并编译配置。
编写hello world 模块
#include "linux/init.h"
#include "linux/module.h"
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "hello , world !");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "goodbye , cruel world \n");
}
module_init(hello_init);
module_exit(hello_exit);
然后写GNU扩展的Makefile,为了简单Makefile文件中只写了一行
obj-m := hello.o
编译:
在命令行下:
make -C /usr/src/linux-header-3.5.0-23-general M=/root/Desktop modules
各个参数的意义 : -C 后面的是与当前运行的内核版本相同的内核源代码树目录。 M后面的是内核代码和Makefile所在的文件夹 。 modules 表示编译的目标文件,是必须的。 编译完成后会在当前目录下生成一个hello.ko 模块文件。
插入到内核模块:
insmod hello.ko (执行这一步时系统会输出上面定义的hello_init()函数中的内容)
移除模块:
rmmod hello.ko(执行这一条语句时系统会输出上面定义的hello_exit()函数中的内容)
可能出现的错误:
1. printk(KERN_ALERT "goodbye , cruel world \n");
注意这一串大写字符代表的是优先权的设定,后面不能有逗号。否者会出现 参数过多的错误。
2. -C 后面的参数所指定的目录一定是与当前运行系统内核版本相同的内核源代码树所在目录。我一开始用的是我下载的Linux-3.5 的内核源代码树,结果卡了老半天都是 insmod: error inserting 'hello.ko': -1 Invalid module format。的错误。最后我把这个目录改成 /usr/src/linux-header-3.5.0-23-general 就行了。这个目录是安装系统时就有的。
下面截个图秀一下:

有很多的东西我也没搞明白,正在努力学习中~~~~~
hello world 驱动程序编写的更多相关文章
- 11.ok6410之led驱动程序编写
led驱动程序编写 本文主要包含三部分,led驱动程序led.c编写,编译驱动程序的makefile的编写,以及使用驱动程序的应用程序led_app的编写 一.led.c编写 #include < ...
- 转:Linux网卡驱动程序编写
Linux网卡驱动程序编写 [摘自 LinuxAID] 工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大 ...
- LCD驱动程序编写
学习目标:编写LCD驱动程序,熟悉根据芯片手册分析时序图,配置寄存器,并测试LCD程序. 一.LCD驱动程序编写 步骤: 1)分配fb_info结构体 2)设置fb_info结构体 a. 固定参数 b ...
- 从零开始写驱动——vfd专用驱动芯片HT16514并行驱动程序编写
前言 一直看别人搞的 vfd 很漂亮,前段时间淘了个 vfd 模块来,但没有模块资料,还好芯片没有打磨的,良心商家啊.周末抽空来研究一下这个东西. 从零开始 打开外壳 测试线路 查看芯片是 HT165 ...
- 〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录
最近在看一本书,受益匪浅,作者是李宁,下边是编写本次蜂鸣器的全程实录: 1. 了解开发板中的蜂鸣器 1) 查看蜂鸣器buzzer在底板中的管脚信息 2) 查看蜂鸣器在总线中的信息 3) 翻看S3C64 ...
- DM9000C网卡驱动程序编写与测试
一般网卡驱动程序厂商会给我们提供一份模板驱动,我们的工作就是需要根据自己的需要更改这个模板驱动 1.DM9000C的硬件连接 硬件连接图如下所示:它接在S3C2440的BANK4内存控制器上,它只占用 ...
- nandflash驱动程序编写
NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线, 怎么传输地 ...
- linuxlcd驱动程序编写 mini2440(w35)
先说lcd驱动的框架吧! lcd驱动也有自己的框架,如果没有框架,要我们自己完成所有lcd驱动的代码编写那将是很痛苦的一件事. lcd驱动主要依赖于一个文件,fbmem.c 其实它还依赖几个文件 不 ...
- Linux中断处理驱动程序编写【转】
转自:http://blog.163.com/baosongliang@126/blog/static/1949357020132585316912/ 本章节我们一起来探讨一下Linux中的中断 中断 ...
随机推荐
- wget 增加单个文件下载限制大小
增加了参数 -M --limit-size 使用方法 -M 5m 或者 -M 500k 或者 --limit-size=5m 或者 --limit-size=500k 下载地址 http://pan. ...
- discuz插件开发新手入门 超详细
作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...
- AsyncHttpClient
package com.jingle.httpstudy; import org.apache.http.Header; import android.app.Activity; import ...
- Linux系统查看系统是32位还是64位方法总结(转)
总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT 查看 如下 ...
- phpcms如何使用推荐位调用自定义字段
默认phpcms是无法使用推荐位调用自定义字段的 一般自定义字段默认添加在附表里(也可以添加在主表里),调用自定义字段时 加上moreinfo="1" 直接写{pc:content ...
- Sonar+Hudson+Maven构建系列之一:安装Sonar
摘要:本系列讲述Sonar在Linux下安装及配置过程,windows下的安装类似,会更简单. 本人经过一翻摸索,终于将Sonar+Hudson+Maven配置成功,并使用Hudson进行自动构建,发 ...
- 微信SDK开发学习
public class MainActivity extends Activity { // 应用程序的id,就是在网上开发平台创建应用的appid public static final Stri ...
- WPF的Presenter(ContentPresenter)(转)
这是2年前写了一篇文章 http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html 我们先来看M ...
- LinQ的一些基本语句
LINQ(Language Integrated Query)即语言集成查询.它是一种语言特性和API,使得你可以使用统一的方式编写各种查询,查询的对象包括xml.对象集合.SqlServer数据库等 ...
- 简单几何(数学公式+凸包) UVA 11168 Airport
题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...