Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317669
  • 博文数量: 239
  • 博客积分: 481
  • 博客等级: 下士
  • 技术积分: 1170
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-15 17:28
文章分类

全部博文(239)

文章存档

2014年(13)

2013年(6)

2012年(122)

2011年(98)

分类:

2012-03-21 12:57:28

原文地址:linux内存的分配和使用 作者:yff1030

 

今天做了第一个内核编程的实验, 有关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) 指明跳转到内核源码目录下读取那里的MakefileM=$(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

阅读(346) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~