首页 > 代码库 > 内核第一个程序之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!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。