【问题标题】:Where do I store dynamically allocated memory on a platform device (without using globals)?我在平台设备上的哪里存储动态分配的内存(不使用全局变量)?
【发布时间】:2014-06-15 16:00:43
【问题描述】:

我想让我正在编写的平台驱动程序可重入:我在哪里存储在探测和/或打开调用期间动态分配的内存 (int probe(struct platform_device*)/int open(struct inode *inode, struct file *))

驱动程序可以在多个系统内硬件上实例化,每个硬件都可以从用户空间同时访问。

我可以将struct file 中的private_data 字段和struct device 中的platform_data 用作指向已分配内存的任意指针吗?

【问题讨论】:

    标签: c linux linux-device-driver


    【解决方案1】:

    如果你在写一个平台驱动,你应该使用dev_set_drvdata()函数,which sets the driver_data field in struct device,.

    有一个例子。

    struct blink_local {
        int irq;
        unsigned long mem_start;
        unsigned long mem_end;
        void __iomem *base_addr;
    };
    
    static int blink_probe(struct platform_device *pdev)
    {
        struct resource *r_irq; /* Interrupt resources */
        struct resource *r_mem; /* IO mem resources */
        struct device *dev = &pdev->dev;
        struct blink_local *lp = NULL;
    
        int rc = 0;
        dev_info(dev, "Device Tree Probing\n");
        /* Get iospace for the device */
        r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!r_mem) {
            dev_err(dev, "invalid address\n");
            return -ENODEV;
        }
    
        lp = (struct blink_local *) kmalloc(sizeof(struct blink_local), GFP_KERNEL);
        if (!lp) {
            dev_err(dev, "Cound not allocate blink device\n");
            return -ENOMEM;
        }
    
        dev_set_drvdata(dev, lp);
        lp->mem_start = r_mem->start;
        lp->mem_end = r_mem->end;
    
        if (!request_mem_region(lp->mem_start,
                    lp->mem_end - lp->mem_start + 1,
                    DRIVER_NAME)) {
            dev_err(dev, "Couldn't lock memory region at %p\n",
                (void *)lp->mem_start);
            rc = -EBUSY;
            goto error1;
        }
    
        lp->base_addr = ioremap(lp->mem_start, lp->mem_end - lp->mem_start + 1);
        if (!lp->base_addr) {
            dev_err(dev, "blink: Could not allocate iomem\n");
            rc = -EIO;
            goto error2;
        }
    
        /* Get IRQ for the device */
        r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!r_irq) {
            dev_info(dev, "no IRQ found\n");
            dev_info(dev, "blink at 0x%08x mapped to 0x%08x\n",
                (unsigned int __force)lp->mem_start,
                (unsigned int __force)lp->base_addr);
            return 0;
        }
        lp->irq = r_irq->start;
        rc = request_irq(lp->irq, &blink_irq, 0, DRIVER_NAME, lp);
        if (rc) {
            dev_err(dev, "testmodule: Could not allocate interrupt %d.\n",
                lp->irq);
            goto error3;
        }
    
        return 0;
    error3:
        free_irq(lp->irq, lp);
    error2:
        release_mem_region(lp->mem_start, lp->mem_end - lp->mem_start + 1);
    error1:
        kfree(lp);
        dev_set_drvdata(dev, NULL);
        return rc;
    }
    

    【讨论】:

      【解决方案2】:

      对于由驱动程序动态分配的内存,struct fileprivate_data 字段是要使用的。

      该字段的使用方式取决于驱动程序,内核不会触及它。它仅供驱动程序使用。

      你也可以看看this上一个问题。

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2016-02-07
        • 2012-02-03
        • 2013-11-09
        相关资源
        最近更新 更多