//All right revsered by yoki2009
//mailto:imj040144@tom.com
微出版 www.epube.biz 相信梦想无界
//不解释,看程序:)
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/jiffies.h>
#include <linux/vmalloc.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/blkdev.h> //radix_tree_insert等函数
static struct list_head todo_list;
static struct radix_tree_root tree_data;
static int __init tree_list_init(void)
{
//List
/*
Linux自己提供了list链表来对数据进行管理
struct list_head
{
struct list_head *next,*prev;
};
*/
struct list_head list_data;
//初始化链表头
INIT_LIST_HEAD(&todo_list);
//
struct list_store
{
int pdata; //实际数据存储,当然你可以自己定义任何数据结构
struct list_head node;//维护链表
};
struct list_store *pstore[5];
int i=0;
for (i=0;i<5 ;i++ )
{
if (!(pstore[i] = (struct pstore *)vmalloc(sizeof(struct list_store))))
{
break;
}
//为实际数据赋值
pstore[i]->pdata = i;
//将自定义的结构体链入链表
list_add_tail(&pstore[i]->node,&todo_list);
printk("[Enter circle]List data %d/n",pstore[i]->pdata);
}
struct list_head *p;
int count = 0;
list_for_each(p,&todo_list)
{
printk("List count :%d data == %d/n",count++,pstore[count]->pdata);
}
for (i = 0 ;i < 5 ;i++ )
{
vfree(pstore[i]);
}
//Radix tree
//初始化基树,GFP = Get Free Page
INIT_RADIX_TREE(&tree_data,GFP_KERNEL);
void *pt;
int ret;
for (i = 0;i < 5 ;i++ )
{
pt = (void *)__get_free_page(GFP_KERNEL);
if (!pt)
{
return -1;
}
memcpy(pt,"RADIX TREE",sizeof("RADIX TREE"));
//插入基树,i值为索引值
ret = radix_tree_insert(&tree_data,i,pt);
}
for (i = 0;i < 5 ;i++ )
{
//根据索引值得到指定节点
pt = radix_tree_lookup(&tree_data,i);
printk("[Radix tree] data == %s/n",(char *)pt);
radix_tree_delete(&tree_data,i);
free_page(pt);
}
}
static void __exit tree_list_exit(void)
{
}
module_init(tree_list_init);
module_exit(tree_list_exit);
MODULE_LICENSE("GPL");