• LINUX驱动版本的hello world(转)


    转载自 jjzhang166
    最终编辑 jjzhang166

    http://hi.baidu.com/ah%5F%5Ffu/blog/item/57b76201e27095de267fb5d4.html

    终于下决心好好学习LINUX内核和驱动开发了,不怕千万人耻笑,勇敢将自己的学习过程写出来:

    1、关于目录
        /lib/modules/2.6.9-42.ELsmp/build/   这个是内核源码所在的目录
        一般使用这样的命令进入这个目录:cd /lib/modules/$(uname -r)/build/
       这个目录实际上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686

    2、编译驱动所使用的makefile
        实际上编译驱动的时候是使用预先提供的一个makefile的,位置在:
    /lib/modules/$(uname -r)/build/Makefile
        注意:M是大写的

    3、网上抄录的Linux驱动Hello world的源码:
    // hello.c
    #include <linux/init.h>
    #include <linux/module.h>

    MODULE_LICENSE("Dual BSD/GPL");

    static int hello_init(void)
    {
        printk(KERN_ALERT "hello world!\n");
        return 0;
    }

    static void hello_exit(void)
    {
        printk(KERN_ALERT "goodbye!\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);

    4、写个makefile来编译这个驱动:(版本一,最简单的)
    #下面这行是文件Makefile的内容,注意M是大写的
    obj-m := hello.o

    把hello.c和Makefile保存在同一目录,然后执行:
    make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
    这样驱动就编译好了,成果是hello.ko文件。
    注意:makefile一定要写成Makefile,如果写成makefile就编译不过。(折腾啊,就这一步耗了N多时间)

    5、再写另一种Makefile:(版本二:最省事的)
    #以下是Makefile文件的内容
    obj-m := hello.o
    KERNEL_DIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    all:
        make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
    clean:
        rm *.o *.ko

    然后执行:make就编译成功了,命令行不再加参数,很省事。
    注意:all: 和clean:下面的行,前面是一个TAB键

    6、加载驱动:
    执行
    insmod ./hello.ko
    屏幕上没反应。(因为我是在WINDOWS上用远程终端连上去的嘛)
    OK,先让时光倒流,回到加载驱动以前,先另开一个窗口,执行:
    tail -f /var/log/message
    然后在原来的窗口里执行:
    insmod ./hello.ko
    哈哈,/var/log/message文件里面看见了盼望已久的hello world!

    7、查看驱动:
    lsmod   看见 hello这个驱动在其中

    8、卸载驱动:
    rmmod hello 
    看见/var/log/message里显示了goodbye

    附录为通过编译的helloworld程序

    hello.c

    01 #include <linux/init.h>
    02  
    03 #include <linux/module.h>
    04  
    05  
    06  
    07 static int hello_init(void)
    08  
    09 {
    10  
    11     printk(KERN_INFO " Hello World enter\n");
    12  
    13     return 0;
    14  
    15 }
    16  
    17  
    18  
    19 static void hello_exit(void)
    20  
    21 {
    22  
    23     printk(KERN_INFO " Hello World exit\n ");
    24  
    25 }
    26  
    27  
    28  
    29 module_init(hello_init);
    30  
    31 module_exit(hello_exit);
    32  
    33  
    34  
    35 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
    36  
    37 MODULE_LICENSE("Dual BSD/GPL");
    38  
    39 MODULE_DESCRIPTION("A simple Hello World Module");
    40  
    41 MODULE_ALIAS("a simplest module");

    Makefile

    01 KVERS = $(shell uname -r)
    02  
    03 # Kernel modules
    04 obj-m += hello.o
    05  
    06 # Specify flags for the module compilation.
    07 #EXTRA_CFLAGS=-g -O0
    08  
    09 build: kernel_modules
    10  
    11 kernel_modules:
    12     make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
    13  
    14 clean:
    15     make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
  • 相关阅读:
    闭包的一个经典例子
    手机归属地查询API
    安卓模拟器导入通讯录
    使用RazorGenerator实现项目模块分离
    .met mvc 一种判断是否已登录的方式
    stl 空间配置器理解
    STL 生成全排列
    KMP算法理解
    解决八皇后问题,递归与非递归方式两种
    获取第K大的数
  • 原文地址:https://www.cnblogs.com/myitm/p/2225341.html
Copyright © 2020-2023  润新知