zoukankan      html  css  js  c++  java
  • 【转】第一个Linux内核驱动程序

    原文网址:http://blog.csdn.net/nexttake/article/details/8181008

    刚看 O’REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。

    先查看自己OS使用的内核版本
    shana@shana:~$ uname -r
    2.6.22-14-generic           /*  这是我显示的结果 */
    如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)
    shana@shana:/usr/src$ ls
    linux-headers-2.6.22-14
    linux-headers-2.6.22-14-generic
    linux-source-2.6.22                     /*这个就是解压后的源码目录 */
    linux-source-2.6.22.tar.bz2         /*  这是我下的源码 包 */
    shana@shana:/usr/src$ 
    如果没有源码。(一般ubuntu 都没有吧)
    查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)
    shana@shana:/usr/src$ apt-cache search linux-source
    linux-source - Linux kernel source with Ubuntu patches
    xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
    linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches
    shana@shana:/usr/src$ 
    我选择了   linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches   这个~
    然后 install 之
    shana@shana:/usr/src$sudo  apt-get install linux-source-2.6.22 (相当于下载这个版本的内核源码)
    下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

    可以使用apt-get purgelinux-source-2.6.22 卸载。
    注意 已经切换到超级用户模式
    root@shana:/usr/src#sudo tar jxvf linux-source-2.6.20.tar.bz2
    解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    进入该目录
    开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)
    root@shana:/usr/src/linux-source-2.6.22# make oldconfig或者 make defconfig
    当然你也可以使用 自己喜欢的配置方式 如  menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。
    完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。
    shana@shana:/usr/src/linux-source-2.6.22$ make
    shana@shana:/usr/src/linux-source-2.6.22$  make bzImage
    当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。
    然后 :
    root@shana:/usr/src/linux-source-2.6.22#make modules                /*   编译 模块 */
    root@shana:/usr/src/linux-source-2.6.22#make modules_install  /* 安装 模块 */
    执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/
    。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。
    至此 内核树就建立啦  原来不是很难.....

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    写一个 最简单 最没用的驱动吧
    我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile
    //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, cruel world\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);
    程序我就不解释了……
    Makefile  文件

    [html] view plaincopy
     
    1. obj-m := hello.o  
    2. KERNELDIR := /lib/modules/2.6.38-8-generic/build/  
    3. PWD := $(shell pwd)  
    4. modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
    5. modules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install  


    其实如果使用这个命令编译,Makefile一行即可

    [html] view plaincopy
     
    1. obj-m := hello.o  


    shana@shana:~/linux_驱动开发$make -C /lib/modules/2.6.38-8-generic/build/  M=/home/yzy/mydriver  
    shana@shana:~/linux_驱动开发$ ls -l
    总用量 124
    -rw-r--r-- 1 shana shana   303 2008-03-16 10:43 hello.c
    -rw-r--r-- 1 shana shana 4Array03Array 2008-03-16 12:11 hello.ko
    -rw-r--r-- 1 shana shana   687 2008-03-16 12:11 hello.mod.c
    -rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o
    -rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o
    -rw-r--r-- 1 shana shana  8344 2008-03-16 0Array:17 linux_qudong_qu.txt
    -rw-r--r-- 1 shana shana   266 2008-03-16 12:0Array Makefile
    -rw-r--r-- 1 shana shana     0 2008-03-16 12:11 Module.symvers
    shana@shana:~/linux_驱动开发$ 
    然后加载模块 (超级用户)
    root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko 
    按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)
    root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko   或者sudo -s先切换到root用户
    root@shana:/home/shana/linux_驱动开发# 
    查看加载模块
    root@shana:/home/shana/linux_驱动开发# lsmod
    Module                  Size  Used by
    hello                   2560  0 
    已经加载上咯~~
    删除模块
    root@shana:/home/shana/linux_驱动开发# rmmod hello
    root@shana:/home/shana/linux_驱动开发# 

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中
    shana@shana:~/linux_驱动开发$  dmesg
    [ 2266.586863] Hello, world\n
    [ 2389.281426] Goodbye, cruel world\n
     
    至此 全部工作都完成了。

  • 相关阅读:
    最近这段时间我,想在2008 的基础上,写2011 有的工具 不知道会样,这次又机会研究ploy
    Screen 可以查找屏幕pos系类的函数
    笔记1
    Ubuntu下如何安装 tar.bz2 文件
    安装ubuntu遇到“BusyBox”问题
    android luancher 如何添加快捷方式
    转 Android 源代码结构
    修改apk图标
    Linux Ubuntu 下如何安装 .SH文件
    解放你的电源键!!不用刷机不用装软件!超简单修改搜索锁屏、HOME键唤醒~~~~~
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4303150.html
Copyright © 2011-2022 走看看