| BUG: unable to handle kernel NULL pointer dereference at 00000100 Thank you coopstah13 for your reply.
A piece of my source code is
#define PHYSICAL_ADDR 0x00000100
#define MEM_SIZE 2
int memory_init(void)
{
int result;
/*Registering device*/
result = register_chrdev(memory_major, "my_module", &memory_fops);
if(result < 0) {
printk("<1> my_module: cannot obtain major number %d\n", memory_major);
return result;
}
/*Allocating memory byte for the port*/
my_port = check_region(PHYSICAL_ADDR, MEM_SIZE); //check_region returns 0 (success)
if(my_port) {
printk("<1>my_module: cannot reserve 0x%X\n",PHYSICAL_ADDR);
result = my_port;
goto fail;
}
alloc_result = request_mem_region(PHYSICAL_ADDR, MEM_SIZE, "my_module");
//request_mem_region() returns 0 (success)
if(alloc_result) {
printk("<1>my_partport2: Requested memory region not allocated\n");
goto fail;
}
printk("<1>my_module: Requested memory region allocated successfully....Inserting Module\n");
return 0;
fail:
memory_exit();
return result;
}
ssize_t memory_read(struct file *filp, char *buf,
size_t count, loff_t *f_pos) {
char my_parport_buf;
////////////////////////////////////////////
my_parport_buf = *((char *)PHYSICAL_ADDR); //This statement gives the segmentation fault
///////////////////////////////////////////////
copy_to_user(buf, &my_parport_buf, 1);
if(*f_pos == 0) {
*f_pos+=1;
return 1;
} else {
return 0;
}
}
When I run a C program that opens and reads one character from the file /dev/my_module, segmentation fault occurs. dmesg shows following
BUG: unable to handle kernel NULL pointer dereference at 00000100
IP: [<f8b6f080>] :my_parport2:memory_read+0x1c/0x66
*pdpt = 00000000243e6001 *pde = 0000000000000000
Oops: 0000 [#2] SMP
Kindly tell me where my the problem may lie. Am I on the right path for writing on physical memory? or should I adopt a new path?
regards,
Atif Shabir |