在kernel模块里面创建链表

使用QEMU搭建ARM64实验环境_蓝牙先生的博客-CSDN博客#1.toolchainwget -c https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xztar xfv gcc-arm-8.2-2018.11-x86_64-arm-eabi.tar.xzexport PATH=`realpath gcc-linaro-7.3.1-https://blog.csdn.net/m0_37132481/article/details/123524951kernel_list.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>


/* 包含内核链表头问题件 */
#include <linux/list.h>
/* 使用kmalloc kfree */
#include <linux/slab.h>

/* 定义一个链表头 */
LIST_HEAD(uhead);

/* 定义使用链表的数据结构 */
struct mydata {
        int32_t data;
        struct list_head l;
};

static int __init _module_init(void)
{
        int32_t i = 0;
        struct mydata *p = NULL;

        /* 生成数据到链表 */
        for(i = 0; i < 10; i++) {

                p = kzalloc(sizeof(*p), GFP_KERNEL);
                if(!p) {
                        /* null */
                } else {
                        printk("%d add to list\n", i);
                        list_add_tail(&p->l, &uhead);
                }
        }
        return 0;
}

static void __exit _module_exit(void)
{
        struct list_head *pos = NULL;
        struct list_head *n = NULL;
        struct mydata *p = NULL;

        list_for_each_safe(pos, n, &uhead)
        {
                p = list_entry(pos, struct mydata, l);
                list_del(&p->l);
                printk("%d remove from list\n", p->data);
                kfree(p);
        }
}


module_init(_module_init);
module_exit(_module_exit);
MODULE_LICENSE("GPL");

Makefile

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

KERNEL_DIR ?=   $(realpath ../../linux/)
obj-m := kernel_list.o

modules:
        $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

clean:
        $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean

install:
        cp *.ko $(KERNEL_DIR)/kmodules

生成kernel_list.ko放到qemu共享目录,执行加载和卸载

# insmod kernel_list.ko 
[  164.811892] kernel_list: loading out-of-tree module taints kernel.
[  164.856807] 0 add to list
[  164.868501] 1 add to list
[  164.869326] 2 add to list
[  164.869434] 3 add to list
[  164.869552] 4 add to list
[  164.869648] 5 add to list
[  164.869737] 6 add to list
[  164.869821] 7 add to list
[  164.876161] 8 add to list
[  164.876667] 9 add to list

# rm[  168.518968] random: fast init done
# rmmod kernel_list.ko 
[  173.339468] 0 remove from list
[  173.343232] 0 remove from list
[  173.345058] 0 remove from list
[  173.345582] 0 remove from list
[  173.346051] 0 remove from list
[  173.362709] 0 remove from list
[  173.363465] 0 remove from list
[  173.363984] 0 remove from list
[  173.364446] 0 remove from list
[  173.364917] 0 remove from list

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值