先查看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 0;
}
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");
View Code

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
View Code

 

先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.0-23-generic/build M=/home/lin/hello modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.2.0-23-generic'
  CC [M]  /home/lin/hello/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lin/hello/hello.mod.o
  LD [M]  /home/lin/hello/hello.ko
make[1]:正在离开目录 `/usr/src/linux-headers-3.2.0-23-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                  12425  0 
...

 

我们之前代码中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 24 17:19:05 lin-virtual-machine kernel: [  844.246862] Hello World enter

 

posted on 2018-07-20 15:47  陌鉎こ城sHi  阅读(347)  评论(0编辑  收藏  举报