嵌入式LINUX 知识学习-menuconfig过程详解
嵌入式开发流程及开发工具介绍
linux下的交叉编译环境
• • • • 针对目标系统的二进制工具binutils 针对目标系统的编译器gcc 目标系统的标准c库glibc 目标系统的linux内核头文件 linux
交叉编译环境的建立步骤
• • • • • • ※编译binutils ※配置linux内核头文件 ※第一次编译gcc ※交叉编译glibc glibc ※第二次编译gcc ※几点注意事项
Make工程管理器
• 管理较多的文件 • Make工程管理器也就是个“自动编译管理 器”,这里的“自动”是指它能够根据文 件时间戳自动发现更新过的文件而减少编 译的工作量,同时,它通过读入Makefile文 件的内容来执行大量的编译工作
Makefile
• Makefile的作用是根据项目配置的情况,构造出需 要编译的源文件列表,然后分别编译,链接。 • Linux内核中与Makefile相关的文件 • ※顶层Makefile:整个内核配置、编译的总体控制 文件 • ※.config:内核配置文件、包括由用户选择的配 置选项,用来存放内核配置后的结果 • ※arch/*/Makefile:位于各种CPU体系结构下的 Makefile,如arch/arm/Makefile,是针对特定平 台的Makefile • ※各个子目录下的Makefile:比如 drivers/Makefiel,负责所在子目录下源代码的管 理。
第二次编译gcc
• 运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++ 。 • 运行make install。
几点注意事项
• 第一点、在第一次编译gcc的时候可能会出 现找不到stdio.h的错误,解决办法是修改 gcc/config/arm/t-linux文件,在 TARGET_LIBGCC2_CFLAGS变量的设定中增加Dinhibit_libc和-D__gthr_posix_h。 • 第二点、对与2.3.2版本的glibc库,编译 linuxthread/sysdeps/pthread/sigaction.c时可 能出错,需要通过补丁glibc-2.3.2-arm.patch解 决:执行patch -p1 < glibc-2.3.2-arm.patch
嵌入式linux系统下打印机驱动的移植与应用
嵌入式linux系统下打印机驱动的移植与应用摘要打印机的技术已经发展了很多年,技术成熟稳定。
但是随着嵌入式技术与移动互联网技术的发展,更多智能终端需求打印机技术的加持。
传统的热敏打印只能满足支付零售领域应用,新技术需求的打印是满足蓝牙、wifi、有线、USB等数据量大打印灵活的场景。
打印机驱动更多的在windows系统下的支持较好,在移动终端领域的嵌入式产品支持种类少,打印设置不灵活。
关键词嵌入式驱动;打印机驱动应用1.前言在Windows、Linux环境中安装打印机,通常是cups, ghostscript等,但体积通常很大,几十上百兆安装在应用的环境中,有时候编译出来的驱动要求打印模块不大于5M,通常的方案有两种一种是将cups的一部分提取出来。
另外一种是基于Linux 发行版安装开源打印机驱动程序包,例如可以直接 sudo apt install hplip。
本文以嵌入式 Linux 和发行版 Linux Ubuntu18.04 两种系统来介绍移植打印机驱动,并对比两种系统的优缺点。
本文采用 ghostscript + hplip(惠普驱动),这种方案进行具体说明。
2.Linux打印机环境搭建及原理2.1打印机关键技术1)PostScriptPostScript(PS)是主要用于电子产业和桌面出版领域的一种页面描述语言和编程语言。
PostScript是一种图灵完全的编程语言,通常PostScript程序不是人为生成的,而是由其他程序生成的。
然而仍然可以使用手工编制的PostScript程序生成图形或者进行计算。
2)ghostscriptGhostscript是PostScript ® 语言和PDF文件的解释器。
Ghostscript由PostScript解释器层和图形库组成。
它是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的自由软件。
LINUX内核模块编译步骤
LINUX内核模块编译步骤编译Linux内核模块主要包括以下步骤:1.获取源代码2.配置内核进入源代码目录并运行make menuconfig命令来配置内核。
该命令会打开一个文本菜单,其中包含许多内核选项。
在这里,你可以配置内核以适应特定的硬件要求和预期的功能。
你可以选择启用或禁用各种功能、设备驱动程序和文件系统等。
配置完成后,保存并退出。
3. 编译内核(make)运行make命令开始编译内核。
这将根据你在上一步中进行的配置生成相应的Makefile,然后开始编译内核。
编译的过程可能需要一些时间,请耐心等待。
4.安装模块编译完成后,运行make modules_install命令将编译好的模块安装到系统中。
这些模块被安装在/lib/modules/<kernel-version>/目录下。
5.安装内核运行make install命令来安装编译好的内核。
该命令会将内核映像文件(通常位于/arch/<architecture>/boot/目录下)复制到/boot目录,并更新系统引导加载程序(如GRUB)的配置文件。
6.更新GRUB配置文件运行update-grub命令来更新GRUB引导加载程序的配置文件。
这将确保新安装的内核在下次启动时可用。
7.重启系统安装完成后,通过重启系统来加载新的内核和模块。
在系统启动时,GRUB将显示一个菜单,你可以选择要启动的内核版本。
8.加载和卸载内核模块现在,你可以使用insmod命令来加载内核模块。
例如,运行insmod hello.ko命令来加载名为hello.ko的模块。
加载的模块位于/lib/modules/<kernel-version>/目录下。
如果你想卸载一个已加载的内核模块,可以使用rmmod命令。
例如,运行rmmod hello命令来卸载已加载的hello模块。
9.编写和编译模块代码要编写一个内核模块,你需要创建一个C文件,包含必要的模块代码。
linux menuconfig 添加配置
3 方案的具体实现方案实现的思路是使用linux自身的内核配置功能,即make menuconfig命令,添加我们自己的配置选项,通过这些配置选项完成不同硬件的区分。
下面以nor flash大小的不同为例说明方案的具体实现。
第一步,需要将该选项添加到linux 内核配置的菜单中。
在init\Kconfig文件中添加如下语句:图1 内核配置添加图这样的话,在运行命令“make ARCH=arm CROSS_COMPILE=arm_v5t_le- menuconfig”配置内核时,就能找到suma support选项。
如图所示:图2 内核配置图选择进去,就能配置flash size的大小。
如下图所示:这样配置完成之后,在编译时,makefile将修改文件include\linux\autoconf.h,将添加我们定义的宏CONFIG_NOR_FLASH_SIZE为设置的值,如设置成默认值32,即设置flash大小为32M byte。
第二步,修改源码,使用我们添加的宏定义CONFIG_NOR_FLASH_SIZE。
在修改文件drivers/mtd/chips/davinci-nor-flash.c,将原来的宏定义#define DAVINCI_FLASH_SIZE (0x00100000 * 32)改为#define DAVINCI_FLASH_SIZE (0x00100000 * CONFIG_NOR_FLASH_SIZE)这样将来我们的板卡的nor flash大小不是32M,而是16M或其他时,用修改kernel源码,只需要重新配置一下内核,将内核中定义的nor flash大小改为相应的值即可。
4结论Nor flash大小不同仅仅是kernel代码管理中一个很简单的例子,将来需要的问题可能会比这个复杂一些,但解决问题的方式可以确定下来,使用linux 内核配置的手段,增加我们所需的宏定义,兼容不同板卡间硬件的差别。
linux内核配置make menuconfig菜单详解
LINUX内核配置MAKE MENUCONFIG菜单详解我们在linux内核裁剪过程中,进入内核所在目录,键入 make menuconfig 就会看到一堆的配置菜单,它们具体代表什么含义呢?我们该如何取舍呢?这里把近期收集到的一些信息做一个总结。
1、General setup代码成熟度选项,它又有子项:1.1、prompt for development and/or incomplete code/drivers该选项是对那些还在测试阶段的代码,驱动模块等的支持。
一般应该选这个选项,除非你只是想使用 LINUX 中已经完全稳定的东西。
但这样有时对系统性能影响挺大。
1.2、Cross-compiler tool prefix交叉编译工具前缀,例如:Cross-compiler tool prefix值为: (arm-linux-)1.3、Local version - append to kernel release内核显示的版本信息,填入 64字符以内的字符串,你在这里填上的字符口串可以用uname -a 命令看到。
1.4、Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持1.5、Kernel compression mode (Gzip) --->有四个选项,这个选项是说内核镜像要用的压缩模式,回车一下,可以看到gzip,bzip2,lzma,lxo,一般可以按默认的gzip,如果要用bzip2,lzma,lxo要先装上支持1.6、Support for paging of anonymous memory (swap)使用交换分区或交换文件来做为虚拟内存,一定要选上。
1.7、System V IPC表示系统的进程间通信Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,必选。
make menuconfig原理
Make menuconfig是一个用于配置Linux内核的工具,主要用于选择内核的各种配置选项,以定制化地构建适合特定需求的内核。
本文将通过对Make menuconfig的原理进行深入探讨,帮助读者更好地理解和使用该工具。
1. Make menuconfig的概述Make menuconfig是Linux内核源码中提供的一个配置工具,其主要作用是为用户提供一个用户友好的菜单界面,用于选择内核的各种配置选项。
通过Make menuconfig,用户可以定制化地配置内核,包括选择需要编译进内核的驱动程序、文件系统、网络协议等,还可以对内核进行调试和优化。
2. Make menuconfig的使用方法对于使用Linux内核进行开发的用户来说,掌握Make menuconfig的使用方法是非常重要的。
以下是使用Make menuconfig的基本步骤:- 进入内核源码目录:首先需要将Linux内核源码下载到本地,然后通过终端进入内核源码的根目录。
- 启动Make menuconfig:在终端中输入命令“makemenu config”,然后按回车键,即可启动Make menuconfig工具。
- 在菜单界面中进行配置:Make menuconfig启动后,会显示一个菜单界面,用户可以通过方向键和回车键来选择和配置内核的各种选项。
- 保存配置并退出:配置完成后,可以选择“保存并退出”选项,然后按照提示进行保存,即可退出Make menuconfig工具。
3. Make menuconfig的原理Make menuconfig的实现原理涉及到Linux内核的配置系统和Kconfig工具链。
Kconfig是Linux内核中的一套配置系统,用于管理内核各项配置选项,Make menuconfig就是基于Kconfig系统实现的。
Make menuconfig的菜单界面是通过Kconfig系统生成的,Kconfig 系统会解析内核源码树中的Kconfig文件,根据其中的配置选项和依赖关系,生成相应的菜单界面。
Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
printk(KERN_WARNING fmt, ##arg) printk(KERN_DEBUG fmt, ##arg)
/* Module Init & Exit function */ static int __init myModule_init(void) {
/* Module init code */ PRINTK("myModule_init\n"); return 0;
图形
工具
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍 了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成
那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢? 我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下 界面:
首页 业界 移动 云计算 研发 论坛 博客 下载 更多
process的专栏
您还未登录!| 登录 | 注册 | 帮助
个人资料
dianhuiren
访问:71424次 积分:1219分 排名:第8764名 原创:37篇 转载:127篇 译文:0篇 评论:3条
目录视图
摘要视图
订阅
《这些年,我们读过的技术经典图书》主题有奖征文 经理
这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文
/dianhuiren/article/details/6917132
1/5
2012年04月 (6) 2012年03月 (15) 2012年02月 (16)
并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般 的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。
MakeMenuconfig详解(配置内核选择)
MakeMenuconfig详解(配置内核选择)Make Menuconfig简介make menuconfig 图形化的内核配置make mrproper -----删除不必要的⽂件和⽬录.#make config(基于⽂本的最为传统的配置界⾯,不推荐使⽤)#make menuconfig(基于⽂本选单的配置界⾯,字符终端下推荐使⽤)#make xconfig(基于图形窗⼝模式的配置界⾯,Xwindow下推荐使⽤)#make oldconfig(如果只想在原来内核配置的基础上修改⼀些⼩地⽅,会省去不少⿇烦)⽬的都是⽣成⼀个.config⽂件,这三个命令中,make xconfig的界⾯最为友好,如果你可以使⽤Xwindow,你就⽤这个好了,这个⽐较⽅便,也好设置。
如果你不能使⽤Xwindow,那么就使⽤make menuconfig好了。
界⾯虽然⽐上⾯⼀个差点,总⽐make config的要好多了。
选择相应的配置时,有三种选择,它们分别代表的含义如下:Y--将该功能编译进内核N--不将该功能编译进内核M--将该功能编译成可以在需要时动态插⼊到内核中的模块菜单解释[1]、Code mat urit y level opt ions:代码成熟等级1.1.prompt for development and/or incomplete code/drivers.如果要试验现在仍处于实验阶段的功能,⽐如khttpd、IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。
在Linux的世界⾥,每天都有许多⼈为它发展⽀持的driver和加强它的核⼼。
但是有些driver还没进⼊稳定的阶段。
但其作者很欢迎其他⼈去测试这些driver并提出⼀些 bugs。
这个问题是说,有⼀些drive还在做测试中,问您是否要选择这些drive或⽀持的程序码。
如果键⼊Y,往后将会出现⼀些还在测试中的东西给您做选择。
(像Java的程序码和PCI bridge),台则就键⼊N。
2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义
BUG报告,切磋与探讨由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。
如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。
如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。
联系方式:MSN: csfrank122@Code maturity level options代码成熟度选项Prompt for development and/or incomplete code/drivers显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择General setup常规设置Local version - append to kernel release在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持Support for paging of anonymous memory (swap)使用交换分区或者交换文件来做为虚拟内存System V IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是POSIX IPC中的一部分BSD Process Accounting将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息BSD Process Accounting version 3 file format使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式Export task/process statistics through netlink通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的Enable per-task delay accounting在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间UTS NamespacesUTS名字空间支持,不确定可以不选Auditing support审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计Enable system-call auditing support支持对系统调用的审计Kernel .config support把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息Enable access to .config through /proc/config.gz允许通过/proc/config.gz访问内核的配置信息Cpuset support只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它Kernel->user space relay support (formerly relayfs)在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口Initramfs source file(s)initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白Optimize for size (Look out for broken compilers!)编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码Enable extended accounting over taskstats收集额外的进程统计信息并通过taskstats接口发送到用户空间Configure standard kernel features (for small systems)配置标准的内核特性(为小型系统)Enable 16-bit UID system calls允许对UID系统调用进行过时的16-bit包装Sysctl syscall support不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量Load all symbols for debugging/kksymoops装载所有的调试符号表信息,仅供调试时选择Include all symbols in kallsyms在kallsyms中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Support for hot-pluggable devices支持热插拔设备,如usb与pc卡等,Udev也需要它Enable support for printk允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择BUG() support显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略Enable ELF core dumps内存转储支持,可以帮助调试ELF格式的程序Enable full-sized data structures for core在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能Enable futex support快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序Enable eventpoll support支持事件轮循的系统调用Use full shmem filesystem完全使用shmem来代替ramfs.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多Use full SLAB allocator使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用Enable VM event counters for /proc/vmstat允许在/proc/vmstat中包含虚拟内存事件记数器Loadable module support可加载模块支持Enable loadable module support打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中Module unloading允许卸载已经加载的模块Forced module unloading允许强制卸载正在使用中的模块(比较危险)Module versioning support允许使用其他内核版本的模块(可能会出问题)Source checksum for all modules为所有的模块校验源码,如果你不是自己编写内核模块就不需要它Automatic kernel module loading让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)Deadline I/O scheduler使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占Voluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APM AC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备) PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSI PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain 中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos"MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NAT子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support。
f1c100s linux6 编译
f1c100s linux6 编译F1C100s是一款广泛用于低成本嵌入式系统的单片机,由于其出色的性价比和灵活的系统兼容性,特别是对Linux系统的支持,使其成为众多开发者和爱好者的首选。
本文将详细介绍如何为F1C100s编译Linux内核,确保读者能够顺利完成编译过程。
环境准备在开始编译Linux内核之前,需要确保你的开发环境具备以下条件:操作系统:建议使用Ubuntu 18.04或更高版本,这些系统版本的包管理和依赖性更加稳定,能够提供更好的开发体验。
必要软件:安装GCC、make、binutils、bison、flex等编译工具,这些工具是编译内核过程中不可或缺的。
交叉编译工具链:由于F1C100s基于ARM架构,需要使用ARM 架构的交叉编译工具链。
可以使用`arm-linux-gnueabi-`或`arm-linux-gnueabihf-`前缀的工具链。
安装必要软件在Ubuntu系统中,可以通过以下命令安装所需的编译工具:```bashsudo apt-get updatesudo apt-get install gcc make binutils bison flex libncurses5-dev libssl-dev```安装交叉编译工具链安装ARM架构的交叉编译工具链:```bashsudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi```下载Linux内核源码选择合适的Linux内核版本是编译的关键一步。
针对F1C100s,建议使用Linux 4.x至5.x版本,因为这些版本提供了较好的支持和稳定性。
可以从官方Linux内核源码仓库```bashwget 自定义网址tar -xvf linux-5.4.70.tar.xzcd linux-5.4.70```配置内核在编译内核之前,需要配置内核选项,确保内核适配F1C100s硬件。
嵌入式Linux开发基础及实验
1.5.2 vi的进入与退出
进入vi:在shell模式下键入vi及需要编辑 的文件名即可。例如:vi example.txt 退出vi:首先按ESC键进入命令模式,然 后输入:进入末行模式,末行模式下输入 q直接退出;wq(或x)保存后退出;q! 不保存强制退出。
1.5.3 光标移动操作
vi 中的光标移动既可以在命令模式,下也可以在文本 输入模式下。 在文本输入模式下可直接使用键盘上的四个方向键移 动光标。 在命令模式下除了使用四个方向键还可以用h(左)、 l(右)、j(上)、k(下)这四个键来移动光标。 (熟练后可以达到手不离键,从而提高工作效率) 快速移动命令:0(零)光标移到行首;$光标移到行 尾;nG光标移到第n行;H光标移到屏幕上显示的第一 行;L光标移到屏幕上显示的最后一行;M光标移到屏 幕的中间一行。
1.4使用情况。 mount 挂载文件系统命令。 格式:mount [选项] 设备 目录 - a 把/etc/fstab中列出的文件系统都挂载上。 umount 卸载文件系统命令。 格式: umount [选项] 目录 -f 强制执行卸载操作,可能会造成数据丢失。 gzip文件压缩命令。 格式: gzip [选项] 压缩(解压缩)的文件名 gzip ramdisk gunzip ramdisk.gz
1.2.1 Linux的特性
1.多任务、多用户 2.支持多种文件系统 3.采用虚拟内存管理技术 4.良好的可移植性 5.设备独立性 6.丰富的网络功能 7.提供全部源代码
1.2.2 Linux的功能
1.稳定的核心 2.丰富的应用软件 3.X Window系统 4.多重启动 5.网络功能 6.软件开发工具
1.5 vi编辑器的使用
Vi是一个高级文本编辑器。它可以执行输 出、删除、查找、替换等众多文本操作 而且用户可以根据自己的需要对其进行 定制,这是其他编辑程序所没有的。 Vi有三种基本工作模式:命令行模式,文 本输入模式,末行模式。
嵌入式Linux内核模块的配置与编译
嵌入式Linux内核模块的配置与编译一、简介随着 Linux操作系统在嵌入式领域的快速发展,越来越多的人开始投身到这方面的开发中来。
但是,面对庞大的Linux内核源代码,开发者如何开始自己的开发工作,在完成自己的代码后,该如何编译测试,以及如何将自己的代码编译进内核中,所有的这些问题都直接和Linux的驱动的编译以及Linux的内核配置系统相关。
内核模块是一些在操作系统内核需要时载入和执行的代码,它们扩展了操作系统内核的功能却不需要重新启动系统,在不需要时可以被操作系统卸载,又节约了系统的资源占用。
设备驱动程序模块就是一种内核模块,它们可以用来让操作系统正确识别和使用使用安装在系统上的硬件设备。
Linux内核是由分布在全球的Linux爱好者共同开发的,为了方便开发者修改内核,Linux的内核采用了模块化的内核配置系统,从而保证内核扩展的简单与方便。
本文通过一个简单的示例,首先介绍了如何在Linux下编译出一个内核模块,然后介绍了Linux内核中的配置系统,讲述了如何将一个自定义的模块作为系统源码的一部分编译出新的操作系统,注意,在这里我们介绍的内容均在内核2.6.13.2(也是笔者的开发平台的版本)上编译运行通过,在2.6.*的版本上基本上是可以通用的。
二、单独编译内核模块首先,我们先来写一个最简单的内核模块:#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "RF"#define DRIVER_DESC "just for test"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");staticintrfmodule_init(void){printk("hello,world:modele_init");return 0;}static void rfmodule_exit(void){printk("hello,world:modele_exit");}module_init (rfmodule_init);module_exit (rfmodule_exit);这个内核模块除了在载入和卸载的时候打印2条信息之外,没有任何其他功能,不过,对于我们这个编译的例子来讲,已经足够了。
openwrt make kernel_menuconfig命令的实现机制
openwrt make kernel_menuconfig命令的实现机制OpenWrt是一个专门为嵌入式设备设计的开源操作系统,它具有高度自定义性的特点。
在进行OpenWrt的自定义配置时,需经常使用到make kernel_menuconfig命令,即在内核配置菜单中对内核选项进行编辑。
实现机制如下:一、Makefile在OpenWrt源码的目录下经常出现名为Makefile的文件,它是Make自动化工具的一个文件,用于指导编译器以及链接器如何进行编译和链接操作。
通过对该文件的修改,可以对编译行为进行自定义。
二、Kernel_makefile在Makefile中有一个名为Kernel_makefile的文件,它是OpenWrt为内核锅炉定制的一个Makefile文件。
通过Kernel_makefile,可以实现内核的编译、调试以及配置等操作。
在Kernel_makefile中,使用obj-y变量指定内核源代码文件的编译方式以及参与编译的文件。
三、Kernel_menuconfigKernel_menuconfig是OpenWrt提供的一个菜单项,用于对内核选项进行编辑。
使用make kernel_menuconfig命令即可进入内核配置菜单,可以对内核选项进行编辑和修改,这些修改会被保存至.config 文件中。
在菜单项中使用的内核选项也会保存至.config文件中,从而方便后续的内核编译。
四、.config文件.config文件是OpenWrt中用于保存内核配置选项的文件。
它是一个文本文件,可以手动编辑。
当通过make kernel_menuconfig命令修改内核选项时,所做的修改都会被保存至.config文件中。
五、编译内核当所有的内核选项修改完成后,需要执行make命令编译内核。
在编译内核时,会根据.config文件中的选项配置进行编译。
根据内核选项的不同,编译时间可能会较长。
综上所述,通过Makefile、Kernel_makefile、Kernel_menuconfig、.config文件和编译内核这五个步骤,就可以实现OpenWrt的内核选项配置。
精品课件-基于ARM9的嵌入式Linux系统-第8章
子目录下的Makefile传递一些信息。有些变量,比如 SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在 arch/*/Makefile还作了扩充。
第8章 嵌入式Linux内核
7
(3) Rules.make 变量。 前面讲过,Rules.make 是编译规则文件,所有的Makefile
linux2.6.14.1.tar.gz [root@localhost mxl]# pwd /mnt/hgfs/share/mxl
第8章 嵌入式Linux内核
29
8.3.2 修改Makefile 修改内核目录树根下的主Makefile,指明交叉编译器。
[root@localhost linux2.6.14.1]#vi Makefile 找到ARCH和CROSS_COMPILE,修改。
第8章 嵌入式Linux内核
24
图8-2 menuconfig配置界面
第8章 嵌入式Linux内核
25
8.2.3 Linux内核启动原理 在Bootloader将Linux内核映像拷贝到RAM以后,可以通过
下例代码启动Linux内核: call_linux(0, machine_type, kernel_params_base)。
第8章 嵌入式Linux内核
3
8.2 Linux内核软件结构分析
8.2.1 Linux内核配置系统原理 1. 配置系统的基本结构 本节对Makefile分析方法可参看第7章vivi中Makefile的详
细分析,Linux内核的配置系统由三个部分组成,分别是: ① Makefile:分布在Linux内核源代码(包括子目录)中的
/prompt/ /symbol/ /word/
kconfig语法详解
kconfig语法详解Kconfig是一种用于配置Linux内核构建的配置语言。
通过使用Kconfig,开发者可以定制Linux内核的构建选项,编译所需的功能和驱动程序,并定制适合自己需求的内核映像。
本文将详细介绍Kconfig的语法和用法。
1. 声明配置选项在Kconfig中,配置选项由一系列变量和属性组成。
首先,我们使用"config"关键字声明一个配置选项的名称:config EXAMPLE_OPTION然后,我们可以使用属性来描述这个配置选项。
例如,我们可以为这个选项指定一个字符串类型的默认值:default "example value"2. 依赖关系Kconfig允许配置选项之间建立依赖关系。
通过使用"depends on"语句,我们可以指定其他选项作为当前选项的依赖项。
例如,我们可以指定一个选项仅在另一个选项被选中时才可用:depends on ANOTHER_OPTION或者我们可以指定一个选项在另一个选项未被选中时才可用:depends on !ANOTHER_OPTION3. 条件语句Kconfig还支持使用条件语句来根据特定条件来选择不同的配置选项。
使用"if"语句,我们可以根据一个或多个条件来决定一个选项是否可用:if CONDITIONconfig OPTION_A...例如,我们可以指定一个选项仅在某个架构上可用:if ARCH_X86config X86_OPTION...4. 菜单Kconfig中的配置选项通常以菜单的形式组织起来,以便更好地对选项进行分类和查看。
使用"menu"关键字,我们可以创建一个菜单:menu "Example Menu"config OPTION_1...config OPTION_2...endmenu菜单可以嵌套,允许我们创建多级菜单结构。
嵌入式linux内核移植步骤
嵌入式linux内核移植步骤嵌入式Linux内核移植步骤嵌入式Linux内核移植是将Linux内核移植到特定的硬件平台上的过程。
在进行嵌入式Linux内核移植之前,需要先了解目标硬件平台的相关信息,包括处理器架构、硬件接口、设备驱动等。
本文将介绍嵌入式Linux内核移植的主要步骤,以帮助读者了解移植的过程。
1. 获取源代码需要从官方或其他可靠的渠道获取Linux内核的源代码。
可以选择下载最新版本的稳定内核,也可以根据需要选择特定版本的内核。
获取源代码后,解压到本地目录。
2. 配置内核在进行内核配置之前,需要根据目标硬件平台选择适当的配置文件。
内核配置文件包含了编译内核所需的各种选项和参数。
可以使用make menuconfig或make defconfig命令进行内核配置。
在配置过程中,需要根据目标硬件平台的特点进行相应的配置,如选择正确的处理器类型、设备驱动等。
3. 编译内核配置完成后,可以使用make命令编译内核。
编译过程可能会比较耗时,需要根据计算机性能进行相应的等待。
编译完成后,会生成vmlinuz和相关的模块文件。
4. 编译设备树设备树是描述硬件平台的一种数据结构,用于在内核启动时传递硬件信息给内核。
如果目标硬件平台需要使用设备树,需要将设备树源文件编译为二进制文件。
可以使用device tree compiler(dtc)工具来编译设备树。
5. 烧录内核内核编译完成后,需要将生成的vmlinuz文件烧录到目标硬件平台上。
根据硬件平台的不同,可以使用不同的烧录工具,如dd命令、fastboot等。
烧录完成后,可以通过串口或其他方式查看内核启动信息。
6. 配置文件系统内核烧录完成后,需要为目标硬件平台配置文件系统。
可以选择使用已有的文件系统,如busybox、buildroot等,也可以根据需求自行定制文件系统。
配置文件系统包括选择合适的文件系统类型、添加必要的应用程序和驱动、配置网络等。
make menuconfig原理 -回复
make menuconfig原理-回复make menuconfig是Linux内核编译时使用的配置界面。
对于Linux内核编译,通常会使用make命令来进行编译操作。
而make menuconfig 则是make命令的一个子命令,用于打开一个文本界面,提供给用户一种方便的方式来配置Linux内核的编译选项。
下面,我将一步一步地解释make menuconfig的原理。
第一步:调用kconfig-frontendsmake menuconfig实际上是通过调用kconfig-frontends这个工具来实现的。
kconfig-frontends是一个由Linux内核开发者提供的专门用于解析和处理配置文件的工具。
第二步:解析配置文件kconfig-frontends首先会根据内核的配置文件(一般是.config文件)来解析和读取内核的编译选项。
该配置文件记录了用户之前进行过的配置信息,包括各个模块的开关、功能选项、驱动选项等。
解析配置文件的过程会生成一个内部数据结构,用于存储用户的配置选项。
第三步:构建配置界面根据解析得到的内部数据结构,kconfig-frontends会构建一个文本界面,供用户进行配置。
配置界面通常采用树形结构,将各个模块及其选项进行组织。
用户可以通过光标键或者鼠标来进行选择和修改。
第四步:配置选项的修改与保存当用户选择某个选项后,kconfig-frontends会根据用户的选择来修改内部数据结构中相应的配置选项。
比如,改变某个模块的状态(关闭或打开)、修改某个功能的功能选项等。
用户可以通过界面上的不同操作来进行修改,比如使用空格键来改变选项的状态。
同时,配置界面还提供了搜索、过滤、排序等功能,以方便用户查找和管理配置选项。
用户可以通过这些功能来快速定位和修改所需要的选项。
当用户进行修改后,kconfig-frontends会实时将修改后的配置选项保存到配置文件中。
这样,下一次运行make menuconfig时,就可以恢复上一次的配置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文章介绍了makefile跟kconfig文件,包括编译过程与makefile编码规则。
编译过程:我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下界面:这个界面是怎么生成的呢?跟我们经常说的内核配置与与编译又有什么关系呢?下面我们借此来讲解一下linux内核的配置机制及其编译过程。
一、配置系统的基本结构Linux内核的配置系统由三个部分组成,分别是:1、Makefile:分布在Linux 内核源代码根目录及各层目录中,定义Linux 内核的编译规则;2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;3、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于Ncurses 图形界面以及基于Xwindows 图形界面的用户配置界面,各自对应于Make config、Make menuconfig 和make xconfig)。
这些配置工具都是使用脚本语言,如Tcl/TK、Perl 编写的(也包含一些用C 编写的代码)。
本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。
所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写Makefile 和配置文件就可以。
二、makefile menuconfig过程讲解当我们在执行make menuconfig这个命令时,系统到底帮我们做了哪些工作呢?这里面一共涉及到了一下几个文件我们来一一讲解Linux内核根目录下的scripts文件夹arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件Linux内核根目录下的makefile文件、各层目录下的makefile文件Linux内核根目录下的的.config文件、arm/$ARCH/下的config文件Linux内核根目录下的include/generated/autoconf.h文件1)scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容2)当我们执行make menuconfig命令出现上述蓝色配置界面以前,系统帮我们做了以下工作:首先系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig 是整个linux配置机制的核心),那么ARCH环境变量的值等于多少呢?它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:或者通过make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arm/arm/kconfig文件生成配置选项(选择了arm科的卷子),系统还提供了x86科、milps科等10几门功课的考试题3)假设教务处比较“仁慈”,为了怕某些同学做不错试题,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)#cp arch/arm/configs/s3c2410_defconfig .config4).config假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.5)经过以上两步,我们可以正确的读取、配置我们需要的界面了那么他们如何跟makefile文件建立编译关系呢?当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在Linux内核根目录下的include/generated/autoconf.h文件下内核中的源代码就都会包含以上.h文件,跟宏的定义情况进行条件编译。
当我们需要对一个文件整体选择如是否编译时,还需要修改对应的makefile文件,例如:我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。
最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件。
比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其声称过程首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;最后修改对应目录下的makefile文件完成编译选项的添加;最后的最后执行make zImage命令进行编译。
三、具体实例下面我们以前面做过的模块实验为例,讲解如何通过make menuconfig机制将前面单独编译的模块编译进内核或编译为模块假设我已经有了这么一个驱动:modules.c[plain]view plaincopyprint?1.<p>2. <span style="font-size:14px;">1.#include <linux/module.h> /*module_init()*/3.4. 2.#include <linux/kernel.h> /* printk() */5.6. 3.#include <linux/init.h> /* __init __exit */7.8. 4.9.10. 5.#define DEBUG //open debug message11.12. 6.13.14. 7.#ifdef DEBUG15.16. 8.#define PRINTK(fmt, arg...) printk(KERN_WARNING fmt, ##arg)17.18. 9.#else19.20. 10.#define PRINTK(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)21.22. 11.#endif23.24. 12.25.26. 13./* Module Init & Exit function */27.28. 14.static int __init myModule_init(void)29.30. 15.{31.32. 16. /* Module init code */33.34. 17. PRINTK("myModule_init\n");35.36. 18. return 0;37.38. 19.}39.40. 20.41.42. 21.static void __exit myModule_exit(void)43.44. 22.{45.46. 23. /* Module exit code */47.48. 24. PRINTK("myModule_exit\n");49.50. 25. return;51.52. 26.}53.54. 27.55.56. 28.module_init(myModule_init);57.58. 29.module_exit(myModule_exit);59.60. 30.61.62. 31.MODULE_AUTHOR("MC"); /*模块作者,可选*/63.64. 32.MODULE_LICENSE("GPL"); /*模块许可证明,描述内核模块的许可权限,必须*/65.66. 33.MODULE_DESCRIPTION("A simple Hello World Module"); /*模块说明,可选*/ </span>67.</p>Step1:将modules.c拷到drivers/char/目录下(这个文件夹一般存放常见的字符驱动)Step2: vi driver/char/Kconfig,在config DEVKMEM后添加以下信息config MODULEStristate "modules device support"default yhelpSay Y here,the modules will be build in kernel.Say M here,the modules willbe build to modules.Say N here,there will be nothing to be do.Step3:make menuconfigDevice driver-character devices[*]modules device supporStep4:vi driver/char/Makefile,在js-rtc后添加obj-$(CONFIG_MODULES)+= modules.oCONFIG_MODULES 必须跟上面的Kconfig中保持一致,系统会自动添加CONFIG_前缀modules.o必须跟你加入的.c文件名一致最后执行:make zImage modules就会被编译进内核中第三步:Step3:make menuconfigDevice driver-character devices[M]modules device suppor把星号在配置界面通过空格改为M,最后执行make modules,在driver/char/目录下会生成一个modules.ko文件跟我们前面讲的单独编译模块效果一样,也会生成一个模块,将它考入开发板执行insmod moudles.ko,即可将生成的模块插入内核使用。