01-15-2010
Linux Device Driver: avoid mem copy from/to user/kernel space
I recently started working with Linux and wrote my first device driver for a hardware chip controlled by a host CPU running Linux 2.6.x kernel.
1. The user space process makes an IOCTL call with pointer to a user memory buffer.
2. The kernel device driver in the big switch-case of IOCTL, first does a copy to kernel space
3. The driver then processes the memory, eventually writing words to the hardware blocks as appropriate
The memory copying is a performance hit because of limited cycles available on this embedded CPU. How does one avoid unnecessary memory copy between user space and kernel space? Suppose there is a buffer in the user-space that needs to be read by the kernel space? I believe that the typical code in the kernel mode device driver is:
....
copy_from_user(kernel_dst_buffer, user_src_buffer, length);
use kernel_dst_buffer;
...
I want to avoid the copy_from_user and was trying to read up my "Linux Device Drivers book by Corbet/Rubini" and search online as well. It appears that one of the following will be used:
get_user_pages
mmap
shm_get
but I can't figure out. It appears extremely difficult/complicated for a simple task of sharing memory between user/kernel modes. Is that how it is? I couldn't even get any sample code for sharing memory though there appears to be sample code for just about everything. Maybe my search strings are broken.
Any pointers?
Thanks a lot!
Gaurav
9 More Discussions You Might Find Interesting
1. UNIX for Advanced & Expert Users
I am looking for a guide on how to program for either the Linux or FreeBSD (includes 4.4BSD, NetBSD or OpenBSD) kernel. I would prefer to learn how to write device drivers, but anything would help.
If you know, please email me at *removed* or leave a post here
Regards,
Farhan (0 Replies)
Discussion started by: Farhan
0 Replies
2. UNIX for Dummies Questions & Answers
hai friend,
I am new to Linux, i need a book for Linux basic and Linux device driver ..
plz send the book name and author(Easy to learn and mostly used by programmers) and also send the link if it is available in Net...
Thank you.
... (0 Replies)
Discussion started by: sundar.lsr
0 Replies
3. UNIX for Advanced & Expert Users
Hello, I'm searching for a proper way to let the kernel space ISR(implemented in a kernel module) wake up a user space thread on a hardware interrupt.
Except for sending a real-time signal, is it possible to use a semaphore?
I've searched it on google, but it seems impossible to share a... (0 Replies)
Discussion started by: aaronwong
0 Replies
4. UNIX for Dummies Questions & Answers
Hi all,
Is it possible to do the following in Linux (kernel 2.6.x):
- A user-space thread goes to "sleep". Using any call/mechanism
- On a hardware generated interrupt, the Interrupt handler (ISR) "wakes" the sleeping user-thread.
I have seen wait_event() and wake_up() but it appears... (1 Reply)
Discussion started by: agaurav
1 Replies
5. UNIX for Dummies Questions & Answers
Need some clarification on this....
1. how are kernel/ user spaces and high/low memory related?
2. What do they all mean when i have the kernel command line as:
"console=ttyS0,115200 root=/dev/sda2 rw mem=exactmap memmap=1M@0 memmap=96M@1M irqpoll"
or
2. what do mem and memmap mean in... (3 Replies)
Discussion started by: dragonpoint
3 Replies
6. Fedora
I have been reading prep questions for my second unix academy exam, and there's a nuance, I'm not sure I understand it correctly.
I've been under impression from my readings of book by Evi Nemeth and from unix academy DVDs I've been watching, that kernel's modules are drivers. I think of it, as... (25 Replies)
Discussion started by: newlinuxuser1
25 Replies
7. UNIX for Advanced & Expert Users
Hi All,
I'm looking for role change to Linux device Driver developer. My current role has no connection to Linux Device driver development and hence to support my stand i want to do a certification for the same.
I have googled but couldn't found any standard certification. I have submitted... (1 Reply)
Discussion started by: kg_gaurav
1 Replies
8. Shell Programming and Scripting
print "After create SubDir routine.";
createSubDirs($fileDir);
my $from = $ORACLE_HOME.$dirSep.$file;
my $to = $bootstrapDir.$dirSep.$fileDir;
if ($isWindows) {
copy($from,... (1 Reply)
Discussion started by: ambarginni
1 Replies
9. Emergency UNIX and Linux Support
print "After create SubDir routine.";
createSubDirs($fileDir);
my $from = $ORACLE_HOME.$dirSep.$file;
my $to = $bootstrapDir.$dirSep.$fileDir;
if ($isWindows) {
copy($from,... (2 Replies)
Discussion started by: ambarginni
2 Replies
LEARN ABOUT SUNOS
allkmem
mem(7D) Devices mem(7D)
NAME
mem, kmem, allkmem - physical or virtual memory access
SYNOPSIS
/dev/mem
/dev/kmem
/dev/allkmem
DESCRIPTION
The file /dev/mem is a special file that provides access to the physical memory of the computer.
The file /dev/kmem is a special file that provides access to the virtual address space of the operating system kernel, excluding memory
that is associated with an I/O device.
The file /dev/allkmem is a special file that provides access to the virtual address space of the operating system kernel, including memory
that is associated with an I/O device. You can use any of these devices to examine and modify the system.
Byte addresses in /dev/mem are interpreted as physical memory addresses. Byte addresses in /dev/kmem and /dev/allkmem are interpreted as
kernel virtual memory addresses. A reference to a non-existent location returns an error. See ERRORS for more information.
The file /dev/mem accesses physical memory; the size of the file is equal to the amount of physical memory in the computer. This size may
be larger than 4GB on a system running the 32-bit operating environment. In this case, you can access memory beyond 4GB using a series of
read(2) and write(2) calls, a pread64() or pwrite64() call, or a combination of llseek(2) and read(2) or write(2).
ERRORS
EFAULT Occurs when trying to write(2) a read-only location (allkmem), read(2) a write-only location (allkmem), or read(2) or
write(2) a non-existent or unimplemented location (mem, kmem, allkmem).
EIO Occurs when trying to read(2) or write(2) a memory location that is associated with an I/O device using the /dev/kmem spe-
cial file.
ENXIO Results from attempting to mmap(2) a non-existent physical (mem) or virtual (kmem, allkmem) memory address.
FILES
/dev/mem Provides access to the computer's physical memory.
/dev/kmem Provides access to the virtual address space of the operating system kernel, excluding memory that is associated with an
I/O device.
/dev/allkmem Provides access to the virtual address space of the operating system kernel, including memory that is associated with an
I/O device.
SEE ALSO
llseek(2), mmap(2), read(2), write(2)
WARNINGS
Using these devices to modify (that is, write to) the address space of a live running operating system or to modify the state of a
hardware device is extremely dangerous and may result in a system panic if kernel data structures are damaged or if device state is
changed.
SunOS 5.10 18 Feb 2002 mem(7D)