Skip to main content

Linux kernel module to add a proc file entry

A look at the proc_dir_entry structure

struct proc_dir_entry {
unsigned int low_ino;
unsigned short namelen;
const char *name; // name of our module
mode_t mode; // permissions ,who can read and write to it
nlink_t nlink;
uid_t uid;
gid_t gid;
loff_t size;
const struct inode_operations *proc_iops;
const struct file_operations *proc_fops;
struct proc_dir_entry *next, *parent, *subdir;
void *data;
read_proc_t *read_proc; // pointer to the function to be called when we
do a read to the proc entry
write_proc_t *write_proc;// pointer to the function to be called when we
do a write to the proc entry
atomic_t count;
int pde_users;
spinlock_t pde_unload_lock;
struct completion *pde_unload_completion;
struct list_head pde_openers;
};

Now let us write a LKM to add a proc entry . When you write to our proc entry it stores the msg you write and when you read from it , it displays the msg you
wrote to it CODE for the module:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SAnandNarayan.com");
MODULE_DESCRIPTION("LSP assignment");
static char our_buf[256];// our buffer to store the msg
int buf_read(char *buf, char **start, off_t offset, int
count, int *eof, void *data)
{
int len;
len = snprintf(buf, count, "%s", our_buf);
/*
when you read from the proc entry the snprintf function
prints the buffers msg to the user space
*/
return len;
}
static int buf_write(struct file *file, const char *buf,
unsigned long count, void *data)
{
if(count > 255)
count = 255; // reads only the first 255 bytes
copy_from_user(our_buf, buf, count);
/*copies from the user space buffer to our kernel space
buffer*/
our_buf[count] = '\0';
return count;
}
int __init start_module(void)
{
struct proc_dir_entry *de =
create_proc_entry("anand_lsp", 0666, 0);
//creates the proc entry and returns the pointer to the proc
//entry
de->read_proc = buf_read;
de->write_proc = buf_write;
// assigns the functions to be called for the respective
operations
sprintf(our_buf, "hello");
// initializing our buffer
return 0 ;
}
void __exit exit_module(void)
{
//cleaning up the proc entry
remove_proc_entry("anand_lsp", NULL);
}
module_init(start_module);
module_exit(exit_module);

Thanks to S Anand Narayanan for this post. Visit his website http://www.sanandnarayan.com/

Comments

  1. this is great site and i appreciate it but i feel its a purly commercial effort to make the site famous and get more and more hits. even the marks are posted on the site and the only reason i see behind that is to get more and more hits so that more expansive advertisements can be put onto the site.
    Thanks and regards,
    Kalyan Chandra

    ReplyDelete
  2. this is great site and i appreciate it but i feel its a purly commercial effort to make the site famous and get more and more hits. even the marks are posted on the site and the only reason i see behind that is to get more and more hits so that more expansive advertisements can be put onto the site.
    Hits
    23111
    its how u got it.
    Regards,
    Kalyan Chandra

    ReplyDelete
  3. How do you write to /proc/file_name from the device driver? What function can be used to write to /proc file from the char driver code? Can somebody help me please

    ReplyDelete

Post a Comment

Popular posts from this blog

Installing ns3 in Ubuntu 22.04 | Complete Instructions

In this post, we are going to see how to install ns-3.36.1 in Ubuntu 22.04. You can follow the video for complete details Tools used in this simulation: NS3 version ns-3.36.1  OS Used: Ubuntu 22.04 LTS Installation of NS3 (ns-3.36.1) There are some changes in the ns3 installation procedure and the dependencies. So open a terminal and issue the following commands Step 1:  Prerequisites $ sudo apt update In the following packages, all the required dependencies are taken care and you can install all these packages for the complete use of ns3. $ sudo apt install g++ python3 python3-dev pkg-config sqlite3 cmake python3-setuptools git qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3 openmpi-bin openmpi-common openmpi-doc libopenmpi-dev autoconf cvs bzr unrar gsl-bin libgsl-dev libgslcblas0 wireshark tcpdump sqlite sqlite3 libsqlite3-dev  libxml2 libxml2-dev libc6-dev libc6-dev-i386 libc...

Installation of NS2 (ns-2.35) in Ubuntu 20.04

Installation of NS2 (ns-2.35) in Ubuntu 20.04 LTS Step 1: Install the basic libraries like      $] sudo apt install build-essential autoconf automake libxmu-dev Step 2: install gcc-4.8 and g++-4.8 open the file using sudo mode $] sudo nano /etc/apt/sources.list Include the following line deb http://in.archive.ubuntu.com/ubuntu bionic main universe $] sudo apt update $] sudo apt install gcc-4.8 g++-4.8 Step 3:  Unzip the ns2 packages to home folder $] tar zxvf ns-allinone-2.35.tar.gz $] cd ns-allinone-2.35/ns-2.35 Modify the following make files. ~ns-2.35/Makefile.in Change @CC@ to gcc-4.8 change @CXX@ to g++-4.8 ~nam-1.15/Makefile.in ~xgraph-12.2/Makefile.in ~otcl-1.14/Makefile.in Change in all places  @CC@ to gcc-4.8 @CPP@ or @CXX@ to g++-4.8 open the file: ~ns-2.35/linkstate/ls.h Change at the Line no 137  void eraseAll() { erase(baseMap::begin(), baseMap::end()); } to This void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); } All changes ...

Installation of NS2 in Ubuntu 22.04 | NS2 Tutorial 2

NS-2.35 installation in Ubuntu 22.04 This post shows how to install ns-2.35 in Ubuntu 22.04 Operating System Since ns-2.35 is too old, it needs the following packages gcc-4.8 g++-4.8 gawk and some more libraries Follow the video for more instructions So, here are the steps to install this software: To download and extract the ns2 software Download the software from the following link http://sourceforge.net/projects/nsnam/files/allinone/ns-allinone-2.35/ns-allinone-2.35.tar.gz/download Extract it to home folder and in my case its /home/pradeepkumar (I recommend to install it under your home folder) $ tar zxvf ns-allinone-2.35.tar.gz or Right click over the file and click extract here and select the home folder. $ sudo apt update $ sudo apt install build-essential autoconf automake libxmu-dev gawk To install gcc-4.8 and g++-4.8 $ sudo gedit /etc/apt/sources.list make an entry in the above file deb http://in.archive.ubuntu.com/ubuntu/ bionic main universe $ sudo apt update Since, it...