亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3631 | 回復(fù): 5
打印 上一主題 下一主題

Linux設(shè)備驅(qū)動詳解globalmem驅(qū)動 求助 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-01-31 23:15 |只看該作者 |倒序瀏覽
insmod時出現(xiàn):globalmem :unknown symbol malloc_sizes
insmod:can't insert 'globalmem.ko' :unknown symbol in module or invalid parameter,到底應(yīng)該如何解決呢?在此謝謝了。
我的內(nèi)核版本是2.6.31.
查看內(nèi)核源碼知道m(xù)m中的slab.c中有malloc_sizes的定義及導(dǎo)出符號。
我的源文件如下:
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/slab.h>


#define GLOBALMEM_SIZE 4096 /*全局內(nèi)存大小:4KB*/
#define MEM_CLEAR 0x1       /*清零全局內(nèi)存*/
#define GLOBALMEM_MAJOR 0 /*預(yù)設(shè)的globalmem的主設(shè)備號*/

static globalmem_major = GLOBALMEM_MAJOR;
/*globalmem設(shè)備結(jié)構(gòu)體*/
struct globalmem_dev
{
        struct cdev cdev;    /*cdev結(jié)構(gòu)體*/
        unsigned char mem[GLOBALMEM_SIZE]; /*全局內(nèi)存*/
};



struct globalmem_dev *globalmem_devp; /*設(shè)備結(jié)構(gòu)體指針*/

/*文件打開函數(shù)*/
int globalmem_open(struct inode *inode, struct file *filp)
{
        /*將設(shè)備結(jié)構(gòu)體指針賦值給文件私有數(shù)據(jù)指針*/
        filp->private_data = globalmem_devp;
        return 0;
}

/*文件釋放函數(shù)*/
int globalmem_release(struct inode *inode, struct file *filp)
{
        return 0;
}

/*ioctl設(shè)備控制函數(shù)*/
static int globalmem_ioctl(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg)
{
        struct globalmem_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/
        switch(cmd)
        {
                case MEM_CLEAR:
                        memset(dev->mem, 0, GLOBALMEM_SIZE);
                        printk(KERN_INFO "globalmem is set to zero\n");
                        break;
                default:
                        return -EINVAL;
        }
        return 0;
}

/*讀函數(shù)*/
static ssize_t globalmem_read(struct file *filp, char __user *buf,
        size_t size, loff_t *ppos)
{
        unsigned long p = *ppos;
        unsigned int count =size;
        int ret = 0;
        struct globalmem_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/
       
        /*分析和獲取有效的寫長度*/
        if(p >= GLOBALMEM_SIZE)
                return 0;
        if(count > GLOBALMEM_SIZE - p)
                count = GLOBALMEM_SIZE -p;
       
        /*讀數(shù)據(jù)到用戶空閑*/
        if(copy_to_user(buf, (void *)(dev->mem + p), count))
        {
                ret = -EFAULT;
        }
        else
        {
                *ppos += count;
                ret = count;
                printk(KERN_INFO "read %d bytes(s) from %d\n",count, p);
        }
       
        return ret;
}

/*寫函數(shù)*/
static ssize_t globalmem_write(struct file *filp, const char __user *buf,
        size_t size, loff_t *ppos)
{
        unsigned long p = *ppos;
        unsigned int count =size;
        int ret = 0;
        struct globalmem_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/
       
        /*分析和獲取有效的寫長度*/
        if(p > GLOBALMEM_SIZE)
                return 0;
        if(count > GLOBALMEM_SIZE - p)
                count = GLOBALMEM_SIZE - p;
        /*從用戶空間寫入數(shù)據(jù)*/
        if(copy_from_user(dev->mem + p, buf, count))
                ret = -EFAULT;
        else
        {
                *ppos += count;
                ret = count;
               
                printk(KERN_INFO "written %d bytes(s) from %d\n",count, p);
        }
       
        return ret;
}

/**/
static loff_t globalmem_llseek(struct file *filp, loff_t offset, int whence)
{
        loff_t newpos = 0;
       
        switch(whence)
        {
                case 0:   /* SEEK_SET */
                        newpos = offset;
                        break;
                case 1:   /* SEEK_CUR */
                        newpos = filp->f_pos + offset;
                        break;
                case 2:   /* SEEK_END */
                        newpos = filp->f_pos -1 + offset;
                        break;
                default:  /* can't happen */
                        return -EINVAL;
        }
       
        if((newpos < 0)||(newpos > GLOBALMEM_SIZE))
                return -EINVAL;
       
        filp->f_pos = newpos;
        return newpos;
}

