zoukankan      html  css  js  c++  java
  • linux下设备驱动的结构&编译&加载

    构造和运行模块

    insmod

    modprobe

    rmmod

    用来装载模块到正运行的内核和移除模块的用户空间工具。

    #include<linux/init.h>

    module_init(init_function);

    module_exit(cleanup_function);

    用于指定模块的初始化和清除函数的宏。

    __init

    __initdata

    __exit

    __exitdata

    仅用于模块初始化或清除阶段的函数(__init 、__exit)和数据 (__initdata、__exitdata) 标记。标记为初始化的项目会在初始化结束后丢弃;而退出项目在内核为被配置为可卸载模块的情况下被丢弃。内核通过将相应的目标对象放置在可执行文件的特殊ELF段中而让这些标记其作用。

    #include<linux/sched.h>

    最重要的头文件之一。该文件包含驱动程序使用的大部分内核API的定义,包括睡眠函数以及各种变量声明。

    Struct task_struct *current;

    当前进程。

    current->pid

    current->comm.

    当前进程的进程ID和命令名。

    obj-m

    有内核构造系统使用的makefile符号,用来确定在当前目录中应构造哪些模块。

    /sys/module

    /proc/modules

    /sys/module是sysfs目录层次结构中包含当前已装载模块信息的目录。/proc/modules是早期用法,只在单个文件中包含这些信息,其中包含了模块名称、每个模块使用的内存总量以及使用计数等。每一行之后还追加有额外的字符串,用来指定模块的当前活动标志。

    vermagic.o

    内核源代码目录中的一个目标文件,它描述了模块的构造环境。

    #include<linux/module.h>

    必须的头文件,它必须包含在模块源代码中。

    #include<linux/version.h>

    包含所构造的版本信息的头文件。

    LINUX_VERSION_CODE

    整数宏,在处理版本依赖的预处理条件语句中非常有用。

    EXPORT_SYMBOL(symbol)

    EXPORT_SYMBOL_GPL(symbol)

    用来导出单个符号到内核的宏。第二个宏将导出符号的使用限于GPL许可证下的模块。

    MODULE_AUTHOR(author)

    MODULE_DESCRIPTION(description)

    MODULE_VERSION(version_string)

    MODULE_DEVICE_TABLE(table_info)

    MODUL_ALIAS(altername_name)

    在目标文件中添加关于模块的文档信息。

    module_init(init_function)

    module_exit(exit_function)

    用来声明模块初始化和清除函数的宏。

    #include<linux/modulepararm.h>

    Module_param(variable,type,perm)

    用来创建模块参数的宏,用户可以装载模块时(或者对内核代码引导时)调整这些参数的值。其中的类型可以是bool、charp、init、invbool、long、short、ushort、uint、ulong或者intarray。

    #include<linux/kernel.h>

    int printk(const char * fmt,…);

    函数printf的内核代码。

     

    编译内核模块

    第一种方法

    Step1:编写内核模块源代码文件;

    Setp2:编写Makefile文件;

    Setp3:运行make –C pathtokernel M=`pwd` modules

    其中,Makefile文件内容如下:

    obj-m:=hello.o

    如果我们要构造的模块名称为module.ko,并有两个源文件生成(比如file1.o和file2.o),则正确的Makefile可如下编写:

           obj-m:=module.o

           module-objs:=file1.o file2.o

    第二种方法

    Step1:编写内核模块源代码文件;

    Step2:编写Makefile文件;

    Step3:运行make

    其中,Makefile文件内容如下:

         ifneq ($(KERNELRELEASE),)

           obj-m:=hello.o

         else

             KERNELDIR?=/usr/src/kernel/$(shell uname -r)/build

             PWD:=$(shell pwd)

         default:

             $(MAKE) –C $(KERNELDIR) M=$(PWD) modules

         endif

  • 相关阅读:
    实习第一天
    附加、分离数据库和备份、还原数据库的区别(转载于中雪的BLOG)
    2014-08-29 Last Day
    2014-08-26 解决HttpContext.Current.Session在ashx文件中出现“未将对象引用设置到对象的实例”的问题
    什么是Ajax? (转载于疯狂客的BLOG)
    Response.Expires 属性 (转载于疯狂客的BLOG)
    2014-08-22 关于Response、Request等对象在cs文件中的使用
    ASP.NET获取IP的6种方法(转载于LanceZhang's Tech Blog)
    2014-08-13 SQL语句之Left Join
    2014-08-07 优秀程序员所应具备的思想
  • 原文地址:https://www.cnblogs.com/chengliangsheng/p/3598195.html
Copyright © 2011-2022 走看看