admin管理员组

文章数量:1122861

ldd3 读书笔记 —— Hello, world!

某程序员对书法十分感兴趣,退休后决定在这方面有所建树。于是花重金购买了上等的文房四宝,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地写下一行字:
Hello, world!
 
ldd3的源代码可以从这里下载:/  然后找“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可以看到效果。

本文标签: ldd3 读书笔记HelloWorld