一.Helloworld内核模块的开发
1.hellomod.c程序源代码
#include<linux/module.h>
#include<linux/init.h>
static int moduletest_init(void)
{
printk(“Helloworld!\n”);
return 0;
}
static void moduletest_exit(void)
{
printk(“GoodbyeWorld!\n”);
}
module_init(moduletest_init);
module_exit(moduletest_exit);
MODULE_LICENSE(‘GPL”);
2.Makefile文件
obj-m :m=HelloWorld.o
all:
make - C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
//注意make前面是用tab键隔开的;C是大写
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
3.程序执行流程:
A).用vim hellomod.c创建文件hellomod.c;用vim Makefilr创建Makefile文件
B).mkdir c_project创建一个空文件夹
C).mv /home/ranlike/hellomod.c /home/ranlike/c_project
mv /home/ranlike/Makefile /home/ranlike/c_project
将hellomod.c和Makefile文件放在c_project文件中
D).make 生成hellomod.mod.c hellomod.ko hellomod.mod.o modules.order
Hellomod.ko.unsigned hellomod.o Module.symvers文件
E)在当前目录下输入命令:insmod ./hellomod.ko
F)输入命令:lsmod。能找到hellomod的模块,说明模块已经加载;输入命令时没有没有反应代表已经模块加载了。
G)输入命令dmesg,查看最后一行,会有模块加载时调用的函数输出。
H)输入命令:rmmod hellomod,卸载模块,然后输入lsmod,已经找不到hellomod模块说明模块已经卸载
I)输入命令:dmesg,查看模块卸载是调用的函数输出。
一.遇到的问题
1.如何在linux下编译
答案:linux敲入命令:vi hellomod.c 直接进入vi程序编辑界面 按i进入vi编辑界面;按esc键退出,按:wq 保存 按enter确定
2在linux敲入命令:vi hellomod.c 出现了 :backspace=indent,eol,start
答案:backspace有几种工作方式,默认是vi兼容的。为方便使用可以用:set backspace=indent,eol,start来解决。indent: 如果用了:set indent,:set ai 等自动缩进,想用退格键将字段缩进的删掉,必须设置这个选项。否则不响应。eol:如果插入模式下在行开头,想通过退格键合并两行,需要设置eol。start:要想删除此次插入前的输入,需设置这个。
3出现Press ENTER or type command to continue的原因。
答案:.vimrc是打开vim编辑器编程前会先调用.vimrc里面的指令,所以可以事先在里面设置一番。
用vim开文件后,出现了Press ENTER or type command to continue是.vimrc里面设置的指令出现了错误,只要把错误的指令清除就好了!不过要注意.vimrc是要在根目录下。
以root身份登录后执行如下指令:
cd
vim .vimrc
(进入后)
set nu
...(设置,如果指令错误,会出现标题的情况)
(设置完后保存退出)
Ese
:wq
4在当前目录下输入命令:insmod ./hellomod.ko的作用是什么?
答案:insmod 功能说明:载入模块。使用说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序
语法: insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
参数:
-f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k 将模块设置为自动卸除。
-m 输出模块的载入信息。
-o <模块名称> 指定模块的名称,可使用模块文件的文件名。
-p 测试模块是否能正确地载入kernel。
-s 将所有信息记录在系统记录文件中。
-v 执行时显示详细的信息。
-x 不要汇出模块的外部符号。
-X 汇出模块所有的外部符号,此为预设置。