Solved

Sharing between different processes using driver

Posted on 2004-08-17
6
347 Views
Last Modified: 2008-03-17
I've created a memory module that gets installed as a driver. I create a node for this module on the filesystem. Some applications open the node and write to it, while others read from it. Whenever a process writes to it, the module stores it in kernel memory, however when another process goes to read, it doesn't appear to see the same memory that was written, as if it has a separate instance of the module. How can I make it so it sees the same memory?

Code Example for the module:

char * data;

init_module
{
  data =(char *) kmalloc(100,GFP_KERNEL);
}

read(char * buf,.....)
{
  copy_to_user(buf,data,100);
}


So if "init_module" is called during the insert the module, it creates the memory space for the global variable "data", but then when process A  tries to call read, it gets a segmentation fault, as if the memory had never been allocated. Can anyone explain this?
0
Comment
Question by:stauffec
  • 3
  • 2
6 Comments
 
LVL 3

Expert Comment

by:scn
ID: 11828102
Is the user space variable buf correctly allocated by the process before the call to read?
0
 

Author Comment

by:stauffec
ID: 11837384
In the code snippet up top, the initialization of the module (insmod) causes the allocation of the memory and it is successfully freed at the removal of the module (rmmod). HOwever, any other process opening the driver and trying to read or write to it seems to get a segmentation fault, as if the memory wasn't allocated. What i'm not sure of is if that allocation of memory done on the insmod call is still visible when another process tries to call read, which is supposed to read data from that memory. If it cannot see it, how can I have a module that can allow one process to write into a memory space and then have another process read from that same kernel memory. I thought the module was the bridge for that.
0
 
LVL 3

Expert Comment

by:scn
ID: 11838767
kmalloc allocates memory into the kernel space so, while inside the module read function, any process can read this memory. Then, copy_to_user(buf,data,100) copies the "data" variable (belonging to kernel memory area) content to the buf variable (belonging to the process memory area) asuming that buf has already been allocated by the calling process.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:stauffec
ID: 11840023
OK, I understand that kmalloc allocates memory in the kernel, however, is the variable char pointer "data" that is assigned the memory allocation during module initilization the same variable that will be seen by another process when it calls the read function, or when the process opens the node and calls read, is a new variable "data" instantiated, for the process?
0
 
LVL 3

Accepted Solution

by:
scn earned 300 total points
ID: 11840392
data is the same variable. You can check it easily by putting some content to data in the init function and display it with a printk in read function. Below is a complete example:

kernel module
---------------
// includes ...
char *data;

static int my_open(struct inode *inode, struct file *file) {
      return 0;
}

static int my_release(struct inode *inode, struct file *file) {
      return 0;
}

static ssize_t my_read(struct file *file, char *buf, size_t count, loff_t *ppos){
      printk(KERN_INFO "Data values [%s]\n", data);
      copy_to_user(buf,data,100);
}

static struct file_operations my_fops = {
      owner:  THIS_MODULE,
      open:   my_open,
      release:my_release,
      read:   my_read,
};

static int __init my_init(void) {
      int ret;
  if (ret=register_chrdev(62, "/dev/mydrv", &my_fops)) {
    printk(KERN_ERR "Failed to register driver, errno %d\n", ret);
            return -1;
  }
      data = kmalloc(100, GFP_KERNEL);
      memcpy(data,"a string",9);
      return 0;
}

static void __exit my_exit(void) {
}

module_init(my_init);
module_exit(my_exit);


Process source:
-----------------
// includes ...
int main() {
      int fd,nb;
      char *buf;

      fd = open("/dev/mydrv", O_RDONLY);
      if (fd<0) {printf("OPEN error\n"); exit (0);}
      buf=(char*)malloc(100);
      nb=read(fd, buf, 100);
      if (nb<0) printf("Read error %d\n", errno);
      else      printf("Read [%s]\n", buf);
      close(fd);
}

Creation of the device node: mknod /dev/mydrv c 62 0

When executing ./u, the line "Data values [astring]" is added to /var/log/messages (if syslog configured for it) and the process displays on stdout "Read [astring]".
Hope that helps.

0
 
LVL 8

Expert Comment

by:Anthony2000
ID: 11899271
Have you tried adding a printk after the memory is allocated to make sure that your init function is getting called? I have done what you are trying to do and had no problems.

Rubini has an example that I started with in his book on device drivers: http://www.xml.com/ldd/chapter/book/

and the examples from the book: http://examples.oreilly.com/linuxdrive2/

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Have you ever been frustrated by having to click seven times in order to retrieve a small bit of information from the web, always the same seven clicks, scrolling down and down until you reach your target? When you know the benefits of the command l…
The purpose of this article is to demonstrate how we can upgrade Python from version 2.7.6 to Python 2.7.10 on the Linux Mint operating system. I am using an Oracle Virtual Box where I have installed Linux Mint operating system version 17.2. Once yo…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now