一個簡單的 Linux Kernel Module
来源:互联网 发布:java 源码 attach 编辑:程序博客网 时间:2024/06/05 16:02
本文转载至:http://wwssllabcd.github.io/blog/2012/11/13/how-to-make-linux-module/
以下會建立一個非常簡單的 linuxk kernel,只會包含兩個 funciton -- 即 init 與 exit分別在 module 載入及退出的時候會呼叫到
建立 hello.c
這邊不免俗的使用 hello module,先建立 hello_init 與 hello_exit,並且印出訊息
當使用 insmod hello.ko 時,會自動的呼叫到 hello_init 這個 function,而使用 rmmod 時,也會呼叫到 hello_exit,也就是說,如果順利載入的話,會在 dmesg 裡面看到這些訊息。
hello .c123456789101112131415161718
#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_INFO "Hello kernel\n");return 0;}static void hello_exit(void){printk(KERN_INFO "Goodbye\n");}module_init(hello_init);module_exit(hello_exit);
建立 MakeFile
此段列出 hello.c 的 Makefile,只介紹用到的指令,在最後也會補充一些 Makefile 的其他指令
Makefile123456789101112131415
## Makefile for kernel test#PWD := $(shell pwd)KVERSION := $(shell uname -r)KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/MODULE_NAME = helloobj-m := $(MODULE_NAME).oall:make -C $(KERNEL_DIR) M=$(PWD) modulesclean:make -C $(KERNEL_DIR) M=$(PWD) clean
這邊解釋一下 Makefile 的內容
PWD := $(shell pwd)
:取得目前目錄KVERSION := $(shell uname -r)
:取得 kernel 版本號KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/
:因為編譯 kernel 需要 include kernel 目錄,所以這邊也要定義obj-m
:表示需要編繹成模組的目標檔案名集合,編譯的方式為編譯成區塊,這裡要注意的是,他同時也是代表被編譯的檔案名稱,如果要被編譯的是 Hello.c,那這邊就要填obj-m := hello.o
,此外還有 obj-y,代表編譯進去內核。
編譯指令如下 make -C $(KERNEL_DIR) M=$(PWD) modules
-C:
:跟 make 講 這次 kernel module include 的目錄在哪$(KERNEL_DIR)
:Makefile 中可以使用變數,一般變數大寫,在引用變數時,採用小括弧擴起變數名前加($)符號來用。M=$(PWD)
:描述那個目錄要被編譯 (早期的指令是SUBDIRS),M=$(PWD),個人猜測再作遞迴 make 的時候,會需要回到原始目錄。這是定義在 kernel 的 make file 中,要詳細內容可以去看 kernel 的 make file
編譯及載入 module
執行 make 來編譯 hello.ko 之後,使用 insmod 來載入我們的 module sudo insmod hello.ko
使用 dmesg 來察看 [35451.985643] Hello, kernel
代表我們成功的把 module 載入這邊列出幾項觀察 moudle 的指令 insmod: 載入mod lsmod: 列出mod , 如lsmod |grep hello rmmod: 移除mod
Make 語法簡介
:= 語法
指定變數的語法,make 會先把整個檔案展開,找出該變數最後一個被指定的值並且 assign 給他也就是說 x := foo y := $(x) x := foobar則 Y 的結果為 foobar
?= 語法
指定變數的語法,如果變數已經被指定過,則不會再被指定
QA
出現以下的 Error Make File Error : missing separator. Stop. Makefile:9: * missing separator. Stop.
檢查一下make file 是否混入了空白,一定要用Tab記得 gcc 前面要用TAB ,否則 make 會 fail
- 一個簡單的 Linux Kernel Module
- Linux kernel & module program
- Build linux kernel Module
- linux kernel module programming
- compiling-linux-kernel-module
- linux kernel、module编译
- Linux kernel module加载
- linux kernel module 实例
- One linux kernel module example
- Linux Debugging 8 - Kernel Module
- Kgdb调试linux kernel module
- linux kernel module - hello world
- Linux kernel module symbols relocation
- Linux Module 的HelloWorld程序(For Kernel-2.4)
- Linux Module 的HelloWorld程序(For Kernel-2.6)
- Linux Kernel module isnmod 时的检查以及MODVERSIONS
- 我曾经的linux kernel module编程入门过程
- Linux实验二【最简单kernel module的例子】
- 数据查找方式
- sqlmap简易教程–帮助文档个人使用经验解析
- C++程序调用已经被编译后的C函数
- uvm_config_db性能权衡
- C++builder资源文件
- 一個簡單的 Linux Kernel Module
- cocos2dx游戏资源加密之XXTEA
- 用eclipse构建maven web项目
- Git的入门教程<一>
- memcached源码分析-----slab automove和slab rebalance
- 单向链表的基本操作
- ZigBee快速入门
- maven插件的安装与配置
- OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别