modules

内核模块可以使用两种方式加入进内核:

1.使用insmod等命令动态加载到内核(obj-m);

2.作为内核的一部分静态编译进内核(obj-y);

在linux/init.h文件中

typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);

#ifndef MODULE
//静态方式
#define __define_initcall(level,fn,id) \
    static initcall_t __initcall_##fn##id __used \
    __attribute__((__section__(".initcall" level ".init"))) = fn

//最终展开为:

//static initcall_t __initcall_test_init6 __used __attribute__((__section__(".initcall"6".init"))) = test_init
//即将初始化函数test_init的地址放在了.initcall6.init的section,内核在启动的时候按级别顺序调用__initcall_start处的函数

//start_kernel()->rest_init()->kernel_init()->do_basic_setup()->do_initcalls()

#define device_initcall(fn)     __define_initcall("6",fn,6)
#define __initcall(fn) device_initcall(fn)
#define module_init(x)  __initcall(x);

#define __exitcall(fn) \
    static exitcall_t __exitcall_##fn __exit_call = fn

//module_exit在静态编译的时候没有意义,因为静态编译的驱动无法卸载
#define module_exit(x)  __exitcall(x);

#else
//动态方式
#define module_init(initfn)                 \
    static inline initcall_t __inittest(void)       \  //检查初始化函数的格式是否满足initcall_t类型,当函数格式不匹配时,编译会warnning
    { return initfn; }                  \
    int init_module(void) __attribute__((alias(#initfn)));

//为init_module函数定义一个别名,即初始化函数的名字。

//insmod时候,在系统内部会调用sys_init_module()去找到init_module函数的入口地址

  //用objdump -t xxx.ko 命令可以看出test_init函数名的地址与init_module函数的地址相同。

//module_exit函数的作用也是检查函数格式和定义别名。

#define module_exit(exitfn)                 \
    static inline exitcall_t __exittest(void)       \
    { return exitfn; }                  \
    void cleanup_module(void) __attribute__((alias(#exitfn)));

linux/arch/arm/kernel/vmlinux.lds

.init.data : {
   *(.init.data) *(.meminit.data) *(.init.rodata) . = ALIGN(8); __start_ftrace_events = .; *(_ftrace_events) __stop_ftrace_events = .; *(.meminit.rodata) . = ALIGN(3    2); __dtb_start = .; *(.dtb.init.rodata) __dtb_end = .;
   . = ALIGN(16); __setup_start = .; *(.init.setup) __setup_end = .;
   __initcall_start = .; *(.initcallearly.init) __initcall0_start = .; *(.initcall0.init) *(.initcall0s.init) __initcall1_start = .; *(.initcall1.init) *(.initcall1s    .init) __initcall2_start = .; *(.initcall2.init) *(.initcall2s.init) __initcall3_start = .; *(.initcall3.init) *(.initcall3s.init) __initcall4_start = .; *(.initcal    l4.init) *(.initcall4s.init) __initcall5_start = .; *(.initcall5.init) *(.initcall5s.init) __initcallrootfs_start = .; *(.initcallrootfs.init) *(.initcallrootfss.in    it) __initcall6_start = .; *(.initcall6.init) *(.initcall6s.init) __initcall7_start = .; *(.initcall7.init) *(.initcall7s.init) __initcall_end = .;
   __con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .;
   __security_initcall_start = .; *(.security_initcall.init) __security_initcall_end = .;
   . = ALIGN(4); __initramfs_start = .; *(.init.ramfs) . = ALIGN(8); *(.init.ramfs.info)
  }

示例代码:

#include <linux/module.h>

int test_init(void)
{
    printk("test test init\n");                                                 

    return 0;
}                                                               

void test_exit(void)
{
    printk("test test exit\n");
}                    

module_init(test_init);
module_exit(test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("frank");
MODULE_VERSION("1.0");   
时间: 2024-10-10 17:17:34

modules的相关文章

利用ansible modules模块来自定义集群管理

前沿: 在一些个特定环境下,用ansible做集群管理还是很棒的,这两天看了他的模块,官方提供了很多,就算不够,你也可以自定义定制. 话说我挺喜欢他的modules模块的,够直接 !!! 我这里就说些常见的ansible的modules吧. 下面的ansible service一看大家就懂了,就是服务状态的管理模块 [[email protected] ~ ]$ ansible web -m service -a "name=nginx state=started" 10.150.14

CSS Modules如何使用?

本文和大家分享的主要是CSS Modules的相关内容,一起来看看吧,希望对大家学习css有所帮助. 什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方式.它可以通过在不同组件设定不同的功能,把一个问题分解成多个小的独立.互相作用的组件,来处理复杂.大型的软件.看完模块化,是不是有种拼图的即视感,可以把大图分成各个小图,然后把小图拼成大图,分与合的

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2

LAMP详解之lamp(modules)安装

大纲: 1.  LAMP概念 2.  LAMP的原理 3.  LAMP的实现 一.LAMP的概念  LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据库(mariadb),Perl.PHP或者Python编程语言,所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,LAMP具有通用.跨平台.高性能.低价格的优势,因此LAMP无论是性能.质量还是价格都是

[Angular2 Router] Lazy Load Angular 2 Modules with the Router

Angular 2 lazy loading is a core feature of Angular 2. Lazy loading allows your application to start up faster because it only needs to use the main App Module when the page initially loads. As you navigate between routes, it will load the additional

saltstack(七)modules(二)

OK,上一篇总结了execution modules的用法.这一篇准备总结一下state modules该怎么写. 顺便把上一篇execution modules遗留下来的那个装饰器给写一下. 看一下写的这个模块 [email protected]:~# cat /srv/salt/_modules/liss.py  import salt.utils.decorators as decorators import os @decorators.depends('os') def cheng()

haskell模块(modules)

装载模块 Haskell 中的模块是含有一组相关的函数,类型和类型类的组合.而 Haskell 进程的本质便是从主模块中引用其它模块并调用其中的函数来执行操作.这样可以把代码分成多块,只要一个模块足够的独立,它里面的函数便可以被不同的进程反复重用.这就让不同的代码各司其职,提高了代码的健壮性. Haskell 的标准库就是一组模块,每个模块都含有一组功能相近或相关的函数和类型.有处理 List 的模块,有处理并发的模块,也有处理复数的模块,等等.目前为止我们谈及的所有函数,类型以及类型类都是 P

Maven pom.xml中的元素modules、parent、properties以及import

前言 项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单:maven的核心是pom.xml,那么我就它来谈谈那些不同的地方: 给我印象最深的就是如下四个元素:modules.parent.properties.import. modules 从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块:如果maven用的比较简单,或者说项目的模

lsb_release No LSB modules are available

lsb_release 提示: No LSB modules are available 执行: sudo apt-get install lsb-core

CentOS6.5编译内核Modules,出现问题,解决方案

Make的时候出现下列错误: 1 make -C /lib/modules/2.6.32-431.el6.i686/build M = /root/Desktop/kernel modules 2 make *** /lib/modules/2.6.32-431.el6.i686/build: No such file or directory ,Stop 3 make: *** [default] Error 2 解决方案: 先看一下/usr/src/kernels/ 如果没有说明没有安装内核