精华内容
下载资源
问答
  • linux内核配置实例

    2010-11-10 22:09:00
    第一部分:准备工作   Linux内核有着庞大的代码量,超过700万行,但它确实是一个非常灵活的操作系统。现在发行版linux已经具备很强的适应能力,能编译支持绝大部分设备(发行版)。但是可能你会有与...

    第一部分:准备工作

     

    Linux内核有着庞大的代码量,超过700万行,但它确实是一个非常灵活的操作系统。现在发行版linux已经具备很强的适应能力,能编译支持绝大部分设备(发行版)。但是可能你会有与大多数用户不同的需求,或者你有个不同的硬件。通过针对特定环境的定制,你可以使它更加匹配你的硬件平台。

     

    构建内核所需要的工具:

    编译器,链接器,make工具。编译器我们选择GCClinux内核主要由C语言和少量的汇编语言来编写。GCC版本不必要求过高,否则可能导致内核编译出错。

    连接器我们选择binutilsGCC并不能自己完成所有编译,binutils用来完成源文件的汇编和链接。make工具是一个编译管理工具,它能遍历内核源码树以确定需要进行编译的文件,然后调用编译器和其它构建所需要的工具完成内核的构建工作。内核的构建需要GUN版的make。查看这三个工具版本的命令分别是:gcc --version,ld -v,make --version

     

    使用内核所需要的工具:

    通常当前运行内核的版本不会影响任何用户的应用程序,但是对于个别程序,内核版本是至关重要的。如果你的内核已经升级,那么其中一些软件需要升级。

    Util-linux:

    它是一个小工具的集合,其中大多数工具用来控制磁盘分区的创建和挂载,并控制系统的硬件时钟。查看它的版本命令为:fdformat --version

    module-init-tools:

    如果需要使用linux内核模块,就要用到这个工具。内核模块是一个可以在内核运行时添加或删除得可加载代码块。把驱动程序编译成内核模块很有用,内核可以只加载与当前系统有关的驱动程序。为了根据当前硬件加载所需的驱动和选项,所有linux发行版本都使用模块,儿不是把所有内核中需要的驱动程序和选项都编译成一大块。这样就可以节省内存,只加载正确控制机器所需的机器代码。查看它的版本命令为:depmod -v

    文件系统相关工具:

    不同的文件系统,需要用不同的工具来创建,格式化,配置,修复磁盘分区。Util-linux软件包中包含其中一些工具,但是比较流行的文件系统有单独的软件包,其中包含操作这些文件系统的必要程序。用ext2/ext3/ext4来举例,它们被同样的工具管理,这个工具就是e2fsprogs软件包。查看它的版本命令为:tune2fs

     

    其他工具:

    udev是一个能让linux/dev目录下提供固定设备命名系统的程序。几乎所有的linux发行版都用udev来管理/dev目录,因此如果没有它计算机将无法启动。但是udev依赖于/sys目录的结构,这个结构随着内核的变化而变化,有些变化会损坏udev,使计算机无法启动。请尽量使用linux发行版的udev。查看它的版本命令为:udevinfo -V

    进程管理工具procps软件包,用于管理和监视进程的便利工具。

    PCMCIA工具用来配置linux下运行的PCMCIA设备。

     

    第二部分:操作实例

     

    在准备工作完成后,我们将进行下一步,源码的挑选。所有的linux内核源码都可以在kernel.org网站上找到。用wget下载2.6.30版内核,输入wget http://www.kernel.org/pub/linux/v2.6/linux-2.6.30.7.tar.bz2。现在合适的源码已经被下载,在主目录下建立一个名为linux的目录,来存放内核源码文件。

    mkdir ~/linux

    mv ~/linux-2.6.30.tar.bz2 ~/linux/

    进入linux目录,并解压内核源码。

    tar –xzvf linux-2.6.30.tar.bz2

     

    至此,我们已经将源码放置在合适的位置,接下来就该构建内核。首先选择适当的配置,然后编译内核。这两步都使用make工具完成。

     

    创建内核配置:

    内核配置保存在内核源码树顶级目录下名为.config的文件中。刚解压完的内核源码中没有.config文件,需要手动创建。

    cd linux-2.6.30

    make defconfig/*创建默认内核配置,使系统可以正常运转*/

    接下来我们需要根据自己的需要来修改配置。完成此项工作我们选择基于终端的配置工具menuconfig。工具虽然有了,但是我们并不知道用这个工具来编译哪些文件。下面我们将在内核中来查找针对我们自己的硬件的信息。插入我的usb转接头,键入命令:

    lsusb/*查看所有连接到系统的USB设备*/

    USB设备很容易移除,我们可以拔掉那个USB设备,然后再运行一遍lsusb命令,这样就可以确定以上哪条信息是针对你的新硬件的了。

    Bus 002 Device 003: ID 0403:6001 Future Technology Devices International,Ltd FT232 USB-Serial (UART) IC/*我的硬件识别信息*/

    其中ID 0403:6001这个信息对我们很有用处,我们需要用它来查找内核中与硬件匹配的信息。0403代表的是厂商ID,就是哪家厂商。6001是硬件ID

    下面开始用0403搜索内核源码树:

    grep -i -R  -l 0403 drivers/*

    该命令执行完后,会在屏幕上显示若干条以.data .c .h等为结尾的文件,比如drivers/net/wireless/XXXXX.X,不用看最后一部分,前三个目录名就可以确定这是个USB无线设备。同样的判断方法,我们就可以确定我们需要的内核文件了。以防万一,我们进入这个文件中,USB驱动告诉内核它们支持哪些谁被,以便内核可以把驱动绑定到设备上。一般在一个结构体变量中列出制造商ID和设备ID。如果我们设备的制造商ID和设备ID在里面的话,说明这个驱动支持我们的硬件设备。

    cd linux-2.6.30/*进入内核文件中*/

    find –type f –name Makefile | xargs grep XXXXX/*会显示一个以CONFIG_为前缀的字段*/

    找到这个字段后,返回内核Makefile文件中,使用内核配置工具menuconfig,搜索这个字段。最后在该程序菜单中相应位置启动这个驱动。

     

     

     

    第三部分:整体思路及总结

     

    下面我来说说我的整体思路。确定一个新设备由哪个驱动控制的最简单的方法,就是把内核源码树中所有此类驱动构建成模块,并让udev完成设备和驱动的匹配。同时,这些为设备匹配驱动的步骤取决于你所使用的设备类型。由于设备地不同,为其确定驱动的步骤也不尽相同。

     

    总的来说,查找特定USB设备驱动步骤是:

    1,找到需要驱动的USB设备制造商ID和产品ID,分别在添加和移除设备后使用lsusb来查看列表中发生的改变。

    2,在内核源码树种搜索USB设备制造商ID和产品ID。它们都应该在架构提struct usb_device_id中定义。

    3,使用findgrep在内核的Makefile文件中查找用于构建该模块的以CONFIG_为前缀的字段。find –type f –name Makefile | xargs grep DRIVER_NAME

    4,在内核配置系统中搜索这个配置的值,在菜单中进入到相应的位置并启用这个选项来构建内核驱动。

    展开全文
  • Linux 内核配置系统浅析

    千次阅读 2005-01-26 01:28:00
    Linux 内核配置系统浅析英文原文-->内容:配置系统的基本结构Makefile配置文件实例参考资料关于作者相关内容:介绍介绍-->在 Linux 专区还有:
    Linux 内核配置系统浅析
    内容:
    配置系统的基本结构
    Makefile
    配置文件
    实例
    参考资料
    关于作者
    在 Linux 专区还有:
    教程
    工具与产品
    代码与组件
    文章

    汤凯 (tangk73@hotmail.com)

    2003 年 2 月

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linux 的内核配置系统。

    众所周知,Linux 内核是由分布在全球的 Linux 爱好者共同开发的,Linux 内核每天都面临着许多新的变化。但是,Linux 内核的组织并没有出现混乱的现象,反而显得非常的简洁,而且具有很好的扩展性,开发人员可以很方便的向 Linux 内核中增加新的内容。原因之一就是 Linux 采用了模块化的内核配置系统,从而保证了内核的扩展性。

    本文首先分析了 Linux 内核中的配置系统结构,然后,解释了 Makefile 和配置文件的格式以及配置语句的含义,最后,通过一个简单的例子--TEST Driver,具体说明如何将自行开发的代码加入到 Linux 内核中。在下面的文章中,不可能解释所有的功能和命令,只对那些常用的进行解释,至于那些没有讨论到的,请读者参考后面的参考文献。

    1. 配置系统的基本结构

    Linux内核的配置系统由三个部分组成,分别是:

    1. Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;
    2. 配置文件(config.in):给用户提供配置选择的功能;
    3. 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。

    这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。所以,在本文中,我们只对 Makefile 和配置文件进行讨论。另外,凡是涉及到与具体 CPU 体系结构相关的内容,我们都以 ARM 为例,这样不仅可以将讨论的问题明确化,而且对内容本身不产生影响。

    2. Makefile

    2.1 Makefile 概述

    Makefile 的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成 Linux 内核二进制文件。

    由于 Linux 内核源代码是按照树形结构组织的,所以 Makefile 也被分布在目录树中。Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有:

    1. Makefile:顶层 Makefile,是整个内核配置、编译的总体控制文件。
    2. .config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。
    3. arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如 arch/arm/Makefile,是针对特定平台的 Makefile。
    4. 各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。
    5. Rules.make:规则文件,被所有的 Makefile 使用。

    用户通过 make config 配置后,产生了 .config。顶层 Makefile 读入 .config 中的配置选择。顶层 Makefile 有两个主要的任务:产生 vmlinux 文件和内核模块(module)。为了达到此目的,顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录,取决于内核的配置。在顶层 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 体系结构下的 Makefile,这个 Makefile 中包含了平台相关的信息。

    位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。

    Rules.make 文件起着非常重要的作用,它定义了所有 Makefile 共用的编译规则。比如,如果需要将本目录下所有的 c 程序编译成汇编代码,需要在 Makefile 中有以下的编译规则:

            %.s: %.c
            $(CC) $(CFLAGS) -S $< -o $@
            

    有很多子目录下都有同样的要求,就需要在各自的 Makefile 中包含此编译规则,这会比较麻烦。而 Linux 内核中则把此类的编译规则统一放置到 Rules.make 中,并在各自的 Makefile 中包含进了 Rules.make(include Rules.make),这样就避免了在多个 Makefile 中重复同样的规则。对于上面的例子,在 Rules.make 中对应的规则为:

            %.s: %.c
            $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $< -o $@
            

    2.2 Makefile 中的变量

    顶层 Makefile 定义并向环境中输出了许多变量,为各个子目录下的 Makefile 传递一些信息。有些变量,比如 SUBDIRS,不仅在顶层 Makefile 中定义并且赋初值,而且在 arch/*/Makefile 还作了扩充。

    常用的变量有以下几类:

    1) 版本信息
    版本信息有:VERSION,PATCHLEVEL, SUBLEVEL, EXTRAVERSION,KERNELRELEASE。版本信息定义了当前内核的版本,比如 VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXATAVERSION=-rmk7,它们共同构成内核的发行版本KERNELRELEASE:2.4.18-rmk7

    2) CPU 体系结构:ARCH
    在顶层 Makefile 的开头,用 ARCH 定义目标 CPU 的体系结构,比如 ARCH:=arm 等。许多子目录的 Makefile 中,要根据 ARCH 的定义选择编译源文件的列表。

    3) 路径信息:TOPDIR, SUBDIRS
    TOPDIR 定义了 Linux 内核源代码所在的根目录。例如,各个子目录下的 Makefile 通过 $(TOPDIR)/Rules.make 就可以找到 Rules.make 的位置。
    SUBDIRS 定义了一个目录列表,在编译内核或模块时,顶层 Makefile 就是根据 SUBDIRS 来决定进入哪些子目录。SUBDIRS 的值取决于内核的配置,在顶层 Makefile 中 SUBDIRS 赋值为 kernel drivers mm fs net ipc lib;根据内核的配置情况,在 arch/*/Makefile 中扩充了 SUBDIRS 的值,参见4)中的例子。

    4) 内核组成信息:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS
    Linux 内核文件 vmlinux 是由以下规则产生的:

    vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
    	$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o /
    		--start-group /
    		$(CORE_FILES) /
    		$(DRIVERS) /
    		$(NETWORKS) /
    		$(LIBS) /
    		--end-group /
    		-o vmlinux
    
    可以看出,vmlinux 是由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS 和 LIBS 组成的。这些变量(如 HEAD)都是用来定义连接生成 vmlinux 的目标文件和库文件列表。其中,HEAD在arch/*/Makefile 中定义,用来确定被最先链接进 vmlinux 的文件列表。比如,对于 ARM 系列的 CPU,HEAD 定义为:
    HEAD            := arch/arm/kernel/head-$(PROCESSOR).o /
                       arch/arm/kernel/init_task.o
    
    表明 head-$(PROCESSOR).o 和 init_task.o 需要最先被链接到 vmlinux 中。PROCESSOR 为 armv 或 armo,取决于目标 CPU。 CORE_FILES,NETWORK,DRIVERS 和 LIBS 在顶层 Makefile 中定义,并且由 arch/*/Makefile 根据需要进行扩充。 CORE_FILES 对应着内核的核心文件,有 kernel/kernel.o,mm/mm.o,fs/fs.o,ipc/ipc.o,可以看出,这些是组成内核最为重要的文件。同时,arch/arm/Makefile 对 CORE_FILES 进行了扩充:
    # arch/arm/Makefile
    
    # If we have a machine-specific directory, then include it in the build.
    MACHDIR         := arch/arm/mach-$(MACHINE)
    ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))
    SUBDIRS         += $(MACHDIR)
    CORE_FILES      := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)
    endif
    
    HEAD            := arch/arm/kernel/head-$(PROCESSOR).o /
                       arch/arm/kernel/init_task.o
    SUBDIRS         += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe
    CORE_FILES      := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)
    LIBS            := arch/arm/lib/lib.a $(LIBS)
    

    5) 编译信息:CPP, CC, AS, LD, AR,CFLAGS,LINKFLAGS
    在 Rules.make 中定义的是编译的通用规则,具体到特定的场合,需要明确给出编译环境,编译环境就是在以上的变量中定义的。针对交叉编译的要求,定义了 CROSS_COMPILE。比如:

    CROSS_COMPILE   = arm-linux-
    CC              = $(CROSS_COMPILE)gcc
    LD              = $(CROSS_COMPILE)ld
    ......
    
    CROSS_COMPILE 定义了交叉编译器前缀 arm-linux-,表明所有的交叉编译工具都是以 arm-linux- 开头的,所以在各个交叉编译器工具之前,都加入了 $(CROSS_COMPILE),以组成一个完整的交叉编译工具文件名,比如 arm-linux-gcc。
    CFLAGS 定义了传递给 C 编译器的参数。
    LINKFLAGS 是链接生成 vmlinux 时,由链接器使用的参数。LINKFLAGS 在 arm/*/Makefile 中定义,比如:
    # arch/arm/Makefile
    
    LINKFLAGS       :=-p -X -T arch/arm/vmlinux.lds
    

    6) 配置变量CONFIG_*
    .config 文件中有许多的配置变量等式,用来说明用户配置的结果。例如 CONFIG_MODULES=y 表明用户选择了 Linux 内核的模块功能。
    .config 被顶层 Makefile 包含后,就形成许多的配置变量,每个配置变量具有确定的值:y 表示本编译选项对应的内核代码被静态编译进 Linux 内核;m 表示本编译选项对应的内核代码被编译成模块;n 表示不选择此编译选项;如果根本就没有选择,那么配置变量的值为空。

    2.3 Rules.make 变量

    前面讲过,Rules.make 是编译规则文件,所有的 Makefile 中都会包括 Rules.make。Rules.make 文件定义了许多变量,最为重要是那些编译、链接列表变量。

    O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目录下需要编译进 Linux 内核 vmlinux 的目标文件列表,其中 OX_OBJS 和 LX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

    M_OBJS,MX_OBJS:本目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS 中的 "X" 表明目标文件使用了 EXPORT_SYMBOL 输出符号。

    O_TARGET,L_TARGET:每个子目录下都有一个 O_TARGET 或 L_TARGET,Rules.make 首先从源代码编译生成 O_OBJS 和 OX_OBJS 中所有的目标文件,然后使用 $(LD) -r 把它们链接成一个 O_TARGET 或 L_TARGET。O_TARGET 以 .o 结尾,而 L_TARGET 以 .a 结尾。

    2.4 子目录 Makefile

    子目录 Makefile 用来控制本级目录以下源代码的编译规则。我们通过一个例子来讲解子目录 Makefile 的组成:

    #
    # Makefile for the linux kernel.
    #
    # All of the (potential) objects that export symbols.
    # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'.
    
    export-objs	:= tc.o
    
    # Object file lists.
    
    obj-y		:=
    obj-m		:=
    obj-n		:=
    obj-		:=
    
    obj-$(CONFIG_TC) += tc.o
    obj-$(CONFIG_ZS) += zs.o
    obj-$(CONFIG_VT) += lk201.o lk201-map.o lk201-remap.o
    
    # Files that are both resident and modular: remove from modular.
    
    obj-m		:= $(filter-out $(obj-y), $(obj-m))
    
    # Translate to Rules.make lists.
    
    L_TARGET	:= tc.a
    
    L_OBJS		:= $(sort $(filter-out $(export-objs), $(obj-y)))
    LX_OBJS		:= $(sort $(filter     $(export-objs), $(obj-y)))
    M_OBJS		:= $(sort $(filter-out $(export-objs), $(obj-m)))
    MX_OBJS		:= $(sort $(filter     $(export-objs), $(obj-m)))
    
    include $(TOPDIR)/Rules.make
    

    a) 注释
    对 Makefile 的说明和解释,由#开始。

    b) 编译目标定义
    类似于 obj-$(CONFIG_TC) += tc.o 的语句是用来定义编译的目标,是子目录 Makefile 中最重要的部分。编译目标定义那些在本子目录下,需要编译到 Linux 内核中的目标文件列表。为了只在用户选择了此功能后才编译,所有的目标定义都融合了对配置变量的判断。
    前面说过,每个配置变量取值范围是:y,n,m 和空,obj-$(CONFIG_TC) 分别对应着 obj-y,obj-n,obj-m,obj-。如果 CONFIG_TC 配置为 y,那么 tc.o 就进入了 obj-y 列表。obj-y 为包含到 Linux 内核 vmlinux 中的目标文件列表;obj-m 为编译成模块的目标文件列表;obj-n 和 obj- 中的文件列表被忽略。配置系统就根据这些列表的属性进行编译和链接。
    export-objs 中的目标文件都使用了 EXPORT_SYMBOL() 定义了公共的符号,以便可装载模块使用。在 tc.c 文件的最后部分,有 "EXPORT_SYMBOL(search_tc_card);",表明 tc.o 有符号输出。
    这里需要指出的是,对于编译目标的定义,存在着两种格式,分别是老式定义和新式定义。老式定义就是前面 Rules.make 使用的那些变量,新式定义就是 obj-y,obj-m,obj-n 和 obj-。Linux 内核推荐使用新式定义,不过由于 Rules.make 不理解新式定义,需要在 Makefile 中的适配段将其转换成老式定义。

    c) 适配段
    适配段的作用是将新式定义转换成老式定义。在上面的例子中,适配段就是将 obj-y 和 obj-m 转换成 Rules.make 能够理解的 L_TARGET,L_OBJS,LX_OBJS,M_OBJS,MX_OBJS。
    L_OBJS := $(sort $(filter-out $(export-objs), $(obj-y))) 定义了 L_OBJS 的生成方式:在 obj-y 的列表中过滤掉 export-objs(tc.o),然后排序并去除重复的文件名。这里使用到了 GNU Make 的一些特殊功能,具体的含义可参考 Make 的文档(info make)。

    d) include $(TOPDIR)/Rules.make

    3. 配置文件

    3.1 配置功能概述

    除了 Makefile 的编写,另外一个重要的工作就是把新功能加入到 Linux 的配置选项中,提供此项功能的说明,让用户有机会选择此项功能。所有的这些都需要在 config.in 文件中用配置语言来编写配置脚本,
    在 Linux 内核中,配置命令有多种方式:

    配置命令 解释脚本
    Make config, make oldconfig scripts/Configure
    Make menuconfig scripts/Menuconfig
    Make xconfig scripts/tkparse

    以字符界面配置(make config)为例,顶层 Makefile 调用 scripts/Configure, 按照 arch/arm/config.in 来进行配置。命令执行完后产生文件 .config,其中保存着配置信息。下一次再做 make config 将产生新的 .config 文件,原 .config 被改名为 .config.old

    3.2 配置语言

    1) 顶层菜单
    mainmenu_name /prompt/ /prompt/ 是用'或"包围的字符串,'与"的区别是'…'中可使用$引用变量的值。mainmenu_name 设置最高层菜单的名字,它只在 make xconfig 时才会显示。

    2) 询问语句

    	    bool            /prompt/ /symbol/
            hex             /prompt/ /symbol/ /word/
            int             /prompt/ /symbol/ /word/
            string          /prompt/ /symbol/ /word/
            tristate        /prompt/ /symbol/
    
    询问语句首先显示一串提示符 /prompt/,等待用户输入,并把输入的结果赋给 /symbol/ 所代表的配置变量。不同的询问语句的区别在于它们接受的输入数据类型不同,比如 bool 接受布尔类型( y 或 n ),hex 接受 16 进制数据。有些询问语句还有第三个参数 /word/,用来给出缺省值。

    3) 定义语句

            define_bool     /symbol/ /word/
            define_hex      /symbol/ /word/
            define_int      /symbol/ /word/
            define_string   /symbol/ /word/
            define_tristate /symbol/ /word/
    
    不同于询问语句等待用户输入,定义语句显式的给配置变量 /symbol/ 赋值 /word/。

    4) 依赖语句

            dep_bool        /prompt/ /symbol/ /dep/ ...
            dep_mbool       /prompt/ /symbol/ /dep/ ...
            dep_hex         /prompt/ /symbol/ /word/ /dep/ ...
            dep_int         /prompt/ /symbol/ /word/ /dep/ ...
            dep_string      /prompt/ /symbol/ /word/ /dep/ ...
            dep_tristate    /prompt/ /symbol/ /dep/ ...
    
    与询问语句类似,依赖语句也是定义新的配置变量。不同的是,配置变量/symbol/的取值范围将依赖于配置变量列表/dep/ …。这就意味着:被定义的配置变量所对应功能的取舍取决于依赖列表所对应功能的选择。以dep_bool为例,如果/dep/ …列表的所有配置变量都取值y,则显示/prompt/,用户可输入任意的值给配置变量/symbol/,但是只要有一个配置变量的取值为n,则/symbol/被强制成n。
    不同依赖语句的区别在于它们由依赖条件所产生的取值范围不同。

    5) 选择语句

    choice          /prompt/ /word/ /word/
    
    choice 语句首先给出一串选择列表,供用户选择其中一种。比如 Linux for ARM 支持多种基于 ARM core 的 CPU,Linux 使用 choice 语句提供一个 CPU 列表,供用户选择:
             choice 'ARM system type' /
            "Anakin                 CONFIG_ARCH_ANAKIN /
             Archimedes/A5000       CONFIG_ARCH_ARCA5K /
             Cirrus-CL-PS7500FE     CONFIG_ARCH_CLPS7500 /
    			……
             SA1100-based           CONFIG_ARCH_SA1100 /
             Shark                  CONFIG_ARCH_SHARK" RiscPC
             
    Choice 首先显示 /prompt/,然后将 /word/ 分解成前后两个部分,前部分为对应选择的提示符,后部分是对应选择的配置变量。用户选择的配置变量为 y,其余的都为 n。

    6) if语句

            if [ /expr/ ] ; then
              /statement/ 
              ...
            fi
            
            if [ /expr/ ] ; then
              /statement/
              ...
            else
              /statement/
              ...
            fi
            
    if 语句对配置变量(或配置变量的组合)进行判断,并作出不同的处理。判断条件 /expr/ 可以是单个配置变量或字符串,也可以是带操作符的表达式。操作符有:=,!=,-o,-a 等。

    7) 菜单块(menu block)语句

    mainmenu_option next_comment
    comment '…..'
    …
    endmenu
    
    引入新的菜单。在向内核增加新的功能后,需要相应的增加新的菜单,并在新菜单下给出此项功能的配置选项。Comment 后带的注释就是新菜单的名称。所有归属于此菜单的配置选项语句都写在 comment 和 endmenu 之间。

    8) Source 语句
    source /word/
    /word/ 是文件名,source 的作用是调入新的文件。

    3.3 缺省配置

    Linux 内核支持非常多的硬件平台,对于具体的硬件平台而言,有些配置就是必需的,有些配置就不是必需的。另外,新增加功能的正常运行往往也需要一定的先决条件,针对新功能,必须作相应的配置。因此,特定硬件平台能够正常运行对应着一个最小的基本配置,这就是缺省配置。

    Linux 内核中针对每个 ARCH 都会有一个缺省配置。在向内核代码增加了新的功能后,如果新功能对于这个 ARCH 是必需的,就要修改此 ARCH 的缺省配置。修改方法如下(在 Linux 内核根目录下):

    1. 备份 .config 文件
    2. cp arch/arm/deconfig .config
    3. 修改 .config
    4. cp .config arch/arm/deconfig
    5. 恢复 .config

    如果新增的功能适用于许多的 ARCH,只要针对具体的 ARCH,重复上面的步骤就可以了。

    3.4 help file

    大家都有这样的经验,在配置 Linux 内核时,遇到不懂含义的配置选项,可以查看它的帮助,从中可得到选择的建议。下面我们就看看如何给给一个配置选项增加帮助信息。

    所有配置选项的帮助信息都在 Documentation/Configure.help 中,它的格式为:

    <description>
    <variable name>
    <help file>
    

    <description> 给出本配置选项的名称,<variable name> 对应配置变量,<help file> 对应配置帮助信息。在帮助信息中,首先简单描述此功能,其次说明选择了此功能后会有什么效果,不选择又有什么效果,最后,不要忘了写上"如果不清楚,选择 N(或者)Y",给不知所措的用户以提示。

    4. 实例

    对于一个开发者来说,将自己开发的内核代码加入到 Linux 内核中,需要有三个步骤。首先确定把自己开发代码放入到内核的位置;其次,把自己开发的功能增加到 Linux 内核的配置选项中,使用户能够选择此功能;最后,构建子目录 Makefile,根据用户的选择,将相应的代码编译到最终生成的 Linux 内核中去。下面,我们就通过一个简单的例子--test driver,结合前面学到的知识,来说明如何向 Linux 内核中增加新的功能。

    4.1 目录结构

    test driver 放置在 drivers/test/ 目录下:

    $cd drivers/test
    $tree
    .
    |-- Config.in
    |-- Makefile
    |-- cpu
    |   |-- Makefile
    |   `-- cpu.c
    |-- test.c
    |-- test_client.c
    |-- test_ioctl.c
    |-- test_proc.c
    |-- test_queue.c
    `-- test
        |-- Makefile
        `-- test.c
        

    4.2 配置文件

    1) drivers/test/Config.in

    #
    # TEST driver configuration
    #
    mainmenu_option next_comment
    comment 'TEST Driver'
    
    bool 'TEST support' CONFIG_TEST
    if [ "$CONFIG_TEST" = "y" ]; then
      tristate 'TEST user-space interface' CONFIG_TEST_USER
      bool 'TEST CPU ' CONFIG_TEST_CPU
    fi
    
    endmenu
    
    由于 test driver 对于内核来说是新的功能,所以首先创建一个菜单 TEST Driver。然后,显示 "TEST support",等待用户选择;接下来判断用户是否选择了 TEST Driver,如果是(CONFIG_TEST=y),则进一步显示子功能:用户接口与 CPU 功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate(因为 tristate 的取值范围包括 y、n 和 m,m 就是对应着模块)。

    2) arch/arm/config.in
    在文件的最后加入:source drivers/test/Config.in,将 TEST Driver 子功能的配置纳入到 Linux 内核的配置中。

    4.3 Makefile

    1)drivers/test/Makefile

    #       drivers/test/Makefile
    #
    #       Makefile for the TEST.
    #
    
    SUB_DIRS     :=
    MOD_SUB_DIRS := $(SUB_DIRS)
    ALL_SUB_DIRS := $(SUB_DIRS) cpu
    
    L_TARGET := test.a
    export-objs := test.o test_client.o
    
    obj-$(CONFIG_TEST)              += test.o test_queue.o test_client.o
    obj-$(CONFIG_TEST_USER)         += test_ioctl.o
    obj-$(CONFIG_PROC_FS)           += test_proc.o
    
    subdir-$(CONFIG_TEST_CPU)       += cpu
    
    include $(TOPDIR)/Rules.make
    
    clean:
            for dir in $(ALL_SUB_DIRS); do make -C $$dir clean; done
            rm -f *.[oa] .*.flags
            
    drivers/test 目录下最终生成的目标文件是 test.a。在 test.c 和 test-client.c 中使用了 EXPORT_SYMBOL 输出符号,所以 test.o 和 test-client.o 位于 export-objs 列表中。然后,根据用户的选择(具体来说,就是配置变量的取值),构建各自对应的 obj-* 列表。由于 TEST Driver 中包一个子目录 cpu,当 CONFIG_TEST_CPU=y(即用户选择了此功能)时,需要将 cpu 目录加入到 subdir-y 列表中。

    2)drivers/test/cpu/Makefile

    #       drivers/test/test/Makefile
    #
    #       Makefile for the TEST CPU 
    #
    
    SUB_DIRS     :=
    MOD_SUB_DIRS := $(SUB_DIRS)
    ALL_SUB_DIRS := $(SUB_DIRS)
    
    L_TARGET := test_cpu.a
    
    obj-$(CONFIG_test_CPU)       += cpu.o
    
    
    include $(TOPDIR)/Rules.make
    
    clean:
            rm -f *.[oa] .*.flags
            

    3)drivers/Makefile

    ……
    subdir-$(CONFIG_TEST)		+= test
    ……
    include $(TOPDIR)/Rules.make
    
    在 drivers/Makefile 中加入 subdir-$(CONFIG_TEST)+= test,使得在用户选择 TEST Driver 功能后,内核编译时能够进入 test 目录。

    4)Makefile

    ……
    DRIVERS-$(CONFIG_PLD) += drivers/pld/pld.o
    DRIVERS-$(CONFIG_TEST) += drivers/test/test.a
    DRIVERS-$(CONFIG_TEST_CPU) += drivers/test/cpu/test_cpu.a
    
    DRIVERS := $(DRIVERS-y)
    ……
    
    在顶层 Makefile 中加入 DRIVERS-$(CONFIG_TEST) += drivers/test/test.a 和 DRIVERS-$(CONFIG_TEST_CPU) += drivers/test/cpu/test_cpu.a。如何用户选择了 TEST Driver,那么 CONFIG_TEST 和 CONFIG_TEST_CPU 都是 y,test.a 和 test_cpu.a 就都位于 DRIVERS-y 列表中,然后又被放置在 DRIVERS 列表中。在前面曾经提到过,Linux 内核文件 vmlinux 的组成中包括 DRIVERS,所以 test.a 和 test_cpu.a 最终可被链接到 vmlinux 中。

    5. 参考

    1. Document/kbuild/makefiles.txt,Linux Kernel Source code
    2. Document/kbuild/config-language.txt,Linux Kernel Source code
    3. Contributing to the Linux Kernel--The Linux Configuration System,Linux Journal,http://www.linuxjournal.com/categories.php?op=newindex&catid=178
    4. Unreliable Guide To Hacking The Linux Kernel,Paul Rusty Russell,rusty@rustcorp.com.au

    关于作者

    汤凯,通过tangk73@hotmail.com可以跟他联系。

    展开全文
  • 最近在调试USB转网口,涉及到Linux内核编译配置文件的更改,记录一下调试过程。 首先需要了解USB设备接入后系统的识别信息,打印内核日志: root@MyDevice:/# dmesg | tail -20 [ 5364.325642] usb 1-1.1: new ...

    最近在调试USB转网口,涉及到Linux内核编译配置文件的更改,记录一下调试过程。

    首先需要了解USB设备接入后系统的识别信息,打印内核日志:

    root@MyDevice:/# dmesg | tail -20
    [ 5364.325642] usb 1-1.1: new high-speed USB device number 5 using xhci-hcd
    [ 5364.426138] usb 1-1.1: New USB device found, idVendor=0bda, idProduct=8152
    [ 5364.426145] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 5364.426148] usb 1-1.1: Product: USB 10/100 LAN
    [ 5364.426152] usb 1-1.1: Manufacturer: Realtek
    [ 5364.426155] usb 1-1.1: SerialNumber: 00E04C3607A9

    注意idProduct和Manufacturer内容,我用的这款USB转网口设备嵌入的是瑞昱的8152网口芯片。

    进入Linux内核源码的kernel目录执行

    make menuconfig

    进入到图形化配置界面,依次键选[Device Drivers -> Network device support -> USB Network Adapters]

    找到 Realtek RTL8152/RTL8153 Based USB Ethernet Adapters选项使能即可。

    以上选项信息参考博文:https://www.eefocus.com/toradex/blog/16-12/401923_7db7d.html

    然而,编译出的内核版本验证未成功,进入menuconfig图形界面发现勾选已失效(无法正常保存勾选),因此在内核源码目录下寻找config文件进行手动更改配置项

    .../configs/.../normal_kernel.config

    查看代码

    ...
    CONFIG_USB_NET_DRIVERS=y
    # CONFIG_USB_CATC is not set
    # CONFIG_USB_KAWETH is not set
    # CONFIG_USB_PEGASUS is not set
    #CONFIG_USB_RTL8150 is not set
    #CONFIG_USB_RTL8152 is not set
    # CONFIG_USB_LAN78XX is not set
    CONFIG_USB_USBNET=y
    CONFIG_USB_NET_AX8817X=y
    CONFIG_USB_NET_AX88179_178A=y
    CONFIG_USB_NET_CDCETHER=y
    # CONFIG_USB_NET_CDC_EEM is not set
    ...

    将CONFIG_USB_RTL8150和CONFIG_USB_RTL8152设为使能,进入menuconfig查看相应配置项,已更新为勾选。

    制作内核版本,烧写至设备后上电启动,dmesg查看USB接口信息:

    [  471.409739] usb 1-1.1: new high-speed USB device number 4 using xhci-hcd
    [  471.510346] usb 1-1.1: New USB device found, idVendor=0bda, idProduct=8152
    [  471.510353] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [  471.510357] usb 1-1.1: Product: USB 10/100 LAN
    [  471.510360] usb 1-1.1: Manufacturer: Realtek
    [  471.510364] usb 1-1.1: SerialNumber: 00E04C3607A9
    [  471.701309] usb 1-1.1: reset high-speed USB device number 4 using xhci-hcd
    [  471.882926] r8152 1-1.1:1.0 eth1: v1.09.9

    可以发现,多出了一行识别信息,r8152被识别为eth1(此时ifconfig发现新的网卡,但是没有IP等信息),使用udhcpc命令为eth1分配动态ip地址:

    udhcpc -i eth1

    ifconfig查看网络配置情况:

    root@MyDevice:~# ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:0D:0D:D6:B6:21
              inet6 addr: fe80::20d:dff:fed6:b621/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:367 errors:0 dropped:0 overruns:0 frame:0
              TX packets:525 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:92887 (90.7 KiB)  TX bytes:74001 (72.2 KiB)
              Interrupt:30
    
    eth0.10   Link encap:Ethernet  HWaddr 00:0D:0D:D6:B6:21
              inet addr:10.16.7.122  Bcast:10.16.7.255  Mask:255.255.255.0
              inet6 addr: 2001:10:16:8::60/64 Scope:Global
              inet6 addr: fe80::20d:dff:fed6:b621/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:97 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:18767 (18.3 KiB)
    
    eth1      Link encap:Ethernet  HWaddr 00:E0:4C:36:07:A9
              inet addr:192.168.1.101  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:20 errors:0 dropped:0 overruns:0 frame:0
              TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:4679 (4.5 KiB)  TX bytes:2086 (2.0 KiB)
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:201 errors:0 dropped:0 overruns:0 frame:0
              TX packets:201 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:22516 (21.9 KiB)  TX bytes:22516 (21.9 KiB

    发现eth1的IP地址生效,且与eth0.30在同一局域网,接着验证eth1的网络性能,发现无法ping通局域网中的其他设备。

    route add default gw 192.168.1.1 eth1

    进一步设置eth1的默认网关,再ping成功。t802:~# route add default gw 192.168.1.1 eth1

    展开全文
  • linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。1、勾选内核Enable...

    linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试

    一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。

    1、勾选内核Enable loadable module support选项


    2、按回车进入到Enable loadable module support选项子目录,如下图勾选对应选项。


    简单的解释一下各选项:

    Enable loadable module support 

    打开可加载模块支持,如果打开它则必须通过”make modules_install”把内核模块安装在/lib/modules/中 
    Forced module loading 
    允许模块强制加载 
    Module unloading 
    允许卸载已经加载的模块 
    Forced module unloading 
    允许强制卸载正在使用中的模块(比较危险) 
    Module versioning support 
    允许使用其他内核版本的模块(可能会出问题) 
    Source checksum for all modules 
    为所有的模块校验源码,如果你不是自己编写内核模块就不需要它 
    Module signature verification 
    模块签名认证 
    Require modules to be validly signed 
    要求模块有效签名 
    Automatically sign all modules 
    自动签署所有模块 
    Which hash algorithm should modules be signed with? (Sign m 
    哪个散列算法应该与模块签署? (Sign m 
    Compress modules on installation 
    在安装时压缩模块 
    Trim unused exported kernel symbols 
    修剪未使用的导出的内核符号


    3、然后编译内核一下,一定要编译。



    二、完成的上面的一步,现在可以编译驱动模块文件,生成ko文件了。

    1、新建一个Makefile文件。KDIR是内核代码的路径,我这里的路径是

    /home/weifanghai/Android_4.4_git/xunwei/kernel/iTop4412_Kernel_3.0,修改到你放内核代码的路径。

    Makefile

    obj-m += schedule_work.o 
    
    KDIR := /home/weifanghai/Android_4.4_git/xunwei/kernel/iTop4412_Kernel_3.0
    PWD ?= $(shell pwd)
    
    
    all:
    	make -C $(KDIR) M=$(PWD) modules
    		
    clean:
    	rm -rf *.o
    

    2、在同一个目录下新建一个c文件,比如schedule_work.c

    我的测试文件schedule_work.c 这是一个简单的测试代码。

    /* 
    * LEDs driver for GPIOs 
    * 
    * Copyright (C) 2007 8D Technologies inc. 
    * Raphael Assenat <raph@8d.com> 
    * Copyright (C) 2008 Freescale Semiconductor, Inc. 
    * 
    * This program is free software; you can redistribute it and/or modify 
    * it under the terms of the GNU General Public License version 2 as 
    * published by the Free Software Foundation. 
    * 
    */
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/platform_device.h>
    #include <linux/gpio.h>
    #include <linux/leds.h>
    #include <linux/of.h>
    #include <linux/of_platform.h>
    #include <linux/of_gpio.h>
    #include <linux/slab.h>
    #include <linux/workqueue.h>
    #include <linux/module.h>
    #include <linux/err.h>
    #include <linux/delay.h>
    
    static int steping_motor_probe(struct platform_device *pdev)
    {  
    
       printk("steping_motor_probe 20180415\n");    
    
    }
    static int steping_motor_remove(struct platform_device *pdev)
    	{   
    	   printk("steping_motor_probe remove 20180415\n"); 
    	   return 0;
    	}
    
    
    static struct platform_driver steping_motor_driver = {        
    	.probe		= steping_motor_probe,        
    	.remove		= steping_motor_remove,
    	.driver		= {                
    	          .name	= "love_tanghanyue",                
    	          .owner	= THIS_MODULE,                       
    	},
    	};
    
    static int motor_init(void)
    {	
    int DriverState;		
    printk(KERN_EMERG "HELLO WORLD enter! hanyue\n");	
    DriverState = platform_driver_register(&steping_motor_driver);		
    printk(KERN_EMERG "\tDriverState is %d\n",DriverState);	
    return 0;
    }
    
    static void motor_exit(void)
    {	
    printk(KERN_EMERG "HELLO WORLD exit!\n");		
    platform_driver_unregister(&steping_motor_driver);	
    }
    
    module_init(motor_init);
    module_exit(motor_exit);
    
    
    MODULE_AUTHOR("tootzoe@tootzoe.com  ## tanghanyue.cc");
    MODULE_DESCRIPTION("2-Phase Steping motor driver");
    MODULE_LICENSE("GPL");
    MODULE_ALIAS("platform:setping-motor");
    


    3、编译,直接在该路径下make就可以了,就生成了ko文件了。



    三、做了前面的准备工作,已经得到模块ko文件,现在可以开始测试加载和卸载驱动模块。

    1、insmod加载模块命令 ;lsmod查看模块命令;rmmod卸载模块命令。

    2、把模块文件(例如schedule_work.ko)放到设备里面,我这里是在android系统上测试,内核都是linux,都一样,我直接push到system/bin目录下面。

    3、加载内核、查看模块命令、rmmod卸载模块命令


    4、看打印log,测试ok,加载和卸载模块都ok。


    展开全文
  • oralce安装配置linux内核参数配置

    千次阅读 2012-08-10 21:53:06
    安照官方文档的参数配置linux内核, 创建实例的时候报错,经检查,官方文档是以64位8G内存为标准的 而我的机器是64位32G内存,所以内核参数要重新配置,经过实践,弄出一套可行的参数配置,保存下来: fs.aio-max-nr = ...
  • Linux内核配置和编译 之所以要对内核进行配置,这是很多都是硬件的需求,和软件的需求。就是选择自己需要的,去掉自己不要的。 上面有两种配置方法,但是make config是几乎不用的。他是一问一答的配置方法。...
  • 本章节给大家精讲一个实例(如果没有看过上章节的建议先进主页学习):说明:哪位朋友需要完整电子档的在评论区给我说下,本人有时间了一一私发给大家O(∩_∩)O本人近期会陆续上传这些资料和视频教程,可以关注一下...
  • 本章节给大家精讲一个实例(如果没有看过上章节的建议先进主页学习):说明:哪位朋友需要完整电子档的在评论区给我说下,本人有时间了一一私发给大家O(∩_∩)O本人近期会陆续上传这些资料和视频教程,可以关注一下...
  • 配置实例 分区前提:有一个块空的磁盘或者一块磁盘中有多余的容量 1、检查可用磁盘 我有一块新的磁盘/dev/sdb fdisk -l [root@localhost ~]# fdisk -l &amp;amp;lt;省略部分输出&amp;amp;gt; Disk /dev/...
  • 这两天公司防火墙坏了,临时启用一台linux顶替防火墙。...1: 修改系统内核,开启ip转发。 vi /etc/sysctl.conf 修改 net.ipv4.ip_forward = 0 为 net.ipv4.ip_forward = 1 然后执行 sysctl -p...
  • 有时我们为了实现某些功能,比如对iptables的防火墙有些需要内核支持;还有实现一些硬件的...本文介绍了编译Linux内核的操作流程:选择内核源码版本、内核源码安装或解压、配置内核。最后给出了一个编译内核的实例
  • 概述:在Linux内核中增加程序需要完成以下三项工作:1.将编写的源代码复制到Linux内核源代码的相应目录2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项3.在目录的Makefile文件中增加对新源代码的编译...
  • inux中I2C总线驱动体系结构  在Linux系统中,对于一个给定的I2C总线硬件配置系统,I2C总线驱动程序体系结构由I2C总线驱动和I2C设备驱动组成...例如,Linux内核中提供的算法i2e-algo-8260可以用在MPC82xx系列处理器
  • Linux内核驱动学习

    2014-12-18 14:32:29
    本人在学驱动时一不小心按照国嵌内核驱动课件整理出的学习资料,现在分享给大家。其中基础知识讲解很全面,实例非常丰富,在博文中都上传了源代码。免得Linux驱动初学者在网上到处找相关的...5.·Linux内核模块开发
  • 本章节给大家精讲一个实例(如果没有看过上章节的建议先进主页学习):说明:哪位朋友需要完整电子档的在评论区给我说下,本人有时间了一一私发给大家O(∩_∩)O本人近期会陆续上传这些资料和视频教程,可以关注一下...
  • 本文通过一个编程实例来更深入地了解netlink。1.1 实现内容1. 功能Ø 实现一个并发的echo服务器程序,它(接收端)将接收到字符串进行转换处理后,返回给发送端;允许有多个发送端同时存在;Ø 字符串的处理包括...
  • 1、登录Linux内核架构官网:https://www.kernel.org/ 2、下载到PC(我这边是Windows → samba共享文件夹) samba 获取:sudo apt-get samba samba 配置:/etc/samba/smb.conf 主要有实例:路径、读写属性...
  • 一 在Linux内核中增加驱动需要完成以下三项工作: 将编写的源代码复制到Linux内核源代码的相应目录 在目录的Kconfig文件中增加新源代码对应项目的编译配置选项 在目录的Makefile文件中增加对新源代码的编译条目 ...
  • Linux源码编译的步骤,其实很简单,主要是在配置哪些模块的功能开启方面需要熟悉下,下面来看看,编译Linux内核需要有哪些步骤: 1、需要去Linux官网上去下载一个内核版本的源码,  https://www.kernel.org/  实例...
  • 子选项可以全不选,内核中若有其他部分依赖它,会自动选上 Cryptographic algorithm manager 创建加密模版实例,必须要选 HMAC support 为IPSec所必须,可为PPPoE提供压缩支持 Null algorithms
  • 适用于开发人员Linux内核构建基础结构。 Scopes是在本地或远程构建Linux内核的工具。 它处理在云中配置远程基础架构,非常适合那些不拥有或不希望在家中嘈杂地构建服务器的开发人员。 首要原则是设计速度要快。 ...
  • 1.Kconfig文件配置实例(添加驱动程序到内核) <br /> http://hi.baidu.com/zifengshen/blog/item/1823fa1bbc2666148618bfd2.html<br /><br />Linux内核中提供了很多设备的驱动代 码,但在每个项目...
  • Linux上安装Oracle时,需对Linux相关内核参数进行配置和调整。其中,相关内核参数大致可分为4类:共享内存(shared memory),信号量(semaphores),网络(network)、打开文件(openfiles)。 1.共享内存 Oracle...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 367
精华内容 146
关键字:

linux内核配置实例

linux 订阅