您的位置:首页 > 编程语言

调用内核hlist编写的测试代码

2013-04-18 15:09 211 查看
最近在做linux内核编程,最深的一点感触是:算法的巧妙,犹如看一场高明杂技
真正的程序员那是键盘上灵动的舞者。
写面写的是一个调用内核的hlist测试代码。
/***how to program use  the hlist in kernel**/#include<linux/module.h>#include<linux/init.h> /* kind of macros */#include<linux/kernel.h>#include<linux/types.h>#include<linux/list.h>#include<linux/slab.h>unsigned int len_hash = 100;struct hlist_head* hash[100];void get_random_bytes(void *buf,int nbytes);/* define the data strc */typedef struct _data_node{unsigned int  data;struct hlist_node node;} data_node_strc;/* init the hash-chain */void init_hash(void){unsigned int i=0;for(i=0;i<len_hash;i++){hash[i] = (struct hlist_head*)kmalloc(sizeof(struct hlist_head),0);memset(hash[i],0,sizeof(struct hlist_head));}}/* get a random numer */unsigned int rand(unsigned int lower,unsigned int up){unsigned int rand = 0;get_random_bytes(&rand,sizeof(unsigned int ));return (rand%(up-lower)+lower);}/* alloc the memory */data_node_strc* kalloc_node(void){data_node_strc* tmp = (data_node_strc*)kmalloc(sizeof(data_node_strc),0);memset(tmp,0,sizeof(data_node_strc));return tmp;}/* full the hash-chain randomly */void full_hash(void){int i = 0;for(i=0;i<100;i++){unsigned int key = rand(0,100);data_node_strc* p_node = kalloc_node();p_node->data = key;hlist_add_head(&(p_node->node),hash[key]);}}void print_hash(void){unsigned int i = 0;for(i=0;i<len_hash;i++){if(!hlist_empty(hash[i])){data_node_strc * tmp = NULL;struct hlist_node *tmp_node = NULL;int j=0;hlist_for_each_entry(tmp,tmp_node,hash[i],node){printk("(key=%d,node=%d)->data=%d\n",i,j,tmp->data);j++;}}}}void free_hash(void){int i = 0;for(i=0;i<len_hash;i++){if(!hlist_empty(hash[i])){data_node_strc * tmp = NULL;struct hlist_node * tmp_node = NULL ;hlist_for_each_entry(tmp,tmp_node,hash[i],node){tmp->node.next = NULL;tmp->node.pprev = NULL;kfree(tmp);}hash[i]->first = NULL;}kfree(hash[i]);hash[i] = NULL;}}/* init the module */static int __init hlist_init(void){init_hash();full_hash();print_hash();return 0;}/* exit the module */static void __exit hlist_exit(void){free_hash();}/* call the macro module_init() to init the module*/module_init(hlist_init);/* call the macro module_exit() to init the module*/module_exit(hlist_exit);/* obey the GPL poc */MODULE_LICENSE("GPL");MODULE_AUTHOR("dead_angel");MODULE_DESCRIPTION("timer_test");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hilsit 内核
相关文章推荐