首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放分配内存的linux内核设备驱动模块

释放分配内存的linux内核设备驱动模块
EN

Stack Overflow用户
提问于 2022-10-18 15:15:36
回答 1查看 30关注 0票数 0

我正在为linux内核模块编写代码,该模块分配空间并在其中存储一些数据,但是kmalloc分配发生在vfs的写函数中,因为我需要来自用户应用程序的缓冲区的大小,并且不能在写函数之外访问它。我应该把kfree()函数放在哪里?我不能将它放在清理下,因为每当我试图卸载模块时,它都会给我一个错误。

代码语言:javascript
复制
ssize_t hcsr04_write(struct file *filp, const char *buffer, size_t length, loff_t * offset)
{
        if (pulsecount < (5)){
            pulseptr[pulsecount] = kmalloc(sizeof(buffer),GFP_ATOMIC);
            sprintf (pulseptr[pulsecount],"%s",buffer);
            pulsecount++;
        }
        else{
            int j = 0;
            while (j<4){
                sprintf (pulseptr[j], "%s", (pulseptr[j+1]) ); // [5 , 20 , 30 , 70 , 50] ===> [20 , 30 , 70 , 50 , 50]
                j++;
            }
            sprintf (pulseptr[4],"%s",buffer);
        }       
    
}

这是我的写作功能。

代码语言:javascript
复制
static void __exit hcsr04_module_cleanup(void)
{
    //if (pulseptr!= {NULL,NULL,NULL,NULL,NULL}){
    kfree(pulseptr);
    printk(KERN_INFO "Dynamic memory freed successfully.");
    //}
    //pulseptr = {NULL,NULL,NULL,NULL,NULL};
    gpio_free( GPIO_OUT );
    gpio_free( GPIO_IN );
    hcsr04_lock = 0;
    cdev_del(&hcsr04_cdev);
    unregister_chrdev_region( hcsr04_dev, 1 );
    kobject_put( hcsr04_kobject );
}

这是清理功能。如果我使用这样的清理函数执行rmmod命令,就会得到以下错误:

代码语言:javascript
复制
[   93.294821] 8<--- cut here ---
[   93.297928] Unable to handle kernel paging request at virtual address bcf03574
[   93.305253] pgd = 3cdbb3d3
[   93.307993] [bcf03574] *pgd=00000000
[   93.311621] Internal error: Oops: 5 [#1] SMP ARM
[   93.316301] Modules linked in: hcsr04(O-) nfc bnep bluetooth ecdh_generic ecc ipv6 hello(PO) g_serial libcomposite udc_core brcmfmac brcmutil sha256_generic libsha256 vc4 cfg80211 bcm2835_codec(C) rfkill bcm2835_isp(C) bcm2835_v4l2(C) v4l2_mem2mem cec bcm2835_mmal_vchiq(C) videobuf2_dma_contig snd_soc_core videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 snd_compress snd_pcm_dmaengine videobuf2_common snd_pcm videodev snd_timer mc snd raspberrypi_hwmon vc_sm_cma(C) uio_pdrv_genirq uio fixed
[   93.360563] CPU: 0 PID: 478 Comm: rmmod Tainted: P         C O      5.4.72-v7 #1
[   93.368060] Hardware name: BCM2835
[   93.371516] PC is at kfree+0x48/0x2bc
[   93.375235] LR is at hcsr04_module_cleanup+0x18/0xcac [hcsr04]
[   93.381148] pc : [<802fd004>]    lr : [<7f17a36c>]    psr: 20010013
[   93.387501] sp : b80abf08  ip : b80abf38  fp : b80abf34
[   93.392797] r10: 00000081  r9 : b80aa000  r8 : 801011c4
[   93.398095] r7 : 7f17a36c  r6 : 7e92dc38  r5 : 7f17c000  r4 : bcf03570
[   93.404713] r3 : bab24000  r2 : 00000024  r1 : 00000000  r0 : 7f17c000
[   93.411333] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   93.418568] Control: 10c5383d  Table: 38d5806a  DAC: 00000055
[   93.424394] Process rmmod (pid: 478, stack limit = 0x274b04e4)
[   93.430307] Stack: (0xb80abf08 to 0xb80ac000)
[   93.434728] bf00:                   801c8158 80989110 7f17c0c0 00000000 7e92dc38 00000081
[   93.443026] bf20: 801011c4 b80aa000 b80abf4c b80abf38 7f17a36c 802fcfc8 7f17c0c0 00000000
[   93.451324] bf40: b80abfa4 b80abf50 801ca940 7f17a360 72736368 00003430 00000000 80da6b10
[   93.459621] bf60: 80101068 7e92cbe8 00000000 801011c4 b80aa000 00000006 b80abfac b80abf88
[   93.467918] bf80: 80228294 8022938c 00000000 80e05f88 00000000 7e92de2c 00000000 b80abfa8
[   93.476216] bfa0: 80101000 801ca7e0 00000000 7e92de2c 01677694 00000800 6a0f1b00 7e92dbe4
[   93.484513] bfc0: 00000000 7e92de2c 7e92dc38 00000081 7e92df1f 7e92dc34 01677190 00000001
[   93.492811] bfe0: 004e1f70 7e92dbec 004c866f 76f37218 60010030 01677694 00000000 00000000
[   93.501100] Backtrace: 
[   93.503593] [<802fcfbc>] (kfree) from [<7f17a36c>] (hcsr04_module_cleanup+0x18/0xcac [hcsr04])
[   93.512331]  r9:b80aa000 r8:801011c4 r7:00000081 r6:7e92dc38 r5:00000000 r4:7f17c0c0
[   93.520195] [<7f17a354>] (hcsr04_module_cleanup [hcsr04]) from [<801ca940>] (sys_delete_module+0x16c/0x244)
[   93.530073]  r5:00000000 r4:7f17c0c0
[   93.533704] [<801ca7d4>] (sys_delete_module) from [<80101000>] (ret_fast_syscall+0x0/0x28)
[   93.542084] Exception stack(0xb80abfa8 to 0xb80abff0)
[   93.547209] bfa0:                   00000000 7e92de2c 01677694 00000800 6a0f1b00 7e92dbe4
[   93.555507] bfc0: 00000000 7e92de2c 7e92dc38 00000081 7e92df1f 7e92dc34 01677190 00000001
[   93.563801] bfe0: 004e1f70 7e92dbec 004c866f 76f37218
[   93.568922]  r5:7e92de2c r4:00000000
[   93.572549] Code: e3a02024 e5933000 e1a04624 e0243492 (e5943004) 
[   93.578730] ---[ end trace cff8773499967501 ]---

一旦我注释掉kfree,错误就消失了。

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 16:58:11

我意识到我做错了什么。我应该做kfree(pulseptr),其中0可以是我所分配的内存位置的索引数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74113434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档