精华内容
下载资源
问答
  • 内核目录外对驱动程序进行编译 1.在内核目录中需要对相关信息进行配置以适应不同架构的开发板,需要设置以下相关环境变量: 2.1板子架构 ARCH 2.2交叉编译工具 CROSS_COMPILE 2.3编译文件存储路径 PATH 2.当上述...

    在内核目录外对驱动程序进行编译
    1.在内核目录中需要对相关信息进行配置以适应不同架构的开发板,需要设置以下相关环境变量:
    2.1板子架构 ARCH
    2.2交叉编译工具 CROSS_COMPILE
    2.3工具链路径 PATH
    2.当上述环境变量配置完成之后就可以在内核目录以外对驱动进行编译,需要对Makefile进行修改;
    选用交叉编译工具链是需要注意工具链所使用的的ARM指令集是否与目标板指令集相同,否则会导致交叉编译出来的可执行文件无法运行,与目标板无法适配。

    配置环境变量在这里插入图片描述
    或者使用export单独设置如:
    在这里插入图片描述

    修改makefile,设置编译规则

    KVERSION = $(shell uname -r)            //内核版本
    KERN_DIR =  /lib/modules/$(KVERSION)/build     //内核目录
    
    all:
            make -C $(KERN_DIR) M=`pwd` modules      //-C $(KERN_DIR)为内核目录    M=`pwd`编译当前目录模块     modules编译模块
    
    clean:
            make -C $(KERN_DIR) M=`pwd` modules clean
            rm -rf modules.order
    
    obj-m   += hello_drv.o             //描述编译哪个模块
    ~                       
    

    在内核目录中对驱动程序进行编译
    在内核目录中的Makefile中编译选项通常有以下三种形式
    obj-m为将驱动程序编译成模块的形式
    obj-y为将驱动程序编译进内核中
    第三种形式可以通过使用make menuconifg指令对编译的形式进行设置
    在这里插入图片描述
    对于第三种形式,变量的设置使用的是当前目录下.config文件中的设置,而.config就是通过make xxx_defconfig编译将xxx_defconfig复制成的.config文件。修改.config的相关配置需要用到make menuconfig,使用该命令会出现Ncurses界面,这个界面又是由当前目录下Kconfig文件对其进行设定的。

    利用第三种形式编译一个驱动文件过程:
    编写之前的有关信息
    添加新程序之前的menuconfig
    在这里插入图片描述
    界面中的选项来自于各个目录下的Kconfig
    在这里插入图片描述
    查看内核目录里/driver/char中的Kconfig
    在这里插入图片描述
    1.在内核目录下使用gedit文本编辑工具进入相应的目录下Kconfig,添加新配置选项,设置为bool变量,只能有两种取值方式一种是编译进内核一种是无。
    在这里插入图片描述
    2.内核目录下执行make menuconfig
    通过搜索找到新添加的配置项CAOHAI_LED,以及其在界面中的位置
    在这里插入图片描述
    在对应的界面路径中找到对应的配置选项
    在这里插入图片描述
    3.内核目录中使用vi .config查看配置
    在这里插入图片描述
    找到对应的选项可以看到已经被按照默认选项编译进内核
    在这里插入图片描述

    其他注意事项:
    如果编译时不包含该选项时:
    在make menuconfig中设置该选项
    在这里插入图片描述
    此时可以看到该项被注释掉
    在这里插入图片描述
    如果想要将配置项设置为编译成模块就要重新设置Kconfig中的相关选项将bool换成tristate
    在这里插入图片描述
    在make menuconfig界面中设置为编译成模块的形式
    在这里插入图片描述
    再查看.config中的形式
    在这里插入图片描述
    将配置项与对应的驱动程序相关联
    进入到对应的驱动目录下,此处为内核的/driver/char内,在Makefile中添加相应的配置项
    在这里插入图片描述
    之后就可以在内核目录下使用make进行编译

    learned from:韦东山

    展开全文
  • linux内核目录分析

    2021-10-16 21:17:47
    最近准备开始研读linux的内核了, 今天在deepin内核版本为4.8.15上编译安装了内核4.19.6, 本来是先装2.6.16版本的, 但2.6.16版本的内核版本要求gcc的版本为4.6之下, 装4.6版本的gcc的时候出了点问题, 还没解决 ...

    最近准备开始研读linux的内核了, 今天在deepin内核版本为4.8.15上编译安装了内核4.19.6, 本来是先装2.6.16版本的, 但2.6.16版本的内核版本要求gcc的版本为4.6之下, 装4.6版本的gcc的时候出了点问题, 还没解决,
    安装教程内核编译教程, 结束后重启在grub的界面上选advance的选项, 就有不同版本的内核选项了,选择你需要的就好了

    基本的目录分析
    在这里插入图片描述

    展开全文
  • linux内核目录详解

    2021-07-26 15:34:25
    内核源码目录: > arch: 包含和硬件体系相关的的代码,每种硬件平台占一个相应的目录,如i386,arm, arm64, powerpc,mips等。 > block: 块设备驱动程序I/O调度。 > crypto: 常用的加密和散列算法,还有一些...

    内核源码目录:

    > arch:  包含和硬件体系相关的的代码,每种硬件平台占一个相应的目录,如i386,arm, arm64, powerpc,mips等。
    > block: 块设备驱动程序I/O调度。
    > crypto: 常用的加密和散列算法,还有一些压缩和CRC校验算法。
    > documentation:内核各部分的通用解释和注释。
    > drivers:设备驱动程序,各个不同的驱动占用一个子目录。
    > fs: 所支持的各种文件系统。
    > include:头文件,与系统相关的头文件位置放在include/linux子目录下。
    > init:内核初始化代码,著名的start_kernel()就位于init/main.c文件中。
    > ipc: 进程间通信的代码。
    > kernel:内核最核心的部分,包括进程调度,定时器等,和平台相关的一部分代码放在arch/*/kernel 下。
    > lib: 库文件代码。
    > mm: 内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
    > net:网络相关的代码,实现各种常见的网络协议。
    > scripts:用于配置内核的脚本文件。
    > security: 主要是一个SELLinux模块。
    > sound: ALSA.OSS  音频设备的驱动核心代码和常用驱动设备。
    > usr: 实现用于打包和压缩的cpio等。
    > include: 内核API级别头文件
    

    希望看到此文章的小伙伴们,如果有什么错误,欢迎下方留言,博客肯定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个小小的赞👍。 谢谢❥(^_-)

    展开全文
  • 内核目录树建立(完整版)致读者:很高兴和大家一起分享我的一些实践经历,下面我将要介绍给大家的是驱动程序以模块方式加载进内核开发环境的搭建,即内核目录树的建立;请读者注意当你想开始动手做时,请先了解一些...

    内核目录树建立(完整版)

    致读者:

    很高兴和大家一起分享我的一些实践经历,下面我将要介绍给大家的是驱动程序以模块方式加载进内核开发环境的搭建,即内核目录树的建立;请读者注意当你想开始动手做时,请先了解一些内核驱动的基本知识,我在这里就不说了。同时要安装的内核源代码最好与你的linux内核版本相同,这样不会出现很多不必要的问题,要记住:“我们是做开发,而不是做环境”。

    一、首先将源码包解压,如下:

    [root@localhost /]# rpm -Uvh kernel-2.6.11-1.1369_FC4.src.rpm

    这个命令将RPM内容写到路径/usr/src/redhat/SOURSE和/usr/src/redhat/SPECS

    执行效果如下:

    warning: kernel-2.6.11-1.1369_FC4.src.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2

    1:kernel ########################################### [100%]

    二、build源码包

    进入到如下目录:

    # cd /usr/src/redhat/SPECS

    [root@localhost SPECS]# pwd

    /usr/src/redhat/SPECS

    [root@localhost SPECS]# ls

    kernel-2.6.spec

    [root@localhost SPECS]#

    然后执行:

    #rpmbuild -bp --target i686 kernel-2.6.spec

    这个命令将会把内核源码树放到如下目录,如下:[root@localhost linux-2.6.11]# pwd

    /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11

    注:再没有执行上面语句时,BUILD目录为空,执行后该目录下生成了kernel-2.6.11/linux-2.6.11,目录下内容如下:

    [root@localhost linux-2.6.11]# ls

    archDocumentationipcmmsecurity

    configsdriverskernelnetsound

    COPYINGfslibREADMEusr

    CREDITSincludeMAINTAINERSREPORTING-BUGS

    cryptoinitMakefilescripts

    [root@localhost linux-2.6.11]#

    三、配置内核

    Fedora Core附带的内核配置文件在/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11/configs目录下

    例如,i686 SMP配置文件被命名为configs/kernel-version-i686-smp.config。

    源代码目录如下:

    [root@localhost configs]# pwd

    /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11/configs//配置文件目录

    [root@localhost configs]# ls//内容如下:

    kernel-2.6.11-i586.configkernel-2.6.11-i686-xen0.config

    kernel-2.6.11-i686.configkernel-2.6.11-i686-xenU.config

    kernel-2.6.11-i686-smp.config

    [root@localhost configs]#

    然后,使用下列命令来将需要的配置文件复制到合适的位置,用来编译:#cd /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11#cp configs/kernel-version-i686.config .config//记住要养成备份的好习惯!

    上面我们选择了kernel-version-i686-smp.config这个配置文件,用户可以根据自己的需求来选择configs目录下的内核配置文件。

    [root@localhost linux-2.6.11]# cp configs/kernel-2.6.11-i686-smp.config .config

    cp:是否覆盖‘.config’? y

    上面的命令执行以后会将linux-2.6.11目录下的.config文件覆盖。

    如果你不是多处理器不要选择kernel-2.6.11-i686-smp.config,如果你选错了,在后面之安装驱动文件的时候会出现如下错误:

    [root@localhost hello]# insmod hello.ko

    insmod: error inserting 'hello.ko': -1 Invalid module format

    然后查看日志信息:

    [root@localhost hello]# cat /var/log/messages

    Nov 22 18:27:10 localhost kernel: hello: version magic '2.6.11-1.1369_FC4SMP686 REGPARM 4KSTACKS gcc-4.0' should be '2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0'

    也许当你看到这条信息的时候,你应该明白了,我不想读者跟我犯一样的错误。

    接下来执行

    #make menuconfig(图片无法显示,请查看附件)

    然后选择Loadable module supportà,读者可以默认配置选项。同时读者也可以根据自己的需求来配置

    注:第一项必须选择,因为它可以使驱动程序已模块的方式加载到内核中,同时读者还应该注意有几个选项后面有EXPERIMENTAL字样,说明不是很稳定,建议去掉。

    配置好后就保存退出即可。

    四、修改Makefile:每个内核的名字都包含了它的版本号,这也是uname -r命令显示的值。内核Makefile的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的Makefile。例如,如果uname -r返回字符串2.6.11-1.1369_FC4,就将EXTRAVERSION定义从:EXTRAVERSION = -prep修改为:EXTRAVERSION = -1.1369_FC4

    执行如下:

    [root@localhost linux-2.6.11]#uname -r

    2.6.11-1.1369_FC4

    [root@localhost linux-2.6.11]#Vim Makefile

    读者只需修改第四行即可。

    五.编译内核:跟普遍的编译方法一样,执行如下:# make bzImage编译内核

    最后结果:

    。。。。。。。。。。。。。。。。。。。。。省略

    HOSTCCarch/i386/boot/tools/build

    BUILDarch/i386/boot/bzImage

    Root device is (8, 3)

    Boot sector 512 bytes.

    Setup is 7290 bytes.

    System is 1513 kB

    Kernel: arch/i386/boot/bzImage is ready

    [root@localhost linux-2.6.11]#

    # make modules编译模块

    安装模块,即编译.config文件中以M选项的代码

    。。。。。。。。。。。。。。。。。。。。。。省略

    CCsound/synth/snd-util-mem.mod.o

    LD [M]sound/synth/snd-util-mem.ko

    CCsound/usb/snd-usb-audio.mod.o

    LD [M]sound/usb/snd-usb-audio.ko

    CCsound/usb/snd-usb-lib.mod.o

    LD [M]sound/usb/snd-usb-lib.ko

    CCsound/usb/usx2y/snd-usb-usx2y.mod.o

    LD [M]sound/usb/usx2y/snd-usb-usx2y.ko

    [root@localhost linux-2.6.11]#

    # make modules_install安装编译

    编译结果:

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。省略

    INSTALL sound/usb/snd-usb-audio.ko

    INSTALL sound/usb/snd-usb-lib.ko

    INSTALL sound/usb/usx2y/snd-usb-usx2y.ko

    if [ -r System.map -a -x /sbin/depmod ]; then /sbin/depmod -ae -F System.map2.6.11-1.1369_FC4; fi

    六、完成“内核树”的安装

    目录“/usr/src/redhat/BUILD/kernel-2.6.11/kernel-2.6.11.686/”就是所谓的“内核代码树”但是“/lib/modules/2.6.11-1.1369_FC4/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”。

    查看如下:

    [root@localhost 2.6.11-1.1369_FC4]# pwd

    /lib/modules/2.6.11-1.1369_FC4

    [root@localhost 2.6.11-1.1369_FC4]# ll

    总用量1048

    lrwxrwxrwx1 root root48 11月22 15:10 build -> /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11

    drwxr-xr-x9 root root4096 11月22 15:11 kernel

    drwxr-xr-x2 root root4096 10月22 20:53 misc

    -rw-r--r--1 root root 193905 11月22 15:13 modules.alias

    -rw-r--r--1 root root69 11月22 15:13 modules.ccwmap

    -rw-r--r--1 root root 233305 11月22 15:13 modules.dep

    -rw-r--r--1 root root813 11月22 15:13 modules.ieee1394map

    -rw-r--r--1 root root357 11月22 15:13 modules.inputmap

    -rw-r--r--1 root root16284 11月22 15:13 modules.isapnpmap

    -rw-r--r--1 root root 168540 11月22 15:13 modules.pcimap

    -rw-r--r--1 root root89298 11月22 15:13 modules.symbols

    -rw-r--r--1 root root 267526 11月22 15:13 modules.usbmap

    lrwxrwxrwx1 root root48 11月22 15:10 source -> /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11

    [root@localhost 2.6.11-1.1369_FC4]#

    七、测试

    首先编写hello.c源文件,如下:

    1 #include

    2 #include

    3

    4 MODULE_LICENSE("Dual BSD/GPL");

    5

    6 static int hello_init(void)

    7 {

    8printk(KERN_ALERT"Hello world\n");

    9return 0;

    10 }

    11

    12 static void hello_exit(void)

    13 {

    14printk(KERN_ALERT"Goodbye\n");

    15 }

    16

    17 module_init(hello_init);

    18 module_exit(hello_exit);

    编写Makefile内容如下:

    1 ifneq ($(KERNELRELEASE),)

    2 obj-m:=hello.o

    3 else

    4KERNELDIR ?=/lib/modules/$(shell uname -r)/build

    5PWD :=$(shell pwd)

    6 default:

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

    8 endif

    请注意Makefile的语法规则。

    执行效果如下:

    [root@localhost hello]# pwd

    /hello

    [root@localhost hello]# ls

    hello.cMakefile

    [root@localhost hello]#make

    make -C /lib/modules/2.6.11-1.1369_FC4/build M=/hello modules

    make[1]: Entering directory `/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11'

    CC [M]/hello/hello.o

    Building modules, stage 2.

    MODPOST

    CC/hello/hello.mod.o

    LD [M]/hello/hello.ko

    make[1]: Leaving directory `/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11'

    [root@localhost hello]#

    [root@localhost hello]# ls

    hello.chello.kohello.mod.chello.mod.ohello.oMakefile

    读者可以看到在hello目录下生成了hello.ko文件,这个就是2.6内核的驱动文件名。

    八、安装编译好的hello驱动。

    # insmod hello.ko应该可以看到返回的信息:Hello world然后再运行命令:# rmmod hello应该可以看到返回的信息:Goodbye

    如果你没有看到,那么你可以看日志信息:

    #cat /var/log/messages

    总之:学习靠自己,继续努力吧!

    展开全文
  • linux4.14.98的内核目录结构如图: arch 与体系结构相关的代码放在这里,例如:arm、x86、powerpc。 block 部分块设备驱动程序。 crypto 内核本身所用的加密 API,实现了常用的加密和散列算法,还有一些压缩和 CRC...
  • 任何偶数的核心(的二个数为偶数,例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心核心源程序的文件按树形结构进行组织,在源程序树的最上层,即目录/usr/src/linux下有这样...
  • 第一章 绪论Linux与其他类Unix内核的比较硬件的依赖性Linux版本操作系统基本概念Unix文件系统概述Unix内核概述第二章 内存寻址内存地址硬件中的分段Linux中的分段硬件中的分页Linux中的分页第三章 进程进程、轻量级...
  • Linux内核目录结构 Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并且使用Makefile组织配置编译。 初次接触Linux内核,最好仔细阅读顶层目录的readme文件,它是Linux内核的概述和编译命令...
  • 《LINUX内核源码目录结构分析和配置》由会员分享,可在线阅读,更多相关《LINUX内核源码目录结构分析和配置(3页珍藏版)》请在人人文库网上搜索。1、内核版本 2.6.31做嵌入式开发一般都是进行LINUX内核的移植,要想...
  • Linux的内核位于下列哪个目录?更多相关问题餐饮管理调研作业.doc深度优先搜索和宽度优先搜索都属于盲目搜索下面有关PC机1/0总线的叙述中,错误的是鉴证业务包括的要素有( )具三面增厚木栓细胞、橡胶丝团块及厚壁石...
  • 内核源码简介2.Linux内核源代码目录树结构tree指令查看内核源码目录树 1.交叉编译工具的安装 参照我之前的笔记 2.内核源码获取 下载哪个版本取决于树莓派的版本,用命令查看 uname -r 官网是外网下载慢,这里是...
  • 一、Linux内核的配置系统由三个部分组成,分别是:1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;3、...
  • 如何查询Linux内核版本以下文字资料是由(历史新知网...如何查询Linux内核版本终端下输入[xxxx@ ~]uname -r3.5.0-34-generic查看内核版本命令:1) [root@q1test01 ~]# cat /proc/versionLinux version 2.6.9-22.EL...
  • 也就是执行下面的规则: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 这条规则展开之后就是: make –C /home/linux/linux3.14/M=/home/linux/test/ modules 其中: -C 表示到存放内核目录执行其makefile,在执行...
  • 基于35DIR内核,以及lply主题修改版,完善主题中不友好的体验和演示,删除一些不必要的功能; 替换目录中缩略图获取第三方接口、以及支持HTTP和HTTPS网址模式; 修复主题中对于服务器兼容问题BUG共10多项; 建议基于...
  • 内核驱动进阶

    2021-05-10 17:03:58
    在网上找了好久关于内核驱动学习的文章,但很多都是关注于某一点,没有系统化对于内核初学者来说,看那些文章最后你可能学到一些知识但是并不系统化,这也是为什么我写这篇博文的目的,本文是我通过看国嵌视频整理...
  • Linux内核目录树分析一、前言二、Linux内核源代码目录树结构 一、前言   最近系统与安全课上,老师反复提起到Linux驱动程序和Linux内核,这两个词语反复被老师提及,都可以成为系统与网络安全的这门课的代名词了,...
  • android 目录结构说明

    2021-06-08 17:28:44
    android目录结构说明(2012-04-14 09:53:04)标签:杂谈|– Makefile (全局的Makefile文件)???? |– bionic (Bionic含义为仿生,这里面是一些基础的C库源代码)???? |– bootloader (引导加载器)???? |– build (build...
  • 一、方法一在内核目录以外编译ko文件1、编写hello模块代码#include #include #include MODULE_LICENSE("GPL");MODULE_AUTHOR("kent");static int __init hello_init(){printk(KERN_ALERT "hello, world - this is ...
  • 《精通Linux内核:智能设备开发核心技术》共五篇,以从易到难的顺序详细剖析了Linux内核开发的核心技术。“知识储备篇”介绍了Linux的数据结构、中断处理、内核同步和时间计算等内容,这些是理解后续章节的前提。...
  • 修改 limits.conf 文件后,需要重启系统生效 内核设置 Linux 操作系统修改内核参数有3种方式: 修改 /etc/sysctl.conf 文件,加入配置选项,格式为 key = value ,修改保存后调用 sysctl -p 加载新配置 使用 sysctl ...
  • 最近在做LDD书上的一些例子, 为了统一管理代码的编译,使内核模块的编译跟应用程序的编译过程一致,决定使用CMake来做工程的编译,编译脚本如下:cmake_minimum_required(VERSION 2.8)project(ldd)set(KERNEL_DIR /usr/...
  • 一、内核目录 二、介绍 1、arch 平台目录,所有硬件平台的代码,处理器原厂提供一套Linux内核的源码,每个CPU的子目录,为boot,mm,kernel等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置...
  • 内核目录树中我们可以看到内核编译系统的顶层Makefile文件。但是如此复杂、庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂、庞大,且为Linux内核定制的Makefile系统。她...
  • /proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改。下面我们以打开内核的 ip转发功能为例说明在系统运行时修改内核参数的两种方法。IP转发是指允许系统对来源和目的地都不是本机的...
  • Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。Arch目录包括了所有和体系...
  • 主要参考:https://www.linux.cn/article-6137-1.html1. 从http://kernel.ubuntu.com/~kernel-ppa/mainline/ 中找到需要的内核版本,进入对应的文件路径。2. 选择.deb文件,按照操作系统类型,32位的选择i386后缀,...
  • 编译linux内核步骤:1、安装内核如果内核已经安装(/usr/src/目录有linux子目录),跳过。如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字,表示内核的版本号),比如RedHat ...
  • Linux内核版本号及源代码目录树结构一、linux内核版本号的命名机制Linux内核版本有两种:稳定版和开发版。稳定的内核具有工业级的强度,可以广泛地应用和部署。新的稳定内核相对于较旧的只是修正一些bug或加入一些新...
  • 要进行嵌入式Linux产品的内核驱动开发,需要先了解内核目录的各文件夹下源码的作用,本文介绍Linux内核源码目录树下的各目录文件的作用。目录树概览解压Linux内核源码压缩包,将得到内核源码。内核源码很复杂,包含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 485,618
精华内容 194,247
关键字:

内核目录