linux交叉编译裁剪内核记录
刚开始学习嵌入式内核编译,因为要修改内核的默认配置,因此这里把自己的学习记录写下来,方便以后查阅,也给别人一个参考,有什么写的不对的或者更好的方法,请指正~
开发板有usb从口,现在想要让开发板作为一款打印机设备来被PC机识别(因为以后要用此开发板作为一款一体打印机的主控板)但是内核默认提供的usb gadget设备驱动是大容量存储设备驱动(将默认编译好的内核下载到板子里,用usb连接pc显示大容量存储设备;而且我们可以在编译好的内核文件目录/drivers/usb/gadget/下看到内核选择编译了storage.c文件,其他文件不做编译,这就是配置文件的作用了),因此这里要修改内核配置文件,重新编译内核使其作为usb从设备的打印机。
首先要将开发板的内核文件解压到任意目,然后进入内核根目录
看到内核目录下是没有默认的.config配置文件的

就需要自己去按照记得硬件平台选择配置文件,复制到根目录下即可,我在arch/arm/config目录下找到自己的配置文件
修改配置文件有三种方法,
命令:make xconfig
- qconf: 全新的基于QT的配置接口,2.6版本内核
- 更易使用(切记阅读 help -> introduction: useful options!)
- 具有文件浏览功能,更易的加载配置文件
命令:make menuconfig
- 老式字符界面,依然很管用。你够自信,完全可以手写配置文件!
命令:make oldconfig
- 用于升级早期发布内核的配置文件
- 对一些绝对符号(obsolete symbols)发出警告
- 询问新符号的配置值
我用的是make menuconfig,如下。

这里我们要修改设备驱动,进入device drivers 找到usb gardet 设备驱动 将大容量存储设备修改为printer即可。
大家可以看到usb支持很多驱动,这里内核代码都已经实现,但是为了在嵌入式设备里使用,自然要裁剪内核,所以很多内容都没有安装,因此需要开发人员自己手动设置后在编译内核。我们这里选择 USB Gadget Suppot 即可

这里也可以看到内核默认支持usb从设备为大容量存储设备。

选择了作为打印机从设备后,大容量自动取消了,显然是多选一的选项。

修改后,退出,编译内核,因为是在arm板上编译,自然要选择交叉编译环境。
Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage
执行这条命令后(以前没有修改配置文件,执行后自动编译内核,等十几分钟即可),但是这次终端重新提示内核配置问题,包括是否支持2TB大文件,硬件平台等等。对于硬件平台和内核知识缺乏的人确实不好选择。我试了很多次没有成功。因为我们的配置文件是写好的,只是修改了一点,为什么会出现这些问题,确实我也不懂。重新修改了很多次配置文件问题依旧,

最后得出结论就是只要是用menucpnfig或者xconfig打开了配置文件,就不能自动编译了,注意这里我编译是编译arm平台的内核。于是我试了直接编译pc机内核,make 不加任何参数,表示按照本机的硬件平台和编译器来编译,结果通过了,自动编译

因此我想到是不是我修改配置文件时也和平台有关,事实却是如此,这里显示的是x86平台的配置文件,因为我打开时没有加入ARCH=arm的参数
果然是这样,网上说的修改配置文件的命令很多是基于当前的pc硬件环境,对于我要定制到arm平台的内核裁剪来说,修改配置文件需要在命令中加入 ARCH=arm 这句话,否则修改完的配置文件是基于x86平台。我们执行Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage ,make工具读取不到自己的arm平台配置文件,自然要显示内核配置选项,这就是我遇到的问题(整整5个多小时,全花在这上边了,基础还是太薄弱)。
因此我们需要重新修改下配置文件,修改的时候第一步需要这样。
Make ARCH=arm menuconfig

然后按照前文的修改定制自己的内核即可。退出,保存,Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage即可。

