当前位置: 技术问答>linux和unix
嵌入式Linux中copy_to_user中Segmentation fault错误
来源: 互联网 发布时间:2017-04-28
本文导语: 其实这个代码与具体开发板无关,想在内核空间和用户空间传递结构体数据,第一块的write已经验证成功,但是read一直报Segmentation fault错误,已经调了好几天。想请教大家,谢谢大家,具体代码如下: 驱动代码: #i...
其实这个代码与具体开发板无关,想在内核空间和用户空间传递结构体数据,第一块的write已经验证成功,但是read一直报Segmentation fault错误,已经调了好几天。想请教大家,谢谢大家,具体代码如下:
驱动代码:
驱动代码:
#include
#include
#include
#include
#include
#include
#include
#include
/*
Kernel Version: Linux 2.6.38
Arm Version: Mini 6410
*/
#define MyPrintk printk
struct my_data_structure
{
unsigned int number;
char *name;
unsigned long count;
};
static dev_t Leds_Major ;
static char * DEVICE_NAME = "DataTransfemission";
static struct class *leds_class;
static struct my_data_structure my_own_data[] = {
{1,"Jack",0},
{2,"Tom",0},
{3,"Kobe",0},
{4,"Xiaohong",0}
};
static ssize_t data_read(struct file *file, char __user * buffer, size_t count, loff_t *pos)
{
struct my_data_structure temp_data=
{6,"Jack",0};
MyPrintk("123n");
int ret = copy_to_user(buffer,(void *)&temp_data, sizeof(temp_data));
if (ret != 0){
MyPrintk("read errorn");
}
return 0;
}
static ssize_t data_write(struct file *flie, const char __user * buffer, size_t count, loff_t *pos)
{
struct my_data_structure user_data;
int ret = copy_from_user((void *)&user_data, buffer, count);
if (ret != 0){
MyPrintk("write errorn");
}
MyPrintk (KERN_EMERG "Kernel from user data: %i, %s, %lun", user_data.number,
user_data.name, user_data.count);
return 0;
}
static int data_open(struct file *file, struct node *nodes)
{
return 0;
}
static struct file_operations s3c64XX_leds_fops = {
.owner = THIS_MODULE,
.read = data_read,
.write = data_write,
.open = data_open,
};
static int myleds_init(void)
{
Leds_Major = register_chrdev(Leds_Major,DEVICE_NAME , &s3c64XX_leds_fops);
if(Leds_Major count = 2;
ret = write(fd, my_write_data2 , sizeof(struct my_data_structure));
if(ret count);
printf("read 2!n");
struct my_data_structure* my_read_data2;
ret = read(fd, my_read_data2 , sizeof(struct my_data_structure));
if(ret number, my_read_data2->name, my_read_data2->count);
free(my_write_data2);
free(my_read_data2);
free(my_read_data3);
return 0;
}
|
我没调试你的程序,但你的程序肯定是不能运行的,
printf("my_read_data: %ui, %s, %uln", my_read_data.number, my_read_data.name, my_read_data.count);肯定要段错误的
my_read_data.name的地址在内核
struct my_data_structure{ unsigned int number; char *name; unsigned long count;};
这样的定义是不能将name的数据传送到用户端
你需要把name改成char数组。
printf("my_read_data: %ui, %s, %uln", my_read_data.number, my_read_data.name, my_read_data.count);肯定要段错误的
my_read_data.name的地址在内核
struct my_data_structure{ unsigned int number; char *name; unsigned long count;};
这样的定义是不能将name的数据传送到用户端
你需要把name改成char数组。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。