zoukankan      html  css  js  c++  java
  • linux驱动开发第一步hello

    先查看Ubuntu的版本

    cat /etc/issue

    lin@lin-virtual-machine:~$ cat /etc/issue
    Ubuntu 12.04 LTS 
     l

    或者使用

    lin@lin-virtual-machine:~$ sudo lsb_release -a
    [sudo] password for lin: 
    No LSB modules are available.
    Distributor ID:    Ubuntu
    Description:    Ubuntu 12.04 LTS
    Release:    12.04
    Codename:    precise

    在看一下内核版本

    lin@lin-virtual-machine:~$ uname -r
    3.2.0-23-generic

    现在开始我们第一个代码

    hello.c

    /*
     * a simple kernel module: hello
     *
     * Copyright (C) 2014 Barry Song  (baohua@kernel.org)
     *
     * Licensed under GPLv2 or later.
     */
    
    #include <linux/init.h>
    #include <linux/module.h>
    
    static int __init hello_init(void)
    {
        printk(KERN_INFO "Hello World enter
    ");
        return 0;
    }
    module_init(hello_init);
    
    static void __exit hello_exit(void)
    {
        printk(KERN_INFO "Hello World exit
     ");
    }
    module_exit(hello_exit);
    
    MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
    MODULE_LICENSE("GPL v2");
    MODULE_DESCRIPTION("A simple Hello World Module");
    MODULE_ALIAS("a simplest module");
    View Code

    makfile

    KVERS = $(shell uname -r)
    
    # Kernel modules
    obj-m += hello.o
    
    # Specify flags for the module compilation.
    #EXTRA_CFLAGS=-g -O0
    
    build: kernel_modules
    
    kernel_modules:
        make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
    
    clean:
        make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
    View Code

    先cd到文件所在路径,后make

    lin@lin-virtual-machine:~$ cd hello
    lin@lin-virtual-machine:~/hello$ ls
    hello.c  Makefile
    lin@lin-virtual-machine:~/hello$ make
    make -C /lib/modules/3.2.0-23-generic/build M=/home/lin/hello modules
    make[1]: 正在进入目录 `/usr/src/linux-headers-3.2.0-23-generic'
      CC [M]  /home/lin/hello/hello.o
      Building modules, stage 2.
      MODPOST 1 modules
      CC      /home/lin/hello/hello.mod.o
      LD [M]  /home/lin/hello/hello.ko
    make[1]:正在离开目录 `/usr/src/linux-headers-3.2.0-23-generic'
    lin@lin-virtual-machine:~/hello$ ls
    hello.c   hello.mod.c  hello.o   modules.order
    hello.ko  hello.mod.o  Makefile  Module.symvers
    lin@lin-virtual-machine:~/hello$ 

    加载模块使用 sudo insmod ./hello.ko

    查询当前加载模块lsmod

    in@lin-virtual-machine:~/hello$ sudo insmod ./hello.ko
    [sudo] password for lin: 
    lin@lin-virtual-machine:~/hello$ lsmod
    Module                  Size  Used by
    hello                  12425  0 
    ...

    我们之前代码中printk的内容怎么查看呢

    使用dmesg指令后

    ....
    [ 1751.580930] Hello World enter
    [ 2107.145420] Hello World exit
    [ 2107.145422]  
    ....

    小结:

    下面我们来看几个驱动中常用的命令

    1、加载驱动模块insmod

         将生成驱动模块.ko文件加载,

         insmod xxx.ko

         加载后就会执行xxxx_init函数

    2、卸载驱动模块rmmod

         对应的卸载驱动的命令

         rmmod xxxx 注意不用带.ko

    3、查看内核中的模块信息

         lsmod

    4、查看模块的描述信息

         modinfo xxxx.ko

         我们可以在驱动程序添加一些辅助信息,例如作者 ,驱动描述等。

    5、查看模块打印信息

         dmesg   

         printk是内核打印函数,默认模式下在中断下无法显示(当然,可以设置成打印到终端),用dmesg可以查看一下打印到内核的信息。

       cat /var/log/syslog | grep Hello

    lin@lin-virtual-machine:~/hello$ cat /var/log/syslog | grep Hello
    Jul 24 17:19:05 lin-virtual-machine kernel: [  844.246862] Hello World enter
  • 相关阅读:
    async await promise写法
    nginx自动启动脚本
    nginx源码编译安装
    PHP源码编译安装
    MySQL修改root密码的多种方法
    PKG_CONFIG_PATH变量 与 ld.so.conf 文件
    confluence5.65+CentOS+mysql安装破解
    nigos core 安装配置
    cacti+CentOS6.5
    Linux+mysql+apache+php
  • 原文地址:https://www.cnblogs.com/libra13179/p/9341860.html
Copyright © 2011-2022 走看看