您的位置:首页 > 其它

ldd3 读书笔记 —— Hello, world!

2010-11-13 00:57 344 查看
某程序员对书法十分感兴趣,退休后决定在这方面有所建树。于是花重金购买了上等的文房四宝,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地写下一行字:
Hello, world!

ldd3的源代码可以从这里下载:http://oreilly.com/catalog/9780596005900/ 然后找“Download Example Code”
hello.c在misc-modules这个目录里面。不过我看书的习惯是把所有的代码都手工输入一次。

Makefile如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
make的时候,Makefile会被执行两次:
第一次进入else,设置KERNELDIR和PWD,然后执行$(MAKE) -C的那一行,这次的make会先到内核源代码的根目录执行,然后再回来,这次就会执行到obj-m := hello.o了。

hello.c的代码:
#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);

这个代码实在太简单了,没什么好说的。make之后,用modinfo可以查看hello.ko的信息。注意其中的vermagic,他记录了编译的内核的版本,如果运行的版本与此不一致,insmod的时候会失败。
用su切换到root,insmod/rmmod,用dmesg和lsmod可以看到效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: