精华内容
下载资源
问答
  • 原标题:单独编译某个内核模块开发内核驱动和文件系统的人来说,经常需要编译某个内核模块。 当然从编译角度,有built-in kernel module和external kernel module之分。 怎么编译一个外部内核模块,google一下...

    原标题:单独编译某个内核模块

    对开发内核驱动和文件系统的人来说,经常需要编译某个内核模块。 当然从编译角度,有built-in kernel module和external kernel module之分。 怎么编译一个外部内核模块,google一下“hello world kernel module Makefile”吧。 这里我说下编译内核自带模块的坑... 我用的是SUSE Linux

    1.安装源代码包

    #zypper in kernel-source

    2.要参考文件

    #ls -l /usr/src/linux/README.SUSE

    lrwxrwxrwx 1 root root 61 Dec 31 10:41 /usr/src/linux/README.SUSE -> ../../share/doc/packages/kernel-source-3.12.49-11/README.SUSE

    这个文档介绍编译内核以及模块所需的软件包,概念,方法和步骤。 基本上也适用于其他Linux发型版。

    贴出相关的一段:

    58b5944c6f2c4ced62e4d8a04af861ae.png

    3.坑

    但是按照上面的步骤总是编译不出来.ko内核模块:

    b055b71cfdffec375cb87a2622edc237.png

    原因是配置文件默认没有选择OCFS2,所以要手动make menuconfig,把ocfs2选上, 再试就可以了。具体步骤:

    cd /usr/src/linux-obj/x86_64/default

    make menuconfig 选择ocfs2

    make s

    make -C /lib/modules/3.12.49-11-default/build M=`pwd` modules

    责任编辑:

    展开全文
  • 以下内容在 Virtualbox + ubuntu 3.11.10.6下测试通过准备编译环境和下载内核源码sudo apt-get build-dep --no-install-recommendslinux-image-$(uname -r)apt-get source linux-image-$(uname -r)内核编译和安装...

    以下内容在 Virtualbox  + ubuntu 3.11.10.6下测试通过

    准备编译环境和下载内核源码

    sudo apt-get build-dep --no-install-recommends

    linux-image-$(uname -r)

    apt-get source linux-image-$(uname -r)

    内核编译和安装

    make menuconfig

    make

    sudo make modules_install

    sudo make install

    重启搞定!

    删除旧的内核

    旧的内核还可以启动,建议留着以防万一。

    如果清理了旧内核,需要更新grub列表

    sudo update-grub2

    创建内核模块

    内核版本的Hello World

    如果你不幸遇到如下诡异的问题

    MODPOST 0 modules

    那一定是从Windows粘贴文本的错,请把Makefile重新手敲一遍就可以了!应该是CR/LR/TAB格式的问题!

    自动加载内核模块

    sudo cp hello.ko /lib/modules/$(uname -r)/kernel/

    sudo depmod

    测试看看

    modinfo hello

    sudo modprobe hello

    lsmod |grep hello

    dmesg |grep -i hello

    你会看到这个,并不影响加载

    hello: module verification failed: signature and/or required key

    missing - tainting kernel

    设置自动加载

    方法1

    sudo vi /etc/modules

    增加一行

    hello

    方法2

    sudo vi /etc/init.d/hello

    添加以下内容

    #!/bin/sh -e

    modprobe hello

    sudo chmod 777 /etc/init.d/hello

    创建启动脚本链接

    sudo ln -s /etc/init.d/hello /etc/rcS.d/Shello

    重启试试看!

    dmesg |grep -i hello

    编译进内核

    在内核代码的drivers下创建hello目录,并拷贝hello.c进去。

    创建Kconfig文件,内容如下

    config HELLO

    tristate "Hello world module"

    help

    a simple kernel module

    创建Makefile文件,内容如下

    obj-$(CONFIG_HELLO) += hello.o

    修改drivers下的Kconfig和Makefile,以包含新加的hello模块。

    make menuconfig

    在Device Drivers下找到Hello world module选项,选择为“*“。

    make

    sudo make modules_install

    sudo make install

    重启,查看结果

    cat /proc/kallsyms |grep hello

    可以看到hello的符号已经注册了

    但是

    dmesg |grep -i hello

    却没有任何信息,为啥呢?

    注掉hello.c里的MODULE宏定义,再make & make

    install就搞定了!原来刚才hello模块的初始化代码根本没有被执行,原因如下。

    展开全文
  • 一、Linux内核模块基本原理Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。如果没有内核模块...

    一、Linux内核模块基本原理

    Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。如果没有内核模块,就不得不反复编译生成操作系统的内核镜像来加入新功能,当附加的功能很多时,还会使内核变得臃肿。一个Linux 内核模块主要由以下几个部分组成:

    (1) 模块加载函数(必须):当通过insmod 或modprobe 命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块相关初始化工作。

    (2) 模块卸载函数(必须):当通过rmmod 命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

    (3) 模块许可证声明(必须):模块许可证(LICENCE)声明描述内核模块的许可权限,如果不声明LICENCE,模块被加载时将收到内核被污染的警告。大多数情况下,内核模块应遵循GPL 兼容许可权。Linux2.6 内核模块最常见的是以MODULE_LICENSE(“Dual BSD/GPL”)语句声明模块采用BSD/GPL 双LICENSE。

    (4) 模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量。

    (5) 模块导出符号(可选):内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本模块中的变量或函数。

    (6) 模块作者等信息声明(可选)。

    一个内核模块至少包含两个函数,模块被加载时执行的初始化函数init_module()和模块被卸载时执行的结束函数cleanup_module()。在最新内核稳定版本2.6 中,两个函数可以起任意的名字,通过宏module_init()和module_exit()注册调用要编译内核模块,把代码嵌进内核空间,首先要获取内核源代码,且版本必需与当前正在运行的版本一致。

    二、编写helloworld.c及其对应的Makefile。

    5b504d4698765e12d5a9065ca0fc8a19.png

    在Makefile中,在obj-m := helloworld.o这句中,.o的文件名要与编译的.c文件名一致。 KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)指示当前linux系统内核的源码位置。

    三、编译:

    1.在Makefile及helloworld.c所在目录下,直接make,成功后查看当前目录下有无helloworld.ko文件产生,有则内核模块生成成功。

    dc4674b5c5ecb038d6b9a6c8ab0c7207.png

    2.使用insmod命令,把此内核模块程序加载到内核中运行。结合lsmod及管道命令,查看内核模块程序在内核中是否正确运行。

    cc3ab006ee572cd887d512e71d5244f9.png

    3.查看此内核模块程序打印的信息,另开一个终端,输入tail -n /var/log/messages. 使用rmmod命令把之前加载的内核模块卸载掉,然后再次执行第2步,即可看到此内核模块程序打印的信息。

    82b2e9cdb7084d3f2573b318c1476856.png

    展开全文
  • 2012-3-21.从科室服务器中找到了linux-2.6.22 ,将之解压至/usr/src中2.make oldconfig,遇到了一些选择:多项根据自己的情况选择,其他...4.make modules_install,等命令执行完成后内核模块就被安装到/lib/mod...

    2012-3-2

    1.从科室服务器中找到了linux-2.6.22 ,将之解压至/usr/src中

    2.make oldconfig,遇到了一些选择:多项根据自己的情况选择,其他默认一路回车

    3.make bzImage,得到内核文件vmlinux和压缩后的内核bzImage,这两个文件的差别见后面的说明1。

    4.make modules_install,等命令执行完成后内核模块就被安装到/lib/modules中了

    5.接着按照linux设备驱动程序的hello例程编写了hello.c和Makefile(文件内容见后面说明2),接着make,得到了最终的模块文件hello.ko,但是该文件无法使用insmod命令加载,提示无效的模块格式,于是在Makefile中把内核路径更改为系统当前内核2.6.32-28-generic的路径,接着make,insmod,一切正常,模块输出的信息在/var/log/syslog中查看。

    说明1:

    在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行。

    编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生的?又有什么作用呢?本文对此做些介绍。

    一、vmlinuz

    vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。

    vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。

    二是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

    内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

    二、initrd-x.x.x.img

    initrd是“initialramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。

    比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但 scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正 scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。

    initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。

    vmlinux是内核文件,

    zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到,只能从0X0地址运行。

    bzImage在uClinux中很少见到。

    uImage是u-boot使用bootm命令引导的Linux压缩内核映像文件格式,

    使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。可以由bootm命令从任意地址解压启动内核。

    由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好处就是可以和bootloader共存。

    制作uImage的mkimage软件,如果uClinux-dist有的话,一般放在uClinux-dist的tools目录中。

    没用过ARMLINUX,一用的uClinux,偶说的都是针对uClinux的。

    对uClinux来说,zImage从0X0先复制到某一地址,再解压到运行地址,然后启动。

    不过这个0X0按一些资料说法可以改为其他地址,然后用BOOTLOADER启动解压。但也是改为多少就要下到多少,和uImage比灵活性差远了。

    平时调试我用uImage,zImage则是一切OK后直接烧0X0,开机就运行。

    说明2:

    Hello模块文件相关代码:

    hello.c

    //hello.c

    #include

    #include

    MODULE_LICENSE("DualBSD/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文件:

    #kernel version to be compliedwith module source code

    KERNELVERSION:=2.6.32-28-generic

    ifneq ($(KERNELRELEASE),)

    obj-m := hello.o

    else

    KERNELDIR ?= /lib/modules/$(KERNELVERSION)/build

    PWD := $(shell pwd)

    default:

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

    endif

    2013-1-18

    第二章:

    内核模块与应用程序的区别

    1.      内核模块只有在需要的时候被调用,OS加载内核模块会调用初始化函数,然后内核模块就等着被调用,卸载时会调用撤销函数

    2.      内核模块会被连接到内核中,所以没有可链接的函数库

    3.      内核错误比较严重,至少也会让当前进程崩溃

    4.      内核模块运行在内核空间中。处理系统调用的内核代码运行在进程上下文中,可以访问进程地址空间。处理硬件中断的内核代码和进程是异步的,与任何一个特定进程无关。

    5.      内核的并发很频繁,需要重点考虑:一、可能有多个进程同时使用驱动。二、驱动在执行某个任务时可能会被中断打断,改为执行自己的中断处理代码。三、有一些软件抽象也在异步运行。四、在SMP系统上可能有多个处理器在同时运行驱动。

    6.      不要认为某段没有进入睡眠状态或阻塞的内核代码会独占CPU。

    7.      可以通过task_struct结构类型的变量current获取当前运行的进程信息

    8.      内核栈很小,一般只有4096byte,使用大变量时应动态分配。

    9.      带有__前缀的内核API要谨慎使用。 内核代码不支持浮点运算。

    展开全文
  • 错误描述:root@light-laptop:/home/light/work/drivers/hello# makemake -C /opt/zeng-linux/linux-2.6.32.2 M=/home/light/work/drivers/hello modulesmake[1]:正在进入目录 `/opt/zeng-linux/linux-2.6.32.2'CC ...
  • 我认为你需要一个总是(或几乎总是)加载到内核中的蹦床.在trampoline代码中,您需要这样的变量.struct module *ip_vs_utils_mod;EXPORT_SYMBOL(ip_vs_utils_mod);/* function pointers */ret_type (*ip_vs_utils_afunc...
  • 我的上一次内核开发是在2.6~版本中现在我尝试编译一个模块,在内核树外编译时出现以下错误./bin/sh: 1: /home/blabla/workspace/kernel35/linux-3.5/scripts/recordmcount: not found目标文件是正确创建的,但是问题出...
  • 首先cd /tmp[root@localhost tmp]#vi hello.chello.c#include &...linux/init.h>#include <linux/module.h>#include <linux/moduleparam.h>staticinthello_init(void){printk("Helloworld\n");retur...
  • 大部分程序员都研究内核模块编译,在当今社会Linux越来越成为主流,你是Linux系统的应用者么?本文为你详细介绍内核模块编译,为你在学习内核模块编译时起一定的作用。1.进入新内核源代码目录#cd /usr/src/kernels/...
  • 我正在尝试使用Linux softirq.有一个简单的程序使用linux / interrupt.h中定义的linux系统调用://// Created by kivi on 24.09.16.//#include #include #include #include #define SHARED_IRQ 17static int irq = ...
  • 然后就需要重新编译Linux内核代码。大家知道,完全编译Linux整个内核代码需要的时间比较长。由于jbd是一个单独的模块,那能不能将这个模块进行单独编译呢?当然可以!方法如下:1.首先将jbd的代码(在Linux源码/fs/...
  • 我如何知道在运行的Linux上是否支持设备,如果有,哪个设备驱动程序控制它?例如,服务器上的lspci(PowerEdge 2900)给出:00:00.0 Host bridge: Intel Corporation 5000X Chipset Memory Controller Hub (rev 12)00:...
  • 我想在我的x86 ubuntu linux上交叉编译ARM内核模块.我已经下载了内核源代码(linux 2.6.26,因为目标ARM机器正在运行这个linux版本).和apt-get'ed arm交叉编译器.如你看到的.root@declspec-desktop:/var/...
  • 如果你到静态库不需要使用任何内核数据结构或者函数那么你可以参考如何将内核静态库编译连接到驱动程序中去如果你需要在静态库里面使用一些内核数据结构,如简单的添加一个 #include ,你会发现编译器输出一堆错误!...
  • 同其他的程序设计教程一样 ,我们给出一个hello world 的例子:/*hello.c a module programm*//* the program runing under kernel mod and it is a module*/#include" linux/kernerl.h"#include"llinux/module.h"/* ...
  • 不知道什么原因,每次我按照下面的步骤编辑安装内核的时候,编译出来的源码都只有很少几个,球大神帮忙看一下是哪里不对!bashwget ...
  • 内核模块的构建有两种主要方式:放在内核源码树中或者放在内核代码外。一、放在内核源码树中在内核的drivers/文件夹下创建好驱动模块文件夹,并完成驱动文件之后,需要编辑和修改相应的Kconfig和Makefile文件,使得...
  • 前不久导师要求交叉编译一个基于arm平台开发内核模块来练手,在网上查了很多资料才弄出来,于是将这些零散的信息综合起来给和我一样的入门人员了解。水平有限,请谅解~1....在linux编译arm平台的内核模块...
  • ubuntu下交叉编译arm内核模块 安装编译环境及下载交叉编译工具: 1 2 3 4 5 apt-get install gcc make pkg-config git bison flex libelf-dev libssl-dev libncurses5-dev bc ...
  • ko内核模块后,用insmod向linux系统插入内核模块的时候,向该内核模块动态传递参数,需要事先在驱动程序中加入module_param(name,type,perm)函数以确定一个待输入的参数。 然后可以使用 insmod xxx. ko 变量名=...
  • 我想在我的x86 ubuntulinux上交叉编译ARM内核模块.我已经下载了内核源代码(linux 2.6.26,因为目标ARM机器正在运行这个linux版本).和apt-get’ed arm交叉编译器.如你看到的.root@declspec-desktop:/var/...
  • Linux 内核源码外编译 linux模块--编译驱动模块的基本方法 1、先编写一个简单的hello模块,hello.c 源码如下: #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif // ...
  • 编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。 比较简单的写法,有人认为这不是正真的Makefile lzel@lzel-laptop:~/works/kernel/DeviceDrivers/1/modules$echo obj -m :...
  • Linux 内核配置编译和加载内核配置编译和加载 Linux 内核模块内核模块 Linux 内核结构非常庞大 包含的组件也非常多 想要把我们需要的部分添加到内核中 有两个方法 直接编译进内核和模块机制 由于直接编译进内核有两...
  • 刚接触内核模块,现在只知道编译内核模块有两种方式,一种是在内核源码树外编译,另一种是在内核源码树内编译。这篇文章是有关内核源码树之外编译的情况。首先搭建环境:内核源码树:我的ubunut10.10安装后有自带的...
  • //所有模块都需要的头文件#include // init&exit 相关宏MODULE_LICENSE("GPL");static int __init hello_init (void){printk("Hello module init\n");return 0;}static void __exit hello_exit (void){printk(...
  • 好吧我试图编译一个简单的内核模块...编译一个内核模块,头文件问题,生成文件问题linux-headers-2.6.31-21 linux-headers-2.6.31-22linux-headers-2.6.31-21-generic linux-headers-2.6.31-22-genericlinux-headers...
  • 序言最近终于成功的在自己的手中将一个hello的内核模块成功的编译并加载进自己的嵌入式linux系统,教程翻了无数篇,果然理论的了解和实际上的知道怎么做之间,还存在着很大的差距。。鉴于在查找资料中看到不少的教程...
  • 现象:最近在研究Linux的裁剪定制,编译内核的时候发现编译后同样的模块比以前内核版本的大好多,比如下面这个例子:[root@CentOS5 ~]# find /lib/modules/ -name ext3.ko/lib/modules/3.8.8-chensh3.0/kernel/fs/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,295
精华内容 46,518
关键字:

linux编译开发内核模块

linux 订阅