目的:

1. 驱动热身。网上有很多类似的文章可供参考。

2. 在操作系统中, 编写这个设备的驱动。

3. 为写qemu的watchdog驱动练手。

有朋友问make的 watchdog驱动 需要什么准备,所以写这个blog。

环境:

ubuntu 12.04.4

热身:

  首先编写一个简单的 hello world驱动。

耗时(基于熟悉linux环境和操作系统的条件下):

  1. 安装操作系统 30-60分钟。

  2. 配置操作系统 30分钟。主要是配置中文书法。无其他特殊的配置。

  3. 代码编写运行 40分钟。

查看自己的内核版本:

Search for kernel version (optional)(搜寻内核的版本)

Type the following command:

$ apt-cache search linux-headers-$(uname -r)

Install linux-header package under Debina or Ubuntu Linux(更新内核的版本)

Type the following command:

$ sudo apt-get install linux-headers-$(uname -r)

代码:

// hello.c的驱动程序:
 
#include<linux/init.h>  //初始换函数
#include<linux/kernel.h>  //内核头文件
#include<linux/module.h>  //模块的头文件
 
MODULE_LICENSE("shaohef  BSD/GPL");
 
static int __init hello_start(void)
{
    printk(KERN_ALERT "Loading hello module...\n");
    printk(KERN_ALERT "Hello world\n");
    return 0;
}
 
static void __exit hello_end(void)
{
    printk(KERN_ALERT "Goodbye Mr.\n");
}
module_init(hello_start);
module_exit(hello_end);
// makefile文件:
ifeq ($(KERNELRELEASE),)
 KVERSION = $(shell uname -r)
all:
 make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) modules
clean:
 make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean
modules_install
 $(MAKE)  -C  $(KERNELDIR)M=$(PWD)  modules_install
else
 obj-m :=hello.o
endif
 

安装驱动(可能需要重启):

编译

$ make

挂载驱动

$ sudo insmod hello.ko

卸载驱动

$ sudo rmmod hello

查看驱动, 最好加上管道 |more指令 或者|grep

lsmod |grep hello

系统启动的时加载模块

文件 /etc/modules 设置加载的内核,这个文件里包含了系统启动的时候要加载的模块,每一个模块一行。

首先 hello 模块 拷贝到 /lib/modules/$(uname -r)/kernel/drivers.

建议的步骤:

(a)为 hello 模块建立一个目录

$ sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/hello

(b)拷贝模块

$ sudo cp hello.ko /lib/modules/$(uname -r)/kernel/drivers/hello/

(c)编辑 /etc/modules 文件

$ sudo vim /etc/modules

加上下面一行

hello

(d)重启查看是否加载。

$ sudo cat /proc/modules

或者

$ sudo lsmod | less

查看程序的输出:

#cat   /var/log/syslog  |grep  world

如果syslog没有输出, 查看 /var/log/message 里面的信息

# tail -f /var/log/message

注:

insmod的本质就是将ko文件与运行的内核进行链接的过程。类似于编译helloworld的链接过程。

链接必然需要先进行编译,以便确定所需的外部符号(EXPORT_SYMBOLS)是否存在,因为有些符号(函数或全局变量)在内核中。在驱动中如果使用到这些符号,必须预留一个位置,insmod时进一步确定这些符号的具体位置(符号绑定)。

如果内核都没有编译过,怎么知道这些符号有没有编入内核中

ubuntu下编译内核驱动。的更多相关文章

  1. Ubuntu下编译内核

    一.下载源代码和编译软件的准备 下载内核源代码:http://www.kernel.org/ 注意,点击2.6.25内核的F版,即完整版. 如果你懒得去网站点联接,运行下列命令:  代码: $cd ~ ...

  2. ubuntu 下编译内核

    目的: 1. 练习.网上有很多类似的文章可供参考. 2. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准备,所以写这个blog. 环境: ubuntu ...

  3. linux下编译运行驱动

    linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...

  4. RedHat5.8 编译内核驱动 合成initrd.img

    /******************************************************************* * RedHat5.8 编译内核驱动 合成initrd.img ...

  5. ubuntu下编译caffe

    Ubuntu下编译caffe 纯粹是个人编译的记录.不用CUDA(笔记本是amd卡,万恶的nvidia):不手动编译依赖包(apt-get是用来干啥的?用来直接装二进制包,以及自动解决依赖项的) ca ...

  6. ubuntu下编译VLC

    ubuntu下编译VLC 标签(空格分隔): ubuntu vlc 视频 编译 [TOC] 1.下载VLC源码包并解压 VLC的源码包在VLC的官网有,可以直接下载.也可以使用git来clone一个. ...

  7. 在Ubuntu下编译wpa_supplicant

    最近在研究WiFi联盟的多屏互动协议Miracast,其中需要用到wpa_supplicant,编译中遇到了一些问题,经过一下午的折腾也都解决了,下面分享给各位. 一.编译需要用到三个库源码包,分别是 ...

  8. 在Ubuntu下编译Assimp库

    在Ubuntu下编译Assimp库 怎样在Ubuntu下编译Assimp库?这是我曾经编译成功后做的笔记,供參考. 1.去以下的站点去下载Assimp库: http://assimp.sourcefo ...

  9. ubuntu下编译java程序

    ubuntu下编译java程序 首先需要安装jdk,并配置好相应环境变量 下面以简单的HelloWorld为例 文件名为HelloWorld.java java代码: public class Hel ...

随机推荐

  1. python基础教程第2章——列表与元组笔记

    1.序列是Python中最基本的数据结构.序列中的每个元素被分配一个序列号——元素的位置,也称索引,第1个索引是0,第2为1,以此类推.序列中的最后1个元素为-1,倒数第2个位-2. python中有 ...

  2. intial-scale=1的含义

    meta name="viewport" content="width=device-width,initial-scale=1.0" 解释  <meta ...

  3. Ubuntu下Geary安装

    sudo add-apt-repository ppa:yorba/ppasudo apt-get updatesudo apt-get install geary

  4. FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

    用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要 ...

  5. Android客户端与服务器交互中的token

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...

  6. Formiko总结整数十进制转换二进制原理

    引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了Formiko半年. 实践: 实践一:把十进制数100转换成二进制数的图   上图和和下图唯一的区别在最后一位上 ...

  7. 9大理由告诉你为什么应该学习HTML跟CSS

    你是不是听过太多人告诉你:「人人都应该要会 coding!」都快要不耐烦了对吧? 究竟为什么身为一个行销专业者.作家.金融巨擘--,整个世界还要你学会 coding? 事实上仅仅要对 HTML.CSS ...

  8. TCPDUMP详解(续)

    TCPdump抓包命令  tcpdump是一个用于截取网络分组,并输出分组内容的工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具.  tcp ...

  9. cocos2D(九)---- CCAction

    之前介绍CCNode的时候说过,动作是指在特定时间内完毕移动.缩放.旋转等操作的行为,节点能够通过执行动作来实现动画效果,这里的动作就是指CCAction对象,它有非常多的子类,每一个子类都封装了不同 ...

  10. tomcat学习(-)windows 7 x64 配置tomcat服务

    下载Tomcat 下载地址:http://tomcat.apache.org/ 安装版本:Tomcat 9.0 安装环境:windows 7 x64 阅读Tomcat文档 文档路径:http://lo ...