1:程序代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/init.h>
static int hello_init(void)//被装载时调用
{
printk(KERN_ALERT "Hello, world/n");
//KERN_ALERT定义了消息的优先级,只是个字符串,如<1>,防止在某些情况下内核不输出该消息
{
printk(KERN_ALERT "Hello, world/n");
//KERN_ALERT定义了消息的优先级,只是个字符串,如<1>,防止在某些情况下内核不输出该消息
return 0;
}
}
static void hello_exit(void)//被移除时调用
{
printk(KERN_ALERT "Goodbye, crule world/n");
}
{
printk(KERN_ALERT "Goodbye, crule world/n");
}
module_init(hello_init);
module_exit(hello_exit);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");//用来告诉模块采用自由许可,否则内核在装载时会产生抱怨
MODULE_AUTHOR("Jinglei Zhang");//作者
2、Makefile:
MODULE_AUTHOR("Jinglei Zhang");//作者
2、Makefile:
#如果已定义KERNELRELEASE,则说明是从内核构造系统调用的,
#因此可利用其内建语句
#因此可利用其内建语句
ifneq ($(KERNELRELEASE),)
obj-m := helloworld.o
#否则,是直接从命令行调用的,这时要调用内核构造系统。
else
CC = bfin-uclinux-gcc
KERNELDIR ?= /home/franky/uClinux-dist-R06R2-RC2-BF537/linux-2.6.x
PWD := $(shell pwd)
KERNELDIR ?= /home/franky/uClinux-dist-R06R2-RC2-BF537/linux-2.6.x
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *~
3、下载到板子上,插入、移除该模块:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *~
3、下载到板子上,插入、移除该模块:
root:~> insmod helloworld.ko
Hello, world
root:~> lsmod
Module Size Used by Tainted: P
helloworld 1096 0 - Live 0x03950800
wcfxs 25492 0 - Live 0x00408000
zaptel 179708 1 wcfxs, Live 0x03a40000
root:~> rmmod helloworld
root:~> lsmod
Module Size Used by Tainted: P
wcfxs 25492 0 - Live 0x00408000
zaptel 179708 1 wcfxs, Live 0x03a40000
Hello, world
root:~> lsmod
Module Size Used by Tainted: P
helloworld 1096 0 - Live 0x03950800
wcfxs 25492 0 - Live 0x00408000
zaptel 179708 1 wcfxs, Live 0x03a40000
root:~> rmmod helloworld
root:~> lsmod
Module Size Used by Tainted: P
wcfxs 25492 0 - Live 0x00408000
zaptel 179708 1 wcfxs, Live 0x03a40000
显示该模块确实成功被插入和移除。