文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Linux Kernel(内核分析)----驱动学习 写入字符信息

Linux Kernel(内核分析)----驱动学习 写入字符信息

时间:2011-05-11  来源:shixinzhu

  上次介绍了最简单的 hello 模块。通常,我们需要将 用户空间和内核空间进行通信。最简单和最常用的方式是 通过 /proc 这个文件系统。 /proc 是一个伪文件系统。它读取文件里面的信息并通过 内核返回信息,并且,它还可以还可以向这个文件中写信息.当然,这得益于内核。

  这次,我们用 /proc/hello_world 这个文件作为 user-kernel 通信的桥梁。

/*
 * "Hello, world!" minimal kernel module - /proc version
 * shixinzhu <[email protected]>
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>

/*
 * Write "Hello, world!" to the buffer passed through the /proc file.
 */

static int
hello_read_proc(char *buffer, char **start, off_t offset, int size, int *eof,
  void *data)
{
 char *hello_str = "Hello, world!\n";
 int len = strlen(hello_str); /* Don't include the null byte. */
 /*
  * We only support reading the whole string at once.
  */
 if (size < len)
  return -EINVAL;
 /*
  * If file position is non-zero, then assume the string has
  * been read and indicate there is no more data to be read.
  */
 if (offset != 0)
  return 0;
 /*
  * We know the buffer is big enough to hold the string.
  */
 strcpy(buffer, hello_str);
 /*
  * Signal EOF.
  */
 *eof = 1;

 return len;

}

static int __init
hello_init(void)
{
 /*
  * Create an entry in /proc named "hello_world" that calls
  * hello_read_proc() when the file is read.
  */
 if (create_proc_read_entry("hello_world", 0, NULL, hello_read_proc,
        NULL) == 0) {
  printk(KERN_ERR
         "Unable to register \"Hello, world!\" proc file\n");
  return -ENOMEM;
 }

 return 0;
}

module_init(hello_init);

static void __exit
hello_exit(void)
{
 remove_proc_entry("hello_world", NULL);
}

module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("shixinzhu <[email protected]>");
MODULE_DESCRIPTION("\"Hello, world!\" minimal module");
MODULE_VERSION("proc");

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载