Practical character driver
Mulyadi Santosa
mulyadi.santosa at gmail.com
Sun Feb 27 02:52:30 EST 2011
On Sun, Feb 27, 2011 at 11:57, Sameer Rahmani <lxsameer at gmail.com> 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
More information about the Kernelnewbies
mailing list