歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux模塊編程

Linux模塊編程

日期:2017/2/28 16:05:31   编辑:Linux教程

在達到能直接修改linux內核的程度之前,我們寫的代碼都需要以模塊的方式添加到內核中去運行。本節就介紹最簡單的模塊編寫和加載方法。

1、首先創建一個目錄modules,以存放以後編寫的模塊。再在其下創建一個子目錄hello,最為本節創建模塊的位置。

2、編寫源文件hello.c,代碼如下。

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");
  4. static int hello_init(void)
  5. {
  6. printk(KERN_INFO "Hello, world!\n");
  7. return 0;
  8. }
  9. static void hello_exit()
  10. {
  11. printk(KERN_INFO "Hello, exit!\n");
  12. }
  13. module_init(hello_init);
  14. module_exit(hello_exit);

3、編寫Makefile文件,如下。

  1. KERNEL_DIR := /lib/modules/$(shell uname -r)/build
  2. PWD := $(shell pwd)
  3. module-objs := hello.o
  4. obj-m := module.o
  5. default:
  6. $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

這裡先把hello.c編譯為hello.o,再把hello.o合並到module.o,最後生成可加載模塊module.ko。其實也可以不通過module.o,直接用hello.o生成可加載模塊。只是linux習慣的做法是先把所有的目標文件合並到一個目標文件,再進行其它操作。

4、編譯並加載模塊。

  1. $make

編譯生成module.ko

  1. $sudo insmod module.ko

將module.ko加入內核模塊

  1. $lsmod

查看已加載的模塊列表,包括module模塊

  1. $sudo rmmod module

卸載module模塊

  1. $dmesg | less
打印最近的5條記錄,會看到在hello_init和hello_exit中打印的信息。

現在我們已經完全了解了模塊編譯加載的流程,相當於打開了進入內核的大門。以後會接觸到越來越多的內核API,我們能做的事也會越來越多。

Copyright © Linux教程網 All Rights Reserved