Chinaunix首页 | 论坛 | 博客
  • 博客访问: 957438
  • 博文数量: 376
  • 博客积分: 154
  • 博客等级: 入伍新兵
  • 技术积分: 1558
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-13 08:42
文章分类

全部博文(376)

文章存档

2014年(11)

2013年(88)

2012年(260)

2011年(17)

分类:

2012-10-10 18:05:51

原文地址:链表内核模块运行与分析 作者:ztguang

2010嵌入式作业---6---冯伟浩-----吴晓培

[root@bogon I21c]# gedit lb.c

#include
#include
#include
#include

MODULE_LICENSE("GPL");
MODULE_AUTHOR("XIYOU");

#define N 10   //链表节点
struct numlist {
    int num;//数据
    struct list_head list;//指向双联表前后节点的指针
};

struct numlist numhead;//头节点

static int __init doublelist_init(void)
{
    //初始化头节点
    struct numlist *listnode;//每次申请链表节点时所用的指针
    struct list_head *pos; //定义list_head的有效指针
    struct numlist *p;
    int i;

    printk("<0>""doublelist is starting...\n");//利用"<0>"提升printk级别
    INIT_LIST_HEAD(&numhead.list);
    printk("初始化头节点");
    //建立N个节点,依次加入到链表当中
    for (i = 0; i < N; i++) {
        listnode = (struct numlist *)kmalloc(sizeof(struct numlist), GFP_KERNEL); // kmalloc()在内核空间申请内存,用于存放结点。
        listnode->num = i+1;//给链表numlist的数据域赋值。
        list_add_tail(&listnode->list, &numhead.list);//将结点加入到链表尾部
        printk("<0>""Node %d has added to the doublelist...\n", i+1);
    }
    printk("<0>""建立N个节点,依次加入到链表当中");
    printk("<0>""遍历链表");
    //遍历链表
    i = 1;
    list_for_each(pos, &numhead.list) {
        p = list_entry(pos, struct numlist, list);
        printk("<0>""Node %d's data:%d\n", i, p->num);
        i++;
    }
    return 0;
}

static void __exit doublelist_exit(void)
{
    struct list_head *pos, *n;
    struct numlist *p;
    int i;
    printk("<0>""依次删除N个节点\n");
    //依次删除N个节点
    i = 1;
    list_for_each_safe(pos, n, &numhead.list) {  //为了安全删除节点而进行的遍历
        list_del(pos);//从双链表中删除当前节点
        p = list_entry(pos, struct numlist, list);//得到当前数据节点的首地址,即指针
        kfree(p);//释放该数据节点所占空间
        printk("<0>""Node %d has removed from the doublelist...\n", i++);
    }
    printk("<0>""doublelist is exiting..\n");
}

module_init(doublelist_init);
module_exit(doublelist_exit);


[root@bogon I21c]# gedit Makefile
obj-m:=lb.o
PWD:=$(shell pwd)
CUR_PATH:=$(shell uname -r)
KERNEL_PATH:=/usr/src/kernels/$(CUR_PATH)

all:
    make -C $(KERNEL_PATH) M=$(PWD) modules
clean:
    make -C $(KERNEL_PATH) M=$(PWD) clean



[root@bogon I21c]# gedit Makefile
obj-m:=lb.o                //目标文件
PWD:=$(shell pwd)      //当前shell的路径赋值给PWD
CUR_PATH:=$(shell uname -r)    //shell执行 uname -r命令为2.6.32-71.el6.i686
KERNEL_PATH:=/usr/src/kernels/$(CUR_PATH)    //KERNEL_PATH:的完整路径为/usr/src/kernels/2.6.32-71.el6.i686
//此时Malefile调用2.6.32-71.el6.i686下的Makefile规则对目标文件进行编译。
all:
    make -C $(KERNEL_PATH) M=$(PWD) modules
    //make -C /usr/src/kernels/2.6.32-71.el6.i686 M=/root/桌面/I21c modules
clean:
    make -C $(KERNEL_PATH) M=$(PWD) clean





[root@localhost I21c]# make
make -C /usr/src/kernels/2.6.32-71.el6.i686 M=/root/桌面/I21c modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-71.el6.i686'
  CC [M]  /root/桌面/I21c/lb.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/桌面/I21c/lb.mod.o
  LD [M]  /root/桌面/I21c/lb.ko.unsigned
  NO SIGN [M] /root/桌面/I21c/lb.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-71.el6.i686'
[root@localhost I21c]# insmod lb.ko
[root@localhost I21c]#
Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:doublelist is starting...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 1 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 2 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 3 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 4 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 5 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 6 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 7 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 8 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 9 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 10 has added to the doublelist...

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:建立N个节点,依次加入到链表当中

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:遍历链表

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 1's data:1

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 2's data:2

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 3's data:3

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 4's data:4

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 5's data:5

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 6's data:6

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 7's data:7

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 8's data:8

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 9's data:9

Message from syslogd@localhost at Oct  8 16:59:13 ...
 kernel:Node 10's data:10

[root@localhost I21c]# rmmod lb.ko
[root@localhost I21c]#
Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:依次删除N个节点

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 1 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 2 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 3 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 4 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 5 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 6 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 7 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 8 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 9 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:Node 10 has removed from the doublelist...

Message from syslogd@localhost at Oct  8 16:59:29 ...
 kernel:doublelist is exiting..

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