先查看Ubuntu的版本

cat /etc/issue

lin@lin-virtual-machine:~$ cat /etc/issue
Ubuntu
12.04 LTS \n \l

或者使用

lin@lin-virtual-machine:~$ sudo lsb_release -a
[sudo] password for lin:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise

在看一下内核版本

lin@lin-virtual-machine:~$ uname -r
3.2.0-23-generic

现在开始我们第一个代码

hello.c

/*
* a simple kernel module: hello
*
* Copyright (C) 2014 Barry Song (baohua@kernel.org)
*
* Licensed under GPLv2 or later.
*/ #include <linux/init.h>
#include <linux/module.h> static int __init hello_init(void)
{
printk(KERN_INFO "Hello World enter\n");
return ;
}
module_init(hello_init); static void __exit hello_exit(void)
{
printk(KERN_INFO "Hello World exit\n ");
}
module_exit(hello_exit); MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");

makfile

KVERS = $(shell uname -r)

# Kernel modules
obj-m += hello.o # Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

先cd到文件所在路径,后make

lin@lin-virtual-machine:~$ cd hello
lin@lin-virtual-machine:~/hello$ ls
hello.c Makefile
lin@lin-virtual-machine:~/hello$ make
make -C /lib/modules/3.2.--generic/build M=/home/lin/hello modules
make[]: 正在进入目录 `/usr/src/linux-headers-3.2.--generic'
CC [M] /home/lin/hello/hello.o
Building modules, stage .
MODPOST modules
CC /home/lin/hello/hello.mod.o
LD [M] /home/lin/hello/hello.ko
make[]:正在离开目录 `/usr/src/linux-headers-3.2.--generic'
lin@lin-virtual-machine:~/hello$ ls
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
lin@lin-virtual-machine:~/hello$

加载模块使用 sudo insmod ./hello.ko

查询当前加载模块lsmod

in@lin-virtual-machine:~/hello$ sudo insmod ./hello.ko
[sudo] password for lin:
lin@lin-virtual-machine:~/hello$ lsmod
Module Size Used by
hello
...

我们之前代码中printk的内容怎么查看呢

使用dmesg指令后

....
[ 1751.580930] Hello World enter
[ 2107.145420] Hello World exit
[ 2107.145422]
....

小结:

下面我们来看几个驱动中常用的命令

1、加载驱动模块insmod

将生成驱动模块.ko文件加载,

insmod xxx.ko

加载后就会执行xxxx_init函数

2、卸载驱动模块rmmod

     对应的卸载驱动的命令

rmmod xxxx 注意不用带.ko

3、查看内核中的模块信息

     lsmod

4、查看模块的描述信息

     modinfo xxxx.ko

     我们可以在驱动程序添加一些辅助信息,例如作者 ,驱动描述等。

5、查看模块打印信息

     dmesg   

     printk是内核打印函数,默认模式下在中断下无法显示(当然,可以设置成打印到终端),用dmesg可以查看一下打印到内核的信息。

   cat /var/log/syslog | grep Hello

lin@lin-virtual-machine:~/hello$ cat /var/log/syslog | grep Hello
Jul :: lin-virtual-machine kernel: [ 844.246862] Hello World enter

linux驱动开发第一步hello的更多相关文章

  1. Ubuntu 16.04下Linux驱动编写第一步

    源码环境的搭建 Install源码 >sudo apt-cache search linux-source linux-source - Linux kernel source with Ubu ...

  2. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  3. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  4. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  5. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  6. Linux驱动开发 -- 打开dev_dbg()

    Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...

  7. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  8. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  9. Linux驱动开发:USB驱动之usb_skel分析

    在学习了这么些天的驱动之后,个人觉得驱动就是个架构的问题,只要把架构弄清楚了 然后往里面添砖加瓦就可以了,所以似乎看起来不是太困难,但也许是是我经验不足吧,这只能算是个人浅见了 这两天在学习USB驱动 ...

随机推荐

  1. java 1.8新特性(二) 关于 function 接口的使用

    需求1:从user集合中 找出age=15的用户  传统方法 就不说了 举例明一下 java1.8 使用Predicate接口解决该需求: @FunctionalInterface public in ...

  2. mysql 锁2

    官网地址 https://dev.mysql.com/doc/refman/5.5/en/innodb-transaction-isolation-levels.html 这里主要是说事务隔离级别,以 ...

  3. CDN上的缓存刷新、缓存预热是怎样的使用场景?

    缓存刷新 源站内容更新后,希望用户可以获取到最新资源,CDN租户可以通过提交刷新请求将CDN节点上指定的缓存内容强制过期.当用户再次访问时,CDN节点将回源获取已更新内容返回给用户并在节点缓存最新资源 ...

  4. python:数据类型

    一.数据类型 1.数字int型 主要进行计算 bit_length() 当十进制用二进制表示时,最少使用的位数 a = 13 b = a.bit_length() print (b) 2.布尔值boo ...

  5. Spring+MyBatis实现数据库读写分离方案

    推荐第四种:https://github.com/shawntime/shawn-rwdb 方案1 通过MyBatis配置文件创建读写分离两个DataSource,每个SqlSessionFactor ...

  6. 常用docker镜像

    oracle12c: mkdir -p /path/to/oradata docker run --name oracle12c \ -p 1521:1521 -p 5500:5500 \ -v /p ...

  7. windows server 2012 r2 安装IIS失败

    给新的2012服务器安装IIS时报错: 错误原因:就在于选中了.net framework 3.5 . 如果要安装.net framework 3.5 使用以下步骤: 1 加载安装光盘,如果没有可以网 ...

  8. Delphi XE5中的新增内容

    Delphi XE5中的新增内容 Delphi XE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的.多设备应用开发解决方案的最新版本.使用Delphi XE5的新特 ...

  9. Apache CLI Demo

    1. Options private Options options = new Options(); 2. option (1) way1 launcher.options.addOption(&q ...

  10. Django跨域问题

    相关博客地址 同源策略与Jsonp 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可 ...