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

Chinaunix

標題: Linux設備驅(qū)動詳解globalmem驅(qū)動 求助 [打印本頁]

作者: jlkmaster    時間: 2012-01-31 23:15
標題: Linux設備驅(qū)動詳解globalmem驅(qū)動 求助
insmod時出現(xiàn):globalmem :unknown symbol malloc_sizes
insmod:can't insert 'globalmem.ko' :unknown symbol in module or invalid parameter,到底應該如何解決呢?在此謝謝了。
我的內(nèi)核版本是2.6.31.
查看內(nèi)核源碼知道m(xù)m中的slab.c中有malloc_sizes的定義及導出符號。
我的源文件如下:
#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 /*預設的globalmem的主設備號*/

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



struct globalmem_dev *globalmem_devp; /*設備結構體指針*/

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

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

/*ioctl設備控制函數(shù)*/
static int globalmem_ioctl(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg)
{
        struct globalmem_dev *dev = filp->private_data; /*獲得設備結構體指針*/
        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; /*獲得設備結構體指針*/
       
        /*分析和獲取有效的寫長度*/
        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; /*獲得設備結構體指針*/
       
        /*分析和獲取有效的寫長度*/
        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); /*得到設備編號*/
       
        /*申請設備號*/
        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結構*/
        cdev_init(&globalmem_devp->cdev, &globalmem_fops);
        globalmem_devp->cdev.owner = THIS_MODULE;
        globalmem_devp->cdev.ops = &globalmem_fops;
       
        /*注冊字符設備*/
        err = cdev_add(&globalmem_devp->cdev, devno, 1);
        if(err)
                printk(KERN_NOTICE "Error %d adding globalmem",err);
       
        /* 為設備描述結構分配內(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); /*釋放設備結構體內(nèi)存*/
        unregister_chrdev_region(MKDEV(globalmem_major, 0), 1); /*釋放設備號*/
}

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

module_init(globalmem_init);
module_exit(globalmem_exit);
作者: MagicBoy2010    時間: 2012-02-21 16:27
你程序里沒用到malloc_sizes啊,你自己編譯的內(nèi)核模塊?Makefile貼上來看看...
作者: jlkmaster    時間: 2012-03-26 19:32
是的,自己編譯的內(nèi)核,后來又重新配置編譯了內(nèi)核后,可以加載成功!謝謝啊!
作者: garbage哥    時間: 2014-08-21 21:10
朋友  在 我遇到相同的問題  我內(nèi)核都重新編譯過的  還是有問題  能幫忙一下嗎
作者: garbage哥    時間: 2014-08-21 21:10
朋友  在 我遇到相同的問題  我內(nèi)核都重新編譯過的  還是有問題  能幫忙一下嗎
作者: Tinnal    時間: 2014-08-23 22:00
回復 5# garbage哥

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

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

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

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

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


   




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2