内核模块编程HelloKernelLinux认证考试

文章作者 100test 发表时间 2009:07:16 20:20:31
来源 100Test.Com百考试题网


  在看“<.<.Linux程序设计 第3版>.>. 第18章 设备驱动程序”时,发现第621页的内核模块实验无法通过。
  怎么回事?
  后来才发现,这本Linux程序设计入门经典所用的内核是2.4版本。
  而2.6版本内核模块编程部分发生了比较大的变化。
  具体变化可以查看/usr/src/linux/Documentation/kbuild下的几篇文章。
  里面详细说明了2.6内核kbuild和makefile的格式。
  下面就介绍这个内核模块实验hello kernel如何正确运行,希望国内早点翻译<.<.Linux程序设计 第4版>.>.
  我所使用的系统为Debian5,内核版本为2.6.26-2-686。
  首先安装kernel headers,以提供相关文件编译内核模块
  $ sudo apt-get install linux-headers-`uname -r`
  hello.c内容如下
  $ cat hello.c
  #include <.linux/init.h>.
  #include <.linux/module.h>.
  MODULE_LICENSE("Dual BSD/GPL").
  static int hello_init(void)
  {
  printk("Hello, kernel!\n").
  return 0.
  }
  static void hello_exit(void)
  {
  printk("Good-bye, kernel!\n").
  }
  module_init(hello_init).
  module_exit(hello_exit).
  $
  2.6内核核核採用module_init()和module_exit()代替static __init int init_module(void)和static __exit void cleanup_module(void)函数。
  Makefile内容如下
  $ cat Makefile
  obj-m = hello.o
  KDIR:=/lib/modules/$(shell uname -r)/build
  PWD=$(shell pwd)
  all:
  make -C $(KDIR) M=$(PWD) modules >. make.log 2>.&.1
  clean:
  make -C $(KDIR) M=$(PWD) clean
  $
  其中obj-m为内核模块,obj-k则为编译到内核。
  写好hello.c和Makefile,接着运行make命令,编译自己写的内核模块
  $ ls
  hello.c Makefile
  $ make
  make -C /lib/modules/2.6.26-2-686/build M=/home/c-aries/下载/module modules >. make.log 2>.&.1
  $ ls
  hello.c hello.mod.c hello.o make.log Module.symvers
  hello.ko hello.mod.o Makefile modules.order
  插入hello模块
  $ sudo insmod hello.ko
  用dmesg命令查看内核缓冲区,并用tail查看最后一条信息
  $ dmesg | tail -1
  [24477.822683] Hello, kernel!
  列出模块清单,查找hello模块
  $ lsmod | grep hello
  hello 1216 0
  移除hello模块
  $ sudo rmmod hello
  用dmesg命令查看内核缓冲区,并用tail查看最后一条信息
  $ dmesg | tail -1
  [24530.986833] Good-bye, kernel!
  $
  成功了!
  Hello Kernel |o|

相关文章


内核模块编程HelloKernelLinux认证考试
红帽和Canonical抢夺云时代先机Linux认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