You probably don't need it, but for future generations ;) There is a free book on Linux drivers development on LWN, which involves writing kernel modules. It is fairly old, as had been written for kernel 2.6, but these things didn't change much. Linux Device Drivers, Third Edition: lwn.net/Kernel/LDD3/
Hope you can do more on Operating System Programming as compared to web dev/machine learning, the resources on OS is scarce ! And you did great job on teaching it!!
There's a book (somewhat outdated now) called just "Linux Kernel Development" by O'Reilly. Also "Linux Device Drivers" by someone else, can't remember. Really creative names, I know.
Correctly me if I’m wrong, but I’m pretty sure you will have a buffer overflow if the user only supplies a small buffer. Always check the length of your destination buffers people!
Recent versions of the kernel won't build the module if it's missing the MODULE_LICENSE tag. You can do that by adding it after calling the module_init/exit registration functions: MODULE_LICENSE("GPL");
good video. I anticipated you'd access the module via cat /dev/rickroll, but I expected that just registering the module would have automatically created the entry in /dev
I thought the same thing. Registering shows the new device in /proc/devices. But when I do ls -l /dev it doesn't show up. My guess is the device is created but the directory entry that points to this device is not created. Mknod helps to create that directory/file which is managed by the device we created and registered
Studying for linux+ I keep a running notebook in evernote. I linked to this video as an example of creating and managing modules. I'm going to provide my notebook stack internally for the other guys who want to study for the linux+ exam. Though you might like to know that future generations of linux admins learned kernel modules by rickrolling their buddies
message_len should be size_t as it contains a length. Of course this shouldn't cause any problem as strlen() never returns a value lower than 0 and any further operation is done with the variable, but still, it's nice to get the beginners used to use the correct data types. Great video btw :D
Thank you for sharing this knowledge; Very helpful. I am hoping to learning kernel module programming - never had the prior opportunity to; Your video will motivate me in that direction. Thanks again. God Bless.
maybe you should compose a , say, main.c program, to show how to call the character-device through syscall, like read, write, and then to demonstrate the relationship between kernel module and user space process.
You can't normally close the file, but you can use the *offset field to ensure it looks like a normal file. Closing should be handled by the kernel based on the system call itself. Take a look into the source code of the close() system call to see what exactly it does if you do want to close the file yourself.
Could you also use psuedo devices to create a com port to replace tty to ease serial communication from a device to program running on WINE? Very informative video, even though I'd never build that lol
I had just learned that the '&&' only executes cmd2 IF cmd1 succeeds. So I have been doing "make clean && make". Is there a problem with that ? My thought would be that it is going to make sure dir is cleaned before running "make". p.s. Trying to follow the video leaves out the '"%d", major ' so I was having a lot of problems until I viewed the repo.
Thank you very much, this is exactly what I was looking for, clear information, I will subscribe and like... but I have a doubt, how can you know which kernel module goes to which device in /dev?
I don't actually know, but I suspect that the function used to copy into the userspace buffer checks for this and would reflect such an error in its return value
Did you paste multiple things sequentially one at a time? It didn't look like the video was cut at 3:08 and 3:14 when I noticed this. If so, how do you do this in Linux? I've done this before with Autohotkey in Windows by writing to a text file and pasting one line at a time. I'm curious to see how you did this in Linux if you did.
Hi Engineers! I have a doubt if anyone could help me... I am trying to get to know how LKM's Work. I Successfully completed an installation with the insmod command, but when I reboot i do not find my module loaded. ( tried to add the name of the module installed into /etc/modules and got an error while loading the raspberry where it is installed . Any hint ? Best regards to everybody!
Would love to see you do the same project on an un-rooted Android device running newer OS. I was having error: "insmod: failed to load test.ko: Exec format error", loaded just fine on Ubuntu -- I'm guessing this example is not for Android.
9:08 Shouldn't you only copy min(len, message_len) characters? Otherwise you might write over the bounds of the buffer. 10:35 I guess it's more effective if the device is not named "rickroll". And can you do the equivalent of this mknod call also from your init function, so it stays over restarts of the system?
Hey Engineer Man, do you have any info on how to install the module from kernel 5.4 ? 'insmod' return 'Operation not permitted', apparently due to the new lockdown feature...
What you are referring to as Linux, is in fact, GNU/‘Windows Subsystem for Linux’, or as I've recently taken to calling it, GNU plus Windows. Linux is not an operating system unto itself, but rather another free component of a fully functioning GNU system.
@Lorem Ipsum I read your reply, and @Tobias SN is correct. He was talking about two things: Windows Subsystem for Linux - the official name Microsoft/Ubuntu use for this component of Windows, and Linux - the kernel, specifically (not the operating system frequently called "Linux" incorrectly, as you have pointed out) Neither correction you made was appropriate, in this case. People do make that mistake, but that isn't what happened here. Then, you just copied and pasted the same reply again, making it clear you didn't real his reply (or, at least not carefully enough). In fact, I'm not even certain you aren't a bot. I guess we'll find out if you reply.
bro how to rectify the error if the compiler differs from the one used in the kernal,since my program is not working as like you plz someone explain how to get out of this my compiler showing gcc 11.3 and kernal showing gcc 11.2
Despite being a great meme, also ironically one of the best Linux kernel development videos out there
As a retired software engineer, starting with IBM 370 systems, I find your videos to be remarkably interesting and educational. Very much appreciated.
getting into low level? it'll be crazy if you reply to a 2yr old comment
1:43 "Kernel Space Program" my favorite video game... Oh wait, it's Kerbal Space Program? Crap
That would be interesting, the system crashing along with your ship.
Awesome introduction to kernel module development! Show me more! 😁
You probably don't need it, but for future generations ;) There is a free book on Linux drivers development on LWN, which involves writing kernel modules. It is fairly old, as had been written for kernel 2.6, but these things didn't change much. Linux Device Drivers, Third Edition: lwn.net/Kernel/LDD3/
Linux drivers are pretty easy to compile and write as long as you have a basic understanding of what your doing
Hope you can do more on Operating System Programming as compared to web dev/machine learning, the resources on OS is scarce ! And you did great job on teaching it!!
There's a book (somewhat outdated now) called just "Linux Kernel Development" by O'Reilly. Also "Linux Device Drivers" by someone else, can't remember.
Really creative names, I know.
Correctly me if I’m wrong, but I’m pretty sure you will have a buffer overflow if the user only supplies a small buffer.
Always check the length of your destination buffers people!
For anyone running into the module license error, insert this under the header for your .c file:
MODULE_LICENSE("Dual BSD/GPL");
Thanks! Solved the problem for me.
Me yesterday: researching kernel module & device file.
Me today: Listening to rickroll in medieval style.
UA-cam algorithm today:
Recent versions of the kernel won't build the module if it's missing the MODULE_LICENSE tag. You can do that by adding it after calling the module_init/exit registration functions:
MODULE_LICENSE("GPL");
this comment should be pinned
I'm glad I found my way back here over a year later. Very cool stuff.
Just the right amount of detail in your videos brother : ]
Reading LPIC-1 book and got to the part with modules and this video taught me a lot of things on how this works. Thanks
good video. I anticipated you'd access the module via cat /dev/rickroll, but I expected that just registering the module would have automatically created the entry in /dev
I thought the same thing. Registering shows the new device in /proc/devices. But when I do ls -l /dev it doesn't show up. My guess is the device is created but the directory entry that points to this device is not created. Mknod helps to create that directory/file which is managed by the device we created and registered
just by seeing word "Linux" in title, liked the video and now watching.. more Linux videos please!
You can make a virus, that opens Never Gonna Give You Up, as soon as browser is closed.
Nice video :) kernel is always difficult to explain, you did it perfectly
I have been unable to comprehend what you did.. but I know what that rickroll can be used for.. brilliant..
I could not understand this thing by reading a book for four days but your video made it very clear. Thanks dude.
This is so valuable, there is way too little material on LKM's
Great video, I struggled with creating a kernel module before. Wish the video had been there then !
This was extremely informative. Thank you
Great! Instead of "Sorry, rickroll is real only" it should say "You know the rules and so do I!"
Brb installing linux
"...🎶 never gonna let you down...🎶 ... never gonna panick ...🎶 unless you create a buffer overflow...🎶"
Thanks, what a great video to quickly explain how to start writing kernel modules.
I didn't know that making kernel modules was this simple. Nonetheless, I learned something new today and enjoyed it 👍
Studying for linux+ I keep a running notebook in evernote. I linked to this video as an example of creating and managing modules. I'm going to provide my notebook stack internally for the other guys who want to study for the linux+ exam. Though you might like to know that future generations of linux admins learned kernel modules by rickrolling their buddies
More Linux dev stuff pls! It was awesome
message_len should be size_t as it contains a length. Of course this shouldn't cause any problem as strlen() never returns a value lower than 0 and any further operation is done with the variable, but still, it's nice to get the beginners used to use the correct data types. Great video btw :D
Came for the meme, stayed for the knowledge
Thank you so much. I was able to get this working on Raspberry Pi 3 b VM under Qemu! This is so cool!
Yo this video is amazing dude. Finally understand how these modules work! And with a choice example too 👍👍
Thank you for sharing this knowledge; Very helpful. I am hoping to learning kernel module programming - never had the prior opportunity to; Your video will motivate me in that direction. Thanks again. God Bless.
maybe you should compose a , say, main.c program, to show how to call the character-device through syscall, like read, write, and then to demonstrate the relationship between kernel module and user space process.
Awsome introduction! Thanks a lot!
Really high quality video. Thanks!
How to make it to write only once and then close it self? Call dev_release inside dev_read?
You can't normally close the file, but you can use the *offset field to ensure it looks like a normal file. Closing should be handled by the kernel based on the system call itself. Take a look into the source code of the close() system call to see what exactly it does if you do want to close the file yourself.
Great introduction into kernel modules.
I wish that A: I was as smart as this guy & B: Wish that I could type as fast and well!!
Love your work, keep these videos coming! Haha!
Well. Linus always says don't break userspace. Your rickroll can be exited with Ctrl - C, so you're good.
Everyone commenting this video is a boss...almost Everything he says are going over my head..cant understand anything as a noob
Big Chungus OS
Great explanation, thanks! Btw. would it be a good idea to register the device at the time of loading of the module?
This video deserves way more views
Nice video man, really interesting! Keep doing these
this is what computers were created to do
Thanks for a short and clear presentation. Do you have one on DKMS
We need engineer man cap merch
Here you go :)www.amazon.com/Falari-Classic-Baseball-Cotton-Adjustable/dp/B010RDCIM2/ref=sr_1_2
Thx for helping me with custom boot.img creation
Could you also use psuedo devices to create a com port to replace tty to ease serial communication from a device to program running on WINE? Very informative video, even though I'd never build that lol
KERN_LOG undeclared
That video is kinda wholesome.
Awesome video!
I have no idea what I’m watching but I like it
Awesome! You made it look really simple, thank you!
This is simply amazing.. Thanks Eng. Man !!!
Dude, i can't get over of how you look exactly like one of Half-Life 2 civilian/resistance NPCs.
And.. take that as a compliment, i guess
Lol, now I'm going to be reminded of this for every video.
This video helps me a lot, thx!
Love your content. Just subscribed. I just found atom . Any chance of an overview of it?
Nicely presented video
Thx for the video.
Your link to github repo not pointed to the correct subdirectory (subproject).
Thanks for pointing that out. I just corrected it.
@@EngineerMan You're welcome :)
Strange, how come when I run "cat rickroll", it doesn't trigger the "dev_open" method UNTIL I hit control-c. Any idea?
very useful, ill be sure to use it in the future
I had just learned that the '&&' only executes cmd2 IF cmd1 succeeds. So I have been doing "make clean && make". Is there a problem with that ? My thought would be that it is going to make sure dir is cleaned before running "make". p.s. Trying to follow the video leaves out the '"%d", major ' so I was having a lot of problems until I viewed the repo.
Do you age..?
Thank you very much, this is exactly what I was looking for, clear information, I will subscribe and like... but I have a doubt, how can you know which kernel module goes to which device in /dev?
Thanks for the quality content !!!
Can you make a video on removing rootkits using rootkit hunter and how to remove the false positive warnings
*We gotta learn about what is a rickroll
I suspect that this code can overflow the userspace buffer, in case len < message_len. Do I miss something here?
I don't actually know, but I suspect that the function used to copy into the userspace buffer checks for this and would reflect such an error in its return value
Amazing content, thanks a lot!
Thanks for sharing knowledge
Thanks dude ! this is again a very good lesson !
oooh so KERN_LOG should be switched to KERN_INFO u didnt mention that ;)
Notice how that changed magically mid-video!
Did you paste multiple things sequentially one at a time? It didn't look like the video was cut at 3:08 and 3:14 when I noticed this. If so, how do you do this in Linux? I've done this before with Autohotkey in Windows by writing to a text file and pasting one line at a time. I'm curious to see how you did this in Linux if you did.
7:44 Copy in it is shamocha
Hi Engineers! I have a doubt if anyone could help me... I am trying to get to know how LKM's Work. I Successfully completed an installation with the insmod command, but when I reboot i do not find my module loaded. ( tried to add the name of the module installed into /etc/modules and got an error while loading the raspberry where it is installed . Any hint ?
Best regards to everybody!
Hey man! What font are you using on the terminal?
Mad scientist laugh...
Would love to see you do the same project on an un-rooted Android device running newer OS. I was having error: "insmod: failed to load test.ko: Exec format error", loaded just fine on Ubuntu -- I'm guessing this example is not for Android.
grate video really.... grate informations... amazing thanks
9:08 Shouldn't you only copy min(len, message_len) characters? Otherwise you might write over the bounds of the buffer.
10:35 I guess it's more effective if the device is not named "rickroll". And can you do the equivalent of this mknod call also from your init function, so it stays over restarts of the system?
name it urandom
Hey Engineer Man, do you have any info on how to install the module from kernel 5.4 ? 'insmod' return 'Operation not permitted', apparently due to the new lockdown feature...
Use sudo. Works fine on 5.6.
Does this work on Windows 10 Linux subsystem with Wine?
I use Arch btw.
What you are referring to as Linux, is in fact, GNU/‘Windows Subsystem for Linux’, or as I've recently taken to calling it, GNU plus Windows. Linux is not an operating system unto itself, but rather another free component of a fully functioning GNU system.
No. The Windows Subsystem for Linux doesn't use the Linux kernel, but rather it converts kernel calls to Win32 calls.
Lorem Ipsum If you read my comment properly, I said “the Linux kernel”, indicating that I’m talking about Linux itself, not GNU/Linux.
Lorem Ipsum Did you even read my reply?
@Lorem Ipsum I read your reply, and @Tobias SN is correct. He was talking about two things:
Windows Subsystem for Linux - the official name Microsoft/Ubuntu use for this component of Windows, and
Linux - the kernel, specifically (not the operating system frequently called "Linux" incorrectly, as you have pointed out)
Neither correction you made was appropriate, in this case. People do make that mistake, but that isn't what happened here. Then, you just copied and pasted the same reply again, making it clear you didn't real his reply (or, at least not carefully enough). In fact, I'm not even certain you aren't a bot. I guess we'll find out if you reply.
bro how to rectify the error if the compiler differs from the one used in the kernal,since my program is not working as like you
plz someone explain how to get out of this
my compiler showing gcc 11.3 and kernal showing gcc 11.2
Im having a problem im missing linux/init.h file but have all others
I have no reason to do this.
I don't need a reason to do this.
Link in the description points to the code for 048.
Thanks for pointing that out. I just corrected it.
Hey, great vid. Could you please make a tutorial of running an ssh server on Linux?
what distro are you running?
Very cool. Thanks.
x86_64 processors have negative access rings fyi
whats your github handle? And do you have the source code of your videos on github?
This ring diagram is not correct, drivers run in ring 0. Rings 1 and 2 are not used by Linux.
You could make it stream the video, so that you can play it with mplayer or other similar app
actually, I just curious and click randomly
edit: it's 3am
register_chrdev is an outdated function in Linux kernel module programming.
10:40 When you're making the node with mknod, why aren't you using the c version after a successfull call to init, and removing on unload?
I think some code is missing, the code in the tutorial does not print the major number shown at min 9:59
Great video
Awesome!
because.... Linux