2012年2月21日 星期二

Hello, World! 使用 /dev/hello_world

在/dev目錄下的一個設備文件/dev/hello 實現 Hello,world!

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <asm/uaccess.h>

static ssize_t hello_read(struct file * file, char * buf, size_t count, loff_t *ppos)
{
    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 (count < 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 (*ppos != 0)
        return 0;
    /*
    * Besides copying the string to the user provided buffer,
    * this function also checks that the user has permission to
    * write to the buffer, that it is mapped, etc.
    */
    if (copy_to_user(buf, hello_str, len))
        return -EINVAL;
    /*
    * Tell the user how much data we wrote.
    */
    *ppos = len;
    return len;
}

static const struct file_operations hello_fops = {
    .owner        = THIS_MODULE,
    .read        = hello_read,
};

static struct miscdevice hello_dev = {
    /*
    * We don't care what minor number we end up with, so tell the
    * kernel to just pick one.
    */
    MISC_DYNAMIC_MINOR,
    /*
    * Name ourselves /dev/hello.
    */
    "hello",
    /*
    * What functions to call when a program performs file
    * operations on the device.
    */
    &hello_fops
};

static int __init hello_init(void){
    int ret;
    /*
    * Create the "hello" device in the /sys/class/misc directory.
    * Udev will automatically create the /dev/hello device using
    * the default rules.
    */
    ret = misc_register(&hello_dev);
    if (ret)
        printk(KERN_INFO "Unable to register Hello\n");
    return ret;
}

static void __exit
hello_exit(void){
    misc_deregister(&hello_dev);
}
module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Valerie Henson val@nmt.edu>");
MODULE_DESCRIPTION("Hello, world! minimal module");
MODULE_VERSION("dev");

cat /dev/hello

ref:
CoolShell

=========================

Makefile 順便

obj-m       += hello.o
KVERSION := $(shell uname -r)
all:
    $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
    $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean


。沒有 /lib/modules/`uname -r`/build 的人: ( debian )
  aptitude install linux-headers-`uname -r`

沒有留言:

張貼留言