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>
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
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
de->read_proc = buf_read;
de->write_proc = buf_write;
// assigns the functions to be called for the respective
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);

Thanks to S Anand Narayanan for this post. Visit his website