static const struct file_operations globalmem_fops =
{
        .owner = THIS_MODULE,
        .llseek = globalmem_llseek,
        .open = globalmem_open,
        .release = globalmem_release,
        .read = globalmem_read,
        .write = globalmem_write,
        .ioctl = globalmem_ioctl,
};

static int globalmem_init(void)
{
        int result;
        int err;
        dev_t devno = MKDEV(globalmem_major,0); /*得到設(shè)備編號*/
       
        /*申請設(shè)備號*/
        if(globalmem_major)
                result = register_chrdev_region(devno, 1, "globalmem");
        else
        {
                result = alloc_chrdev_region(&devno, 0, 1, "globalmem");
                globalmem_major = MAJOR(devno);
        }
        if(result < 0)
                return result;
       
        /*初始化cdev結(jié)構(gòu)*/
        cdev_init(&globalmem_devp->cdev, &globalmem_fops);
        globalmem_devp->cdev.owner = THIS_MODULE;
        globalmem_devp->cdev.ops = &globalmem_fops;
       
        /*注冊字符設(shè)備*/
        err = cdev_add(&globalmem_devp->cdev, devno, 1);
        if(err)
                printk(KERN_NOTICE "Error %d adding globalmem",err);
       
        /* 為設(shè)備描述結(jié)構(gòu)分配內(nèi)存*/
        globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL);
        if(!globalmem_devp) /*申請失敗*/
        {
                result = -ENOMEM;
                goto fail_malloc;
        }
        memset(globalmem_devp, 0, sizeof(struct globalmem_dev));
       
        return 0;
       
        fail_malloc:unregister_chrdev_region(devno, 1);
        return result;
}

void globalmem_exit(void)
{
        cdev_del(&globalmem_devp->cdev); /*注銷cdev*/
        kfree(globalmem_devp); /*釋放設(shè)備結(jié)構(gòu)體內(nèi)存*/
        unregister_chrdev_region(MKDEV(globalmem_major, 0), 1); /*釋放設(shè)備號*/
}

MODULE_AUTHOR("Jin huatian");
MODULE_LICENSE("GPL");

module_init(globalmem_init);
module_exit(globalmem_exit);

論壇徽章:
0
2 [報告]
發(fā)表于 2012-02-21 16:27 |只看該作者
你程序里沒用到malloc_sizes啊,你自己編譯的內(nèi)核模塊?Makefile貼上來看看...

論壇徽章:
0
3 [報告]
發(fā)表于 2012-03-26 19:32 |只看該作者
是的,自己編譯的內(nèi)核,后來又重新配置編譯了內(nèi)核后,可以加載成功!謝謝!

論壇徽章:
0
4 [報告]
發(fā)表于 2014-08-21 21:10 |只看該作者
朋友  在 我遇到相同的問題  我內(nèi)核都重新編譯過的  還是有問題  能幫忙一下嗎

論壇徽章:
0
5 [報告]
發(fā)表于 2014-08-21 21:10 |只看該作者
朋友  在 我遇到相同的問題  我內(nèi)核都重新編譯過的  還是有問題  能幫忙一下嗎

論壇徽章:
9
辰龍
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辭舊歲徽章
日期:2015-03-03 16:54:1515-16賽季CBA聯(lián)賽之青島
日期:2016-03-13 23:37:1915-16賽季CBA聯(lián)賽之深圳
日期:2016-03-29 18:52:38
6 [報告]
發(fā)表于 2014-08-23 22:00 |只看該作者
回復(fù) 5# garbage哥

你又是插模塊時告訴你,你模塊里頭有符號解析不了?
排查的方法為:

先把你插的模塊缺的符號認下來。

cat /proc/kallsyms | grep "你記下來的模塊"

如果找不到,就是證明你的內(nèi)核沒有編譯這個函數(shù)進來。一般出現(xiàn)這個問題有兩種可能。

1. 你編譯模塊所用的內(nèi)核工程,和你目前所運行的內(nèi)核不是一個版本。如果是這種問題,請重新編譯你的內(nèi)核,然后把機器里的內(nèi)核換成新了,再次用戶這個內(nèi)核編譯你的模塊。
2. 你這個模塊所依賴的函數(shù),為另外一個模塊導(dǎo)出,而此模塊你當(dāng)前并沒有插入。如果是這樣,你可以先把那個模塊插入進去。如果不知道是那個模塊,可以先在內(nèi)核里搜索一下你記下來的函數(shù)名,找到.c文件后,看看Makefile把這個文件編譯進哪個模塊了。如果你的PC環(huán)境,也可以用戶modprobe自動依賴的模塊都探測出來,自動插入。


   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP