精华内容
下载资源
问答
  • linux 内核编译模块

    2011-09-15 11:22:17
    make -C $(KDIR) O=$(KOUT) M=$(PWD) ARCH=arm CROSS_COMPILE=$(ANDROID_ROOTDIR)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- run.sh make -C /home/android/qianchunlei/test/...
    
    
    makefile文件
    obj-m :=test1.o
    #module-objs:=hello.o
    KOUT:=/home/qKF44804/8960/out/target/product/msm8960/obj/KERNEL_OBJ
    KDIR:=/home/qKF44804/8960/kernel
    PWD:=$(shell pwd)
    
    default:
            make -C $(KDIR) O=$(KOUT) M=$(PWD) ARCH=arm CROSS_COMPILE=$(ANDROID_ROOTDIR)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-


    run.sh

    make -C /home/android/qianchunlei/test/mocorsmart_w11.18_sdk_hw/kernel/ M=`pwd` CROSS_COMPILE=/home/android/qianchunlei/mocorsmart_w11.18_sdk_hw/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- ARCH=arm

    展开全文
  • 内核难免有的时候忘记了配置某个模块,导致该模块不可用,那是不是必须重新配置内核并重新编译呢,答案是否定的,完全可以单独编译某一个内核模块。...定位fuse模块内核代码:/root/linux-2.6....

    编内核难免有的时候忘记了配置某个模块,导致该模块不可用,那是不是必须重新配置内核并重新编译呢,答案是否定的,完全可以单独编译某一个内核模块。

    我在使用最新的fuse-2.

    8.0-pre1时,发现其中已经没有fuse模块了,该项目的内核模块看来已经彻底移进内核源码中了,而我当前的内核在编译时并没有选中fuse模块,于是就产生了本文一开始的需求。

    定位fuse模块内核代码:/root/linux-2.6.23/fs/fuse/*.c

    查看其下的Makefile:

    obj-$(CONFIG_FUSE_FS) += fuse.o

    fuse-objs := dev.o dir.o file.o inode.o control.o

    进行如下操作即可单独编译fuse模块:

    [root@localhost ~]# make CONFIG_FUSE_FS=m -C /root/linux-2.6.23 M=/root/linux-2.6.23/fs/fuse modules

    然后手动将生成的fuse.ko拷贝到/lib/modules/2.6.23/kernel/fs/fuse/fuse.ko

    运行depmod -a重新配置依赖关系,以后就可以通过modprobe fuse来加载fuse模块了。

    类似其他可编译成模块的内核代码都可以这样单独编译。

    1b3eeb37b4e7246d0e4124d1cd1ca3dc.png

    与图无关

    展开全文
  • linux内核简介、配置编译与内核模块 Linux系统架构 主要分为用户空间和内核空间。用户空间包括应用程序和C库等。内核空间包括系统调用接口,linux内核以及体系结构相关代码。关于linux要区分内核空间和用户空间的...

     linux内核简介、配置编译与内核模块

    Linux系统架构

    主要分为用户空间和内核空间。用户空间包括应用程序和C库等。内核空间包括系统调用接口,linux内核以及体系结构相关代码。关于linux要区分内核空间和用户空间的原因。首先要明白,内核空间与用户空间是程序运行的不同状态。现代的处理器往往有很多工作模式,以ARM9为例就有7中工作方式:管理模式,系统模式,用户模式,外部中断模式,快速中断模式,数据终止模式和未定义指令异常模式。X86也分有Rang0--Rang3四种模式。在不同的模式下,所使用的寄存器与访问权限不尽相同。Linux为了保护操作系统本身,系统分成了用户空间和内核空间,用户空间的访问权限要小,这样就起到了保护内核的作用。

    Linux内核架构:如下表所示

                        -- 系统调用接口

                        --Linux内存管理子系统(重点掌握)

                        --Linux 进程管理子系统

    Linux内核的组成 -----Linux 网络子系统(网络协议栈)

                        --虚拟文件系统

                            --驱动 

                            --体系结构相关代码(汇编)

    Linux内核的配置与编译(X86平台上)

    第一步:Make clean或者Make mrproper或者Make distclean

    第二步:make config 或者 make menuconfig

    第三步:make zImage 或者 make bzImage 

    第四步:编译内核模块 make modules

    第五步:安装内核模块 make modules_install (将编译好的内核模块拷贝至/lib/modules目录下面)

    第六步:制作initramdisk

    Linux内核模块

    为何需要内核模块?如果把所有组件都编译进内核,那会使得内核模块非常庞大。另外如果想要添加或者删除某个组件就必须重新编译内核。所以提供了一种内核模块的机制。

    首先要区别内核模块与一般程序的区别:

    普通程序从main函数开始,从头到尾执行,然后从内存中消失。而内核模块通过初始化函数在内核中注册,然后一直存在内核中,等待将来的某个请求。模块始终存在于内核中,知道执行了卸载函数。

    内核模块的写法。下面是一片hello world 的范例

    #include <linux/module.h>

    #include <linux/init.h>

    MODULE_LICENSE("GPL");

    MODULE_AUTHOR("DAVID");

    MODULE_DESCRIPTION("Hello world module");

    static int __init hello_init(void)

    {

    printk(KERN_ERR "hello world!\n");

    return 0;

    }

    static void __exit hello_exit(void)

    {

    printk(KERN_EMERG "hello exit!\n");

    }

    module_init(hello_init);

    module_exit(hello_exit);

    有了内核模块的源文件,还必须有makefile。但这个makefile其实是一个假的makefile。它的作用是指定一个linux内核中的真正的makefile。下面是一篇makefile的范例(注意,这是针对X86平台的):

    ifneq ($(KERNELRELEASE),)

    obj-m :=hello.o

    else

    KDIR:= /lib/modules/2.6.18-53.el5/build

    all:

    make -C $(KDIR) M=$(PWD) modules 

    clean:

    rm -f *.ko *.o *.mod.o *.mod.c .symvers

    endif

    内核模块的安装与卸载

    安装使用:insmod ***.ko;卸载使用 :rmmod  *** (注意不需要后缀名);查看已经安装的内核模块使用 lsmod

    linux内核启动流程

    uImage由zImage和uboot head相关两组成。而zImaeg又是由解压缩代码和压缩的vmlinux代码构成。总的来说内核启动流程可以分为 解压缩 、 初始化 、 启动应用程序三部分组成。初始化的最后一句代码是:run init_process("sbin/init").所以这也解释了为什么把程序放在这里面就能够开机自启动了。

    linux内存管理

       首先从几个地址的概念谈起。一是物理地址,这个很容易理解,它就是CPU所使用的地址,也就是在地址总线上传输的地址。二是线性地址或者成为虚拟地址,它的大小是根据地址线的根数来确定的。但它不表示实际的内存地址。因为就算地址线能达到4G,实际的内存很可能没有4G。所以它成为虚拟地址。三是逻辑地址,这个是针对段式管理的产物。也就是段式管理中的偏移地址。

       一个程序中,代码寻址用的就是逻辑地址,一个逻辑地址经过段式管理,成了线性地址,线性地址经过页式管理,才准换成真正的物理地址。但由于很多处理器没有使用段式管理,所以linux有限制的采用了段式管理机制,将所有的段基地址都设置为0,那么偏移地址也就是逻辑地址和线性地址也就完全对应了,可以理解为相同的。也就是说,在linux中,逻辑地址,线性地址,虚拟地址都是一致的。然后线性地址经过页式转换就得到了真正的物理地址。

    对于段式管理的起源,要有一定的认识。出现在intel的16位处理器上面。

    展开全文
  • linux内核模块的编译方法有两种: 1.放入linux内核源码中编译。 2.独立编译模块。...linux内核编译过程:是根据配置裁剪的结果配合Makefile完成内核编译。 以ARM平台为例,具体配置过程: 1...

    linux内核模块的编译方法有两种:

    1.放入linux内核源码中编译。

    2.独立编译模块。

    (1)放入linux内核源码中编译

    这里先了解Kconfig和Makefile的作用

    Kconfig:对应内核模块的配置菜单。

    Makefile:对应内核模块的编译选项。

    linux内核编译过程:是根据配置裁剪的结果配合Makefile完成内核编译。

    以ARM平台为例,具体配置过程:

    1.当执行make menuconfig 时,系统首先读取arch/arm/Kconfig生成整个配置界面

    2.在读取配置界面的同时,系统会读取顶层目录下的.config文件,生成所有配置选项的默认值

    3.当修改玩配置并保存后,系统会更新顶层目录下的.config

    4.当执行make时,各层的Makefile会根据.config文件中的编译选项来决定哪些文件会被编译到内核中,或者编译成模块。

    下面进入正题怎么把自己的内核代码添加到内核中,

    1.把自己的内核代码放入到内核合适的位置   // 字符驱动  driver/char/

    2.把自己开发的功能添加到linux内核的配置选项中,使用户能够选中这项功能并编译。// vi /driver/char/Kconfig

    在Kconfig文件结尾,endmenu的前面加入一个config选项 

    config 2018_HELLO

            bool "This is my first drive "

            default y

            help

                The driver hh.     

    3.构建或修改Makefile。// vi dreiver/char/Makefile  obj-$(CONFIG_2018_HELLO)        += hello.c

    4.执行make

    (2)独立编译

    topdir := $(shell cd $(src)/.. && pwd)
    
    TARGET_MODULE:=xdma
    
    EXTRA_CFLAGS := -I$(topdir)/include $(XVC_FLAGS)
    
    ifneq ($(KERNELRELEASE),)
    	$(TARGET_MODULE)-objs := libxdma.o xdma_cdev.o cdev_ctrl.o cdev_events.o cdev_sgdma.o cdev_xvc.o cdev_bypass.o xdma_mod.o xdma_thread.o
    	obj-m := $(TARGET_MODULE).o
    else
    	BUILDSYSTEM_DIR:=/home/allen/share_allen/Zodiac_linux/board-support/linux-4.14.79
    	PWD:=$(shell pwd)
    all :
    	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules
    
    clean:
    	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) clean
    
    install: all
    	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules_install
    
    endif

    KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(BUILDSYSTEM_DIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。$(TARGET_MODULE)-objs :=表示目标模块由后面的.o文件连接生成。obj-m := $(TARGET_MODULE).o表示编译连接后将生成$(TARGET_MODULE).o模块。

    补充一点,"$(MAKE) -C $(KDIR) M=$(PWD)"与"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是较老的使用方法。推荐使用M而不是SUBDIRS,前者更明确。

    两者的区别就是独立编译比较省时间,方便添加 移除,重启后消失。

     


    原文链接:https://blog.csdn.net/lyw13522476337/article/details/79869066

    展开全文
  • Linux内核驱动模块编译

    千次阅读 2015-08-03 08:12:32
    Linux内核模块编译
  • linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。1、勾选内核Enable...
  • 2012-3-2 1.从科室服务器中找到了linux-2.6.22 ,将之解压至/usr/src中 2.make oldconfig,遇到了一些选择:多项根据自己的情况选择,其他默认一路...4.make modules_install,等命令执行完成后内核模块就被安装到
  • Linux内核模块编译

    千次阅读 2018-07-25 19:12:52
    Linux内核模块是一种可被动态加载和卸载的可执行程序。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等...
  • Linux内核编译(通过内核模块显示进程控制块信息) 实验说明 在内核中,所有进程控制块都被一个双向链表连接起来,该链表中的第一个进程控制块为init_task。编写一个内核模块模块接收用户传递的一个参数num,num...
  • 本篇文章中只讨论linux内核模块编译的makefile,linux内核makefile总览可以参考另一篇博客:linux内核makefile概览 本篇博客参考官方文档。 linux内核使用的是kbuild编译系统,在编译可加载模块时,其makefile的风格...
  • linux 内核编译

    2016-03-06 16:20:02
    linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说2012-05-17 00:38:37 分类: LINUX linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说 linux内核编程4部曲之二:增加linux...
  • 内核模块Linux内核向外提供的一个插口,其全称为动态可加载内核模块(Loader kernel Module ,LKM),简称为模块 hello.c文件 在终端可以通过 gedit hello.c 命令进行编辑 首先编辑 hello.c文件: ...
  • linux内核模块编译

    千次阅读 2014-05-14 09:47:44
    为了清晰的编译Linux内核内核编译系统使用Kbuild规则对编译的过程以及依赖进行规约。在内核模块的编译中,为了保持与内核源码的兼容以及传递编译链接选项给GCC,也使用Kbuild规则。 内核模块的源代码可以在内核...
  • Linux内核编译->ecryptfs模块编译

    千次阅读 2016-07-22 15:16:07
    Compiling Linux-Kernelwith eCryptfsREADME 作者:邢万里 学校:重庆邮电大学 ...基于ubuntu12.04(原内核3.13.0 - 32 - generic) ...内核编译前期(menuconfig) 基本知识 下文摘抄wiki-menuconfig官网 基本
  • 一.Linux内核介绍 1.Linux 内核很庞大,相应的包含的组件也非常多。Linux文件就是常说的zImage和bzImage,在内核启动期间会被解压到内存。2.新的使用组件的思路:动态加载和卸载。也就是需要这个组件的时候才去加载...
  • linux 2.6内核 编译模块Makefile 详解! 编译模块的make file 必须是Makefile,不能是makefile. //why? ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else ...
  • linux内核编译

    2019-01-09 09:19:15
    Linux内核的体积结构是单内核的、但是他充分采用了微内核的设计思想、使得虽然是单内核、但工作在模块化的方式下、并且这个模块可以动态装载或卸 载;Linux负责管理系统的进程、内存、设备驱动程序、文件和网络系统...
  • Linux 内核编译

    2019-09-24 11:35:24
    Linux内核编译:编译安装内核的详细说明: 编译安装内核概要步骤: 1、安装开发包组 2、下载内核源码文件 3、准备.config文本配置文件 4、通过make menuconfig配置内核选项 5、make[-j #] 指定编译时使用CPU...
  • 编译模块的make file 必须是Makefile,不能是makefile. //why? ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else KDIR := /lib/modules/$(shell uname -r)/build ...
  • 当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。 个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686. 第一步,下载Linux内核的源代码,即构建LDD3...
  • Linux内核编译以及perfctr模块安装

    千次阅读 2010-08-21 14:41:00
    Linux内核编译以及perfctr模块安装零、需求介绍 需要使用PAPI得到硬件级的数据,例如CPU clock time,L1/L2 cache miss等,而PAPI需要perfctr(Performance-monitoring counters support)模块支持,而内核当中并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,545
精华内容 1,818
关键字:

linux内核编译模块

linux 订阅