1.编写一个简单的驱动代码,在内核态运行的helloworld
#include <linux/init.h>
#include <linux/module.h>
int __init helloworld_init(void){
printk("hello world\n");
return 0;
}
void __exit helloworld_exit(void){
printk("bye bye\n");
}
moudle_init(helloworld_init);
moudle_exit(helloworld_exit);
编译helloworld.c
1)把helloworld.c变成zImage的一部分
复制到内核源码根目录中/deivers/char/(此目录为简单的字符驱动设备)
Kconfig
make menuconfig产生菜单的要素
Makefile
每个目录下的Makefile决定了当前目录下的文件(夹)是否要编译进内核
.config
vmlinux.lds
链接文件
方式一 :修改vi/dervier/char下的makefile文件
obj-y :必须编译进内核
obj-m:编译成模块
obj-y
+=helloworld.o(Makefile默认找helloworld.c编译)
方式二;修改Kconfig文件
vi /dirver/char/Kconfig
tristate 三态
config HELLO
tristate "helloworld demo"
depends on MACH_CW210||CPU_S5PV210
default y
----help---
MY first kernel demo!
obj-$(CONFIG_HELLO)
+=helloworld.o
命令:dmesg 打印内核上电后打印后的信息
dmesg | grep "hello" 查看内核文件zImage修改结果
2)编译成内核模块
方式一:1.vi /drivers/char/Makefile 2.Kconfig也一样
obj-m
+=helloworld.o
.config中CONFIG_HELLO=m
make modules
会生成.ko文件、/drivers/char/helloworld.ko
cp drivers/char/helloworld.ko rotfs
insmod helloworld.ko 安装模块
rmmod helloworld.ko 卸载模块
注意会提醒
helloworld:module license ‘unspecified’ taints kernel
代码中需要添加
MODULE_LICENSE("GPL")
模块许可声明
方式二:
在自己编写目录下
vi Makefile
obj-m
+=helloworld.o
make -C /opt/kernel M=$(pwd) modules
-C /opt/kernel 指明内核代码根目录
M=$(PWD)
指定了要做的动作Makefile
目录下生成一个.ko文件
方式三:
基于第二种
修改Makefile
KERNELDIR ?= /opt/kernel
obj-m += helloworld.o
default:
/*1*/ $(MAKE) -C $(KERNELDIR) M=$(PWD) module
clean:
/*2*/@rm -f *.o *.ko *.order *.sy* *.mod*
/*1*/:注意一定是table键
/*2*/这里@不加存在打印信息,加了就没有打印信息