天天看點

核心子產品之hello world

  Linnx提供了非常豐富的網絡,IO等核心API,可以很友善開發驅動子產品。典型的應用程式有一個main函數,核心子產品隻需要一個初始化,退出函數。下面看下第一個hello world核心子產品。

一. 準備環境

#uname -a
2.6.32-431.el6.x86_64
#yum -y install   kernel-devel.x86_64     #開發核心必須安裝對應的核心源碼       

二. 編碼

// hello.c
#include <linux/module.h>
#include <linux/init.h>

static int __init helloworld_init(void)
{
	printk(KERN_ALERT "Hello world module init\n");
	return 0;
}


static void __exit helloworld_exit(void)
{
	printk(KERN_ALERT "Hello world module exit\n");
}

module_init(helloworld_init);	// 子產品初始化
module_exit(helloworld_exit);	 // 子產品退出

MODULE_LICENSE("GPL");	        // 版權
MODULE_AUTHOR("kettas"); 	// 作者
MODULE_DESCRIPTION("Hello world Demo");	// 描述
MODULE_VERSION("1.0.1");	// 版本
MODULE_ALIAS("hello 01");	// 别名      

   注:核心子產品為純C代碼,對代碼格式要求嚴格,1.變量聲明必須放在函數第一行,否則報ISO C90 不允許混合使用聲明和代碼警告。2. 無參函數聲明參數要加上void,否則報函數聲明不是一個原型的警告

三. 編譯

#hello.ko

obj-m += hello.o     #指定編譯子產品名稱,會自動尋找hello.c
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)

LINUX_KERNEL_PATH:=/usr/src/kernels/2.6.32-431.el6.x86_64/         #核心源碼目錄

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules     #C進入核心目錄讀取Makefile,M表明後回到目前目錄讀取Makefile

clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean      

四. 運作

#modinfo helloworld.ko                         #檢視核心子產品資訊
filename:       hello.ko
alias:          Example 01
version:        1.0.1
description:    Hello world Demo
author:         kettas
license:        Dual BSD/GPL
srcversion:     478008C1F7974ACC15407DB
depends:        
vermagic:       2.6.32-431.el6.x86_64 SMP mod_unload modversions
#sudo inmsmod helloworld.ko                    #安裝helloworld核心子產品,此時控制台沒有列印hello world
#dmesg                                         #printk日志資訊會寫入核心環形緩沖區内,運作dmesg可檢視
hello world module init
hello world module exit