首页 > 代码库 > 内核第一个程序之Hello World!

内核第一个程序之Hello World!

这个程序是《Linux device drivers》中的代码片段:

#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){      printk(KERN_ALERT "Hello,world\n");      return 0;}static void hello_exit(void){      printk(KERN_ALERT "Goodbye,Cruel world\n");}module_init(hello_init);module_exit(hello_exit);

下面是makefile, 建议去看一下makefile的基本语法,$(MAKE) -C $(KERNELDIR) SUBDIRS = $(PWD) modules这句就是说首先改变目录到-C选项指定的目录(即内核源代码目录),其中保存了内核的顶层makefile文件。SUBDIRS=选项让该makefile在构造modules目标返回之前到模块源代码目录。然后,modules目标指向obj-m变量设定的模块。

ifneq ($(KERNELRELEASE),)     obj-m := hello.oelse     KERNELDIR :=/lib/modules/$(shell uname -r)/build     PWD := $(shell pwd)all:     $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modulesendifclean:     rm -f *.o *.ko *.mod.c .hello*

好了,然后安逸的make一下:

make -C /lib/modules/3.13.0-35-generic/build SUBDIRS=/home/zachery/kernel_programming modulesmake[1]: Entering directory `/usr/src/linux-headers-3.13.0-35-generic‘  CC [M]  /home/zachery/kernel_programming/hello.o  Building modules, stage 2.  MODPOST 1 modules  CC      /home/zachery/kernel_programming/hello.mod.o  LD [M]  /home/zachery/kernel_programming/hello.komake[1]: Leaving directory `/usr/src/linux-headers-3.13.0-35-generic‘
 

接下来可以看效果了,

装载模块: insmod ./hello.ko

卸载模块: rmmod hello

terminal是看不到输出的,消息进入了其中一个系统日志文件中, 我当前的Ubuntu14.04是 /var/log/syslog (实际文件名子随 Linux 发布而变化). 可以使用 tail -f /var/log/syslog查看。

 

ps: printk中优先级只是一个字串, 前缀于 printk 格式串之前. 注意在 KERN_ALERT 后面是不需要逗号的!!

内核第一个程序之Hello World!