亚洲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