“Do you pine for the nice days of Minix-1.1, when men were men and wrote their own device drivers?” Linus Torvalds
Pre-requisites
In order to develop Linux device drivers, it is necessary to have an understanding of the following:
- C programming. Some in-depth knowledge of C programming is needed, like pointer usage, bit manipulating functions, etc.
- Microprocessor programming. It is necessary to know how microcomputers work internally: memory addressing, interrupts, etc. All of these concepts should be familiar to an assembler programmer.
There are several different devices in Linux. For simplicity, this brief tutorial will only cover type char
devices loaded as modules. Kernel 2.6.x will be used (in particular, kernel 2.6.8 under Debian Sarge, which is now Debian Stable).
User space and kernel space
When you write device drivers, it’s important to make the distinction between “user space” and “kernel space”.
- Kernel space. Linux (which is a kernel) manages the machine's hardware in a simple and efficient manner, offering the user a simple and uniform programming interface. In the same way, the kernel, and in particular its device drivers, form a bridge or interface between the end-user/programmer and the hardware. Any subroutines or functions forming part of the kernel (modules and device drivers, for example) are considered to be part of kernel space.
-
User space. End-user programs, like the UNIX
shell
or other GUI based applications (kpresenter
for example), are part of the user space. Obviously, these applications need to interact with the system's hardware . However, they don’t do so directly, but through the kernel supported functions.
All of this is shown in figure 1.
Figure 1: User space where applications reside, and kernel space where modules or device drivers reside
Interfacing functions between user space and kernel space
The kernel offers several subroutines or functions in user space, which allow the end-user application programmer to interact with the hardware. Usually, in UNIX or Linux systems, this dialogue is performed through functions or subroutines in order to read and write files. The reason for this is that in Unix devices are seen, from the point of view of the user, as files.
On the other hand, in kernel space Linux also offers several functions or subroutines to perform the low level interactions directly with the hardware, and allow the transfer of information from kernel to user space.
Usually, for each function in user space (allowing the use of devices or files), there exists an equivalent in kernel space (allowing the transfer of information from the kernel to the user and vice-versa). This is shown in Table 1, which is, at this point, empty. It will be filled when the different device drivers concepts are introduced.
Events | User functions | Kernel functions |
Load module | ||
Open device | ||
Read device | ||
Write device | ||
Close device | ||
Remove module |
Interfacing functions between kernel space and the hardware device
There are also functions in kernel space which control the device or exchange information between the kernel and the hardware. Table 2 illustrates these concepts. This table will also be filled as the concepts are introduced.
Great,
Very nice well written, this nice step by step tutorial is exactly for me.
---
"... Nothing Runs Like A Python ..."
Excellent job
Thanks for the Excellent job of making LINUX drivers easy to understand in a very very short time.
Great................
Great................
Thank you
Great tutorial!
Amazing
I am amazed!! How have you managed to get this thing so simple? A real good job.
Sundip Sharma
WOW !!!!!! simply fantastic work
Thanks
a great article with ample scope of learning the skeleton of linux device drivers and the commonly used functions in them.........so simple and presented in quite an interesting way, so never lets u feel bored.
great work
Great simple tutorial
After kernel 2.4 the kernel compilation and adding up of modules has changed drastically. This tutorial helped me compile and insert my module. Thanks. Effort whole heartedly appreciated.
Kabeer Ahmed.
WOW!!!!!!!!!!!1 Great.....
A great article with ample scope of learning with
nice step by step procedure..
Thank's
Prakash.
Its a good
Its a good information.
Regards, Rajesh
No word's to say
Great Work !!!
Linux is not an OS
"Linux's kernel" has no sense, because Linux is a kernel
Query on reading from the device
Hi All,
I actually tried memory.ko as below:
$echo -n abcdef > /dev/memory
$cat /dev/memory
f
But I've got only the last written character i.e., 'f'.
I changed the code so that the buffer can hold upto 10 bytes (by giving 10 as a parameter to kmalloc and read,write calls) but still I'm getting the last input character. Can any one post teh answer here...
--
Regards,
Vishwa
A really Helpful link
A really good and Helpful link for newbies!!!!
To start my career as programmer in device drivers
hi,
This one is good article.
I want to learn more on this, and can u help me get more info about device drivers.
Thanks,
Raghavendra
WOW A MASTERPIECE
Gud work by u.A gud guide for a layman in the fiels of device drivers
Heartly appreciated
problem with driver software
hello sir whhen i have compiled my sorce code then i face an error that "fops size is not known " pleee send me some information to remove this error
mu email id is erabhinandan@gmail.com
Linux extra-versioning problem and another useful link
Thank you for your excellent tutorial!
That's true that the first step is always the more hard to achieve, and guides like this really simplify the achievement of the basic know-how necessary to get real job done.
When I first tried the tutorial I get this error when trying to insmod my module nothing.ko:
insmod: error inserting nothing.ko: -1 Invalid module format
while dmesg gave me:
nothing: version magic '2.6.17.11.061003.eramil SMP mod_unload PENTIUM4 REGPARM gcc-4.1' should be '2.6.17.11.061003.eramil SMP mod_unload PENTIUM4 REGPARM gcc-4.0'
It was that I like to add a customized extra version to my kernel compiling it, while the extra version in the source tree Makefile was still ".11".
To fix this I changed manually the Makefile, updating the extra version line with the current linux extra version, then I started to compile with make (but I control-C-ed quite soon, after the compilation of the version.h file, that you can eventually change by hand).
Then, since I compiled the kernel with gcc-4.0 and I had installed the gcc-4.1 version, I changed the gcc symlink with:
sudo ln -sf /usr/bin/gcc-4.0 /usr/bin/gcc
Now the gcc symlink (used to compile the module) points to the same version of gcc used to compile the kernel: trick done!
Another useful link:
http://www.openaddict.com/documents/lkmpg/x30.html
HTH
Cheers
Compiling with Kernel Version 2.4.20-8
hi,
This is Priya here. I have installed Redhat Linux verion 9 on my system. Kernel version 2.4.20-8. Could I Please know how to compile and insert the modules given in this tutorial, with the associated makefiles.Please help me. My mail id :priyasophy_1982@yahoo.com
Reply
Its better if you use kernel 2.6.x.x.2.Because the Linux systems now supports 2.6 kernel and the interface for 2.6 is simple and totally different than 2.4.Mention the topic on which you are working.
If I have a knowldge about that i will surely help you.Do post ur queries on prem38_kamble @rediffmail.com
very nice work !!!!!!!!!!
I appreciate for the effort took for explaining device driver writing in step by step manner...
really great work...
Thank you,
Murali
thanks alot .............
thanks man .. .. nice tutorial
regards
SuLtAn
REALLY A GREAT HELP FOR
REALLY A GREAT HELP FOR STARTERS...
ARUN
Cannot unload module
Dear sir,
This is a very good tutorial you have here. It is very cool as it explains the fundamental really well.
I tried out the first 2 section of the tutorial but am stuck.
I have created the module nothing.ko and inserted it into the kernel.
I am able to see the module using lsmod
When I tried to rmmod, the system keeps giving me the following error:
ERROR: Removing 'nothing': Device or resource busy
My lsmod | grep nothing gives me
nothing 2688 0 [permanent]
Is there a way to unload this module
Very much appreciate your help
Thanks,
Alex
Not accurate article!
My comments:
To be complete tutorial it must be accurate. It is not so.
For example, memory driver part is completely hide extensions of files and creating makefile in case if you build module from multiply files.
I think it should be added directly in article or,as minimum, in comments.
d BEST
Thank you very much for posting such an astonish article for all..
God Bless all..
GOOD
Thank u for giving an easy to learn tutorial about device drivers..
U can also add some more details about functions which will be more helpful...
Very Good
The Tutorial help me lot
good article
As the title says,....
Simple to understand and grasp the important things.
Thanks a lot m8
George
NICE ONE
VERY NICE ARTICLE.
THANKS A LOT.
K.RAJASEKAR
good job
good job
Its the Best that I have come accross
It motivates a non-driver-writer to jump into the arena that is always thought to be only for the real techies.
Very well done
Really good tutorial on drivers. I challenge us to do the exercises, specifically a device that doesn't work yet.
Thanks for this important contribution!
Regards,
Help on Kernel Keyboard Driver
Hai everyone,
IN LINUX KERNEL VERSION-2.6.8-24 THE KEYBOARD DRIVER FILE KEYBOARD.C IS USED.I WOULD LIKE TO MODIFY THIS FILE SUCH THAT ON A TOGGLE KEY I WOULD LIKE TO READ DATA FROM A FILE.I USED SYSTEM CALLS LIKE OPEN,CLOSE,READ.BUT AN ERROR MESSAGE SAYING THAT THE HEADER FILE UNISTD.H INCLUDING THIS CALLS IS NOT AVAILABLE IS ENCOUNTERED.CAN ANY BODY HELP ME IN THIS CONTEXT.
After you've done that
After you've done that you could write a driver that prevents your caps-lock key from getting stuck.
hi
good job done
Only bit-1 lights up after module loads
First off, thanks for the great tutorial, Xavier.
I am trying to complete the LED section of the tutorial. I am running Ubuntu Server 6.10, kernel 2.6.17-10, and I removed lp, parport_pc, and parport. I have successfully compiled parlelport.ko and I can verify that the module has loaded with:
$ cat /proc/ioports
..
0378-0378 : parlelport
The circuit shows many lights blinking at boot time. After boot, bit-2 and bit-3 stay lit. They remain that way until the computer is rebooted -- or until the monitor goes to sleep. All lights go black while the monitor sleeps. The only response I can generate is that bit-1 lights after inserting parlelport.ko. It stays lit until the computer is rebooted.
The only thing that looks suspicious is this:
$:~/dev$ make -C /usr/src/linux-source-2.6.17 M=`pwd` modules
make: Entering directory `/usr/src/linux-source-2.6.17'
CC [M] /home/sam/dev/parlelport.o
/home/sam/dev/parlelport.c:31: warning: initialization from incompatible pointer type
..
Line 31 corresponds to:
write: parlelport_write
But my parlelport_write() is the same as the tutorial's.
Any pointers?
Thanks,
Sam
I have more or less the same
I have more or less the same issue.
after booting the LED is OFF but when I remove all parport related modules, the LED gets ON and the parlelport driver does not work. If I manage to avoid parport module at boot and insmod parlelport after boot, things seems OK (I can set On or Off the LED).
I guess the parport driver when manualy unloaded (rmmod) let the chipset in a state that prevent from outputting data from the port (may in input mode in place of output mode)
I tried to force the output mode (0x37A control reg) with no success
how did you remove lp, parport_pc, and parport
Hi!
How did you remove lp, parport_pc, and parport ? I think i need to do this becuase i will get a device or resource busy error.
Thanks,
Leneth
Very Well Explained
Fantastic Job. You have described the driver structure in simple and best manner.
Thanks.AJ
Damn useful !!! Well done
Damn useful !!! Well done buddy :-*
Good one.
Hello,
Really nice tutorial...it helped me a lot..Practical Egs are good..
Keep the good work going..
Excellent, Quick & Handy..,
This is really nice & handy tutorial.
Can this guy give similar tutorials for GCC,Shell Scripting..? It would be really good to have such tutorials..
Very Helpful!
A really handy overview!
write a kernel for linux
how we write a kernel for linux? what is code of this problem?
SIMPLE & COOL
The tutorial has been simple, I had no idea where to start with.
This has given me a good introduction to DD programming & kernel modules.
-Arjun
Compilation problem
I am using Fedora core 5. I could not compile the very first version of "nothing" with just licence line in it.
Here is what I got.
make -C /usr/src/linux/kernel M=`pwd` modules
make: Entering directory `/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686/kernel'
make: *** No rule to make target `modules'. Stop.
make: Leaving directory `/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686/kernel'
Is the procedure different for Fedora? Thanks in advance.
Great
Its really simple and informative.....
Good work
A really interesting tutorial. A little short but the main explanations are present.
Thanks.
KirgliZ
tutorial(device driver)
its really excellent....
amazing...
His presentation is too good and simple....
Yeah
Simply simple :)
Efficient work
Really good work.
Thank you so much!
You wrote so clearly and easily to understand.
great tutorial for newbies
This tutorial gives great confidence to develop device driver for someone who is neo in this field. Great job !!!!!!!!!!
Great job.
I really like it and it's written in a very nice way, thanks! :)
Great Work Sir. Its truly
Great Work Sir. Its truly helpful for begineers like us. We hope to have some more from you.
Pretty Good and Easy to Understand
Dear sir...
its really very useful.can u elaborate the drivers on keyboard also.
Very interesting. Have never
Very interesting. Have never really read much about driver development. Nice work.
Printable version?
Is there a printable version of this article? I don't find a link to one...
Thanks.
There is no such thing as
There is no such thing as "quick" and "easy" when it comes to writing drivers. Thank you :)
P.S: great tutorial
Debian etch, is now the
Debian etch, is now the stable release version.
Similar Tutorial for NT
I can write a similar tutorial using LEDs if anyone is interested for DOS.
I am interested in Windows NT, please give us similar simple tutotrial for Windows NT device drivers.
Great Work.
Ja
Great work.
I am really impressed the way author has presented this wonderful article..he has explained in such a simple and nice manner..
Great going..
so happy hacking..
Submitted by Anonymous
Submitted by Anonymous visitor (not verified) on Thu, 2007-05-10 12:33.
I can write a similar tutorial using LEDs if anyone is interested for DOS.
I am interested in Windows NT, please give us similar simple tutotrial for Windows NT device drivers.
Great Work.
This is FREE SOFTWARE Magazine
I'm afraid that if you are interested in Windows NT you'll have to find another magazine to make your requests to. You won't be seeing any Windows NT tutorials on this site unless they tell you how to wipe it from your computer and replace it with a nice GNU/Linux replacement.
It's amazing that you are smart enough to understand this article but yet you can't work out that no one here would want to write NT tutorials.
Gud tutorial ,keep the good work going!
Hi,
Its a good tutorial, I must say. You have gracefully handled this linux device driver tutorial. It would be a great benefit to newbies ,if u can come up with futher advance topics of kernel programming in your own style of writing.
French tutorial
Amazing tutorial ! It made me want to develop my own driver!
For French speaking people, you can find another tutorial here: http://broux.developpez.com/articles/c/driver-c-linux/
Excellent article
I only wish there were more tutorials like that...
Tip-Top
I quote above comment, an excellent article!
Congratulations and ... Thanks! :-)
Very nice tutorial that gets you up and running quickly
The tutorial provides a nice intro to really mastering your Linux machine!
Its
Its fantastic...!!!!!!!!!!!!!
HELP needed about device driver writing
hi,
this ia a excellent tutorial, i am using rhel5 2.6.18-8.el5
i like to learn this device driver programming but i am gating
error: linux/module.h: No such file or directory
so how to get this file. if i download this file will it work?
plz inform me princei007@yahoo.com
I'm having the same problem
I'm having the same problem with ubuntu
Good tutorial
Good job.
I have searched and read many,
Atlast I found this tutorial, its amazingly easy to get the picture of writing a driver.
thanks
by
karthi
outb is not working
I wrote a small application to test the parallel port and whatever data I am writting, it is getting displayed on LED array. However when I tried to use outb from driver, it is not working. I have removed lp, parport_pc, parport modules. I put some debug messages and it is showing outb is executing properly. Even /proc/ioports is showing ports are allocated for me. I am using Fedora v6. Do you have any clue on this?
help needed
Hi
help me for writng USB device driver. from where i start my work.
thanks
Good article!
Good starting point for beginners. Thank you!
Is the code available?
I'm interested both in the source code (C, Makefile) and in the article itself.
i was running away from
i was running away from device drivers from last 3 weeks but this tutorial made it so easy. withing 2 hrs i had the idea wat dey r nd hw to make dem work..excellent tutorial. great work.thanx a lot
How I got it working
I had some trouble getting the parlelport driver working on my slackware 12 2.6.21.
The problem was that ever time I boot my machine the pin 4 led would not shut off, and
all other leds could not be turned on or off by echo or lights.o. All of this was caused by modules lp,parport,and parport_pc. The solution was to comment out the lines that load the modules in /etc/rc.d/rc.modules-[kernel version here]. There pretty hard
to miss. Add the modules to /etc/modprobe.d/blacklist did not help though I did that t and it may be part of the solution.
P.S. I love this tutorial, you wrote that it was originally written in Spanish, If English is not your first language I can't tell.
The simplest, compact
The simplest, compact tutorial to anyone to jump start on the driver.
Best tutuorial
This is the best tutorial I've read on the web. And I'm not speaking only of linux device driver tutorials.
Thanks!!
Post new comment