编译开始,静等即可。
本来是很小的问题,结果花了整整一下午,基础还是最重要的~
linux交叉编译裁剪内核记录的更多相关文章
- linux系统裁剪
linux系统裁剪 1.简介 最近为了更加了解linux系统的启动过程,通过对系统进行裁剪的的方式来了解整个启动流程.这里记录下过程. 2.环境介绍 vmware12 + centos6.5 + xs ...
- Linux系统启动那些事—基于Linux 3.10内核【转】
转自:https://blog.csdn.net/shichaog/article/details/40218763 Linux系统启动那些事—基于Linux 3.10内核 csdn 我的空间的下载地 ...
- Linux 2.6内核中新的锁机制--RCU
转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁 ...
- 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本、内核、当前时间
申请博客有一段时间了,然而到现在还一篇没有写过..... 主要因为没有想到需要写些什么,最近在学习Python语言,照着书上看了看最基础的东西,发现根本看不进去,而且光看的话今天看了觉得都理解懂了,过 ...
- Linux 0.12 内核管理存储器
Linux 0.12 内核管理存储器 其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出 ...
- Linux 实例常用内核网络参数介绍与常见问题处理
本文总结了常见的 Linux 内核参数及相关问题.修改内核参数前,您需要: 从实际需要出发,最好有相关数据的支撑,不建议随意调整内核参数. 了解参数的具体作用,且注意同类型或版本环境的内核参数可能有所 ...
- [转帖]linux 内存管理——内核的shmall 和shmmax 参数
(转)linux 内存管理——内核的shmall 和shmmax 参数 内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...
- linux4.10.8 内核移植(三)---裁剪内核
一.裁剪内核 1.1 第一次修改 现在的内核大小为2.8M左右,要裁剪到2.0M以下,毕竟给内核分区就只有2.0M. 这两个设备我们没有,裁剪掉. 进入make menuconfig中,搜索mouse ...
- Linux移植之内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容 ...
随机推荐
- Dojo系列教程
Dojo学习笔记一: 认识Dojo http://blog.csdn.net/lfsfxy9/article/details/8623897 <dojo 边学边用> http://www. ...
- HtmlAgilityPack.dll的使用 获取HTMLid
简介 本文介绍net处理html页面元素的工具类(HtmlAgilityPack.dll)的使用,用途比较多的应该是例如采集类的功能,采集到的html字符串要怎样处理是一个头痛的问题,如果是截取就太麻 ...
- $(document).ready()使用讨论
<script language="JavaScript" type="text/javascript"> $(document).ready(fu ...
- Python基础教程之第2章 列表和元组
D:\>python Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Typ ...
- ios开发——实用技术篇&数据保存于恢复
数据保存于恢复 用户操作(输入数据)之后,应用程序退出并且终止之后,当用户再次打开应用的时候还是保持原来的状态 一:在storyBoard中设置恢复标志符 二:在AppDalegate中代理方法 -( ...
- Linux/RedHat 编译安装GNU gcc 4.9.0 (g++)
这里说的是编译安装,yum/apt-get 等安装方法比較简单,不阐述! 1.下载源代码包:gcc.gnu.org 2.解压: tar -xjvf gcc-4.9.0.tar.bz2 3.下载编译所需 ...
- ExchangeServeice获取在线outlook邮箱中的未读邮件
using Microsoft.Exchange.WebServices.Data; using System; using System.Collections.Generic; using Sys ...
- 基于jQuery带图标的多级下拉菜单
之前为大家分享了很多导航菜单.今天我们要来分享一款很不错的jQuery左侧带小图标的多级下拉菜单,菜单是垂直的,每一个菜单项带有一个小图标,看起来非常专业.并且菜单支持无限极下拉,所以对各位Web开发 ...
- java 数组初始化
一维数组 1) int[] a; //声明,没有初始化 2) int[] a=new int[5]; //初始化为默认值,int型为0 3) int[] a={1,2,3,4,5} ...
- iOS runtime 运行时( 二 )
我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime ...