第 1 天,hello world

本文描述了如何编写并且加载一个 Linux 内核模块,以及实验过程中遇到的问题和解决方法。本实验在模块加载时在系统日志文件中输出信息“Hello world!",在模块被删除时在系统文件中输出信息”Goodbye World!"。包括以下内容:

  • 实验环境
  • 源代码
  • 演示步骤
  • 问题及解决方法

 

  1. 实验环境Win8 系统, VirutalBox 5.0.14 r105127, Ubuntu 15.10 desktop

  2. 源代码
    2.1 hello.c
     1 // ---- HelloMod.c ---- //
     2 #include <linux/module.h>
     3 #include <linux/kernel.h>
     4 #include <linux/init.h>
     5 
     6 MODULE_LICENSE( "GPL" ); //get rid of taint message
     7 MODULE_AUTHOR( "kunzhang" );
     8 MODULE_DESCRIPTION( "Hello World module" );
     9 
    10 static int __init lkp_init( void )
    11 {
    12     printk( KERN_NOTICE"Hello, World! from the kernel message space ...\n" );
    13     return 0;
    14 }
    15 
    16 static void __exit lkp_cleanup( void ) 
    17 {
    18     printk( KERN_NOTICE"<1>Goodbye, World! Leaving kernel space ...\n" );
    19 }
    20 
    21 module_init( lkp_init );
    22 module_exit( lkp_cleanup );

    2.2 Makefile
          注意: obj-m 的值应该和不含后缀的c 文件名一致。
     1 ifneq ($(KERNELRELEASE),)
     2 obj-m := hello.o
     3 else
     4 KDIR := /lib/modules/4.2.0-16-generic/build
     5 
     6 all:
     7         make -C $(KDIR) M=$(PWD) modules
     8 clean:
     9         rm -f *.ko *.o *.mod.o *mod.c *.symvers *.order
    10 endif
  3. 演示步骤
    3.0 准备工作
          在任意一个目录内建立两个文件hello.c 以及 Makefile, 文件内容如上所示。
    3.1 编译文文件
          打开终端,并切换到hello.c 以及 Makefile 所在的路径下
      %> make
          编译成功以后在当前目录下会生成 5 个新的文件: hello.ko,  hello.mod.c,  hello.mod.o,modules.order  Module.symvers。其中hello.ko是我们所需要的二进制模块文件。
    3.2 装载及卸载
          %> sudo insmod hello.ko
          %> sudo rmomd hello.ko
    3.3 查看实验结果
          文中我们使用的信息输出函数 "printk" 不能在屏幕上输出,而是将信息写在了系统的日志文件/var/log/syslog 里。
    Feb  8 17:37:20 SeventhCorner kernel: [ 3850.565815] Hello, World! from the kernel message space ...
    Feb  8 17:37:25 SeventhCorner kernel: [ 3856.246795] Goodbye, World! Leaving kernel space ...
  4. 遇到的问题以及解决方法
    本实验并无稀奇古怪的问题,笔者在执行过程中遇到的错误都可归结为“不够细心”。以下两点应该注意:
    a. 注意Linux机器上已有的内核版本
    6. 注意Makefile 不要有拼写错误

  5. 参考资料a. 《The Linux® Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》,Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski
    b.   linux设备驱动--HelloWorld

你可能感兴趣的:(第 1 天,hello world)