2012年(2)
分类: LINUX
2012-03-19 20:05:27
今天做了第一个内核编程的实验, 有关linux内存的分配和使用 这也使我的第一次在CU发表博文,希望是一个美好的开始,baby,加油!
Some facts:
环境:rhel5
实验要求:编写一个内核模块,在模块中使用kmalloc分配内存并访问,使用按页方式分配内存并访问。
Code list:(国嵌的源码)
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Memory alloc Module");
MODULE_ALIAS("malloc module");
char *buf1 = NULL;
char *buf2 = NULL;
int alloc_init()
{
buf1 = kmalloc(100,GFP_KERNEL); //申请内存
memset(buf1,0,100); //初始化buf1所指向的内存空间
strcpy(buf1,"<<< --- Kmalloc Mem OK! --- >>>"); //给buf1赋值
printk("<0>BUF 1 : %s\n",buf1); //打印buf1所指向内存的内容
buf2 = get_zeroed_page(GFP_KERNEL);
strcpy(buf2,"<<<--- Get Free Page OK! --- >>>");
printk("<0>BUF 2 : %s\n",buf2);
return 0;
}
void alloc_exit()
{
kfree(buf1); //释放内存
free_page(buf2);
printk("<0><<< --- Module Exit! --->>>\n");
}
module_init(alloc_init);
module_exit(alloc_exit);
<<<<<<<<<<<<<<<<<<<-------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>
Makefile文件
ifneq ($(KERNELRELEASE),) #KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile 时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
obj-m := alloc_mem.o #表示编译连接后将生成alloc_mem.o模块
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build #内核源代码所在路径
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.ko *.o *.mod.o *.mod.c *.symvers
endif
#######执行路径:如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
<<<<<<<<<<<<<<<<<<<-------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>
在终端中输入:#make
然后加载模块: #insmod alloc_mem.ko
之后出现如下信息:
[root@yff mem-malloc]#
Message from syslogd@ at Mon Mar 19 17:13:03 2012 ...
localhost kernel: BUF 1 : <<< --- Kmalloc Mem OK! --- >>>
Message from syslogd@ at Mon Mar 19 17:13:03 2012 ...
localhost kernel: BUF 2 : <<<--- Get Free Page OK! --- >>>
查看安装的内核模块:
[root@yff mem-malloc]# lsmod
Module Size Used by
alloc_mem 6408 0
[root@yff mem-malloc]# rmmod alloc_mem [root@yff mem-malloc]# Message from syslogd@ at Mon Mar 19 20:12:12 2012 ... localhost kernel: <<< --- Module Exit! --->>>
啊哈!行了!
参考博文:http://blog.chinaunix.net/uid-20729838-id-1884123.html