Thread (3 messages) 3 messages, 3 authors, 2011-02-27

Practical character driver

From: Mulyadi Santosa <hidden>
Date: 2011-02-27 07:52:30

On Sun, Feb 27, 2011 at 11:57, Sameer Rahmani [off-list ref] wrote:
static int __init module_initial(void)
{
? dev_t dev;
? int result;
? struct memmap *memory;

? if (major)
??? {
????? dev = MKDEV(major, minor);
????? result = register_chrdev_region(dev, 1, "memchar");
??? }
? else
??? {
????? result = alloc_chrdev_region(&dev, minor, 1,
??? ??? ??? ??? ?? "memchar");
????? major = MAJOR(dev);

??? }
? if (result < 0)
??? {
????? printk (KERN_ALERT "Cannot register major number.\n");
????? return result;
??? }

? device = kmalloc(sizeof(char) * map_size, GFP_KERNEL);
? if (! device)
??? {
????? printk (KERN_ALERT "Allocating device failed.\n");
????? result = -ENOMEM;
????? goto fail;
??? }


? memset(device, 0, sizeof(char) * map_size);

? memory->device = device;
? mem_setup_cdev(memory);


? printk(KERN_ALERT "Major: %d", major);
? return 0;

?fail:
? module_cleanup();
? return result;
}
As you can see by yourself, you put many data structures as locals to
module_init. So once module_init is thrashed, those variables/pointers
also gone. Result? Easy to guess...lost reference :)

-- 
regards,

Mulyadi Santosa
Freelance Linux trainer and consultant

blog: the-hydra.blogspot.com
training: mulyaditraining.blogspot.com
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help