KStudio window上编译uclinux
正因为TKStudio证明这种想法是可行的,所以我才有可能尝试去做这件事情。我做的仅仅是交叉编译ARM平台下的内核,我也只对此平台熟悉。TKStudio也只支持ARM等嵌入式平台。
在Windows下编译Linux内核步骤
上周,已经成功使用TKStudio编译UBoot,这次将Linux内核移植到TKStudio下也是借鉴移植UBoot的做法。
- 首先,先在Linux平台下配置并编译内核,注意保留生成的.o等目标该文件;
- 然后,将代码移植至Windows,删除内核源码中没有被编译的.c文件(没有对应的.o);
- 接着,创建TKStudio工程,将剩余的源码导入到工程中;
- 其次,配置好GCC编译相关参数;
- 最后,编译,逐个排查编译问题,直至最后的编译成功。
我编译的内核为Linux-3.0.8,目标为友善之臂的mini210开发板(处理器为s5pv210, Cortex-A8)内核,内核源码为光盘自带。相关的编译参数如下:
C编译参数:-mabi=aapcs-linux -include .\include\generated\autoconf.h -D__LINUX_ARM_ARCH__=7 -march=armv7-a -marm -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(sem)" -D"KBUILD_MODNAME=KBUILD_STR(sem)" -mfpu=vfp -pipe -DTEXT_OFFSET=0×00008000 -mcpu=cortex-a8 -D__KERNEL__
ASM编译参数:
-mabi=aapcs-linux -include .\include\generated\autoconf.h -D__LINUX_ARM_ARCH__=7 -mno-thumb-interwork -funwind-tables -march=armv7-a -include asm/unified.h -msoft-float -gdwarf-2 -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sem)" -D"KBUILD_MODNAME=KBUILD_STR(sem)" -mfpu=vfp -pipe -DTEXT_OFFSET=0×00008000 -mcpu=cortex-a8 -D__KERNEL__ –D__ASSEMBLY__
同时,还要设置好头文件包含路径:
C头文件包含路径:-s5pv210\include;.\arch\arm\plat-s5p\include;.\arch\arm\plat-samsung\include
ASM头文件包含路径:.\include;.\arch\arm\include;.\arch\arm\mach-s5pv210\include;.\arch\arm\plat-s5p\include;.\arch\arm\plat-samsung\include
以上的参数,有一些依据不同的平台有所不同。这些参数不用自己写,在Linux下编译内核时会生成一些类似于XXX.o.cmd的文件,打开这些文件就可以找到相应的参数设置,拷出来再适当地修改即可。
编译时要注意的事项:
- 编译参数尽量使用.o.cmd中自带的,适度地修改,不能删除太多,否则会出现很多莫名其妙的问题;
- 优化等级不能选不优化,最好是选-O,否则出现一些问题;
- 极少量的.c、.S文件虽然没有直接被编译,但是会被其它文件包含再编译,这些文件是不能删的。至于有哪些文件,不必一个个查,编译时如果提示找不到相应文件,恢复即可;
- Linux内核启动时会有个解压缩的过程,这部分代码由arch\arm\bootp实现。考虑调试问题,且编译错误不容易解决,删除之。
最小化系统漫谈
我做这个事情的动力绝大部分是因为兴趣。Linux平台下的工具用起来不爽,所以才想到了WIndows下的工具。在做UBoot和Linux内核在TKStudio编译时,虽然费时费力,但也收获不少。
编译UBoot时,由于源码量少,所以花了不是太多的时间和精力,并且获取了第一手经验。同时,在反复的折腾过程中,对UBoot主要的文件目标功能和组织已经掌握地比较清晰。再加通过TKScope仿真器连接目标板去跟踪调试,对UBoot的程序框架和运行流程也已经把握。
在编译Linux时,则首先尽量将其配置成功能最小的内核,以减少编译的文件数,同时保持功能简单以便于理解。之后便是加入TKStudio工程并逐个排查错误。这种过程也让我了解了Linux主要的文件功能及其相关件的依赖关系,同时对Linux内核的各个编译配置项也有深入理解。
无论是以上哪一个,让我深有受益的地方便是通过此种方式能够初步掌握这些源码的主要框架,有了绝对的控制权,可以想怎么改就怎么改,同时还能跟踪看改后的运行流程。这就是让它们处于自己的掌控之下。
其实,UBoot和Linux中的源码量虽然大,但很多都是可以去掉的。这些源码虽然增强了内核的功能,但是会影响到理解和阅读。所以,我在处理UBoot时,做了一件比较有意见的事情:尽可能地移植不必要的文件,保留一个最小的UBoot核心,这个核心主要包括目标平台、板级平台、命令行、必备的驱动程序。所涉及的源文件数不多。UBoot的其它文件只不过是功能上的添加或增强。而后,便是在这个核心的基础之上再将原有的文件加入一些进来,以获得更强的功能。
通过这样一个复杂->简化->复杂的过程,我对UBoot已经完全没有任何惧怕心理。虽然源码细节我没有仔细阅读;但是由于对整个框架把握的比较清楚,所以能很快定位相关部分。上图中的源码结构,看起来并不复杂:)
后续对Linux内核,我也会考虑这样干,尽可能地的简化,最后得到一个最最小的系统。只要弄懂这个核心,那就什么都不怕了。
KStudio window上编译uclinux的更多相关文章
- Window上编译最新版libCef(Branch 2704)(转载)
转自http://blog.csdn.net/mfcing/article/details/52066579 1.开发环境搭建 VS2010及以上版本,CMake 2.8.12.1及以上版本.我安 ...
- linux(debian) arm-linux-g++ v4.5.1交叉编译 embedded arm 版本的QtWebkit (browser) 使用qt 4.8.6 版本 以及x64上编译qt
最近需要做一个项目 在arm 架构的linux下 没有桌面环境的情况下拉起 有界面的浏览器使用. 考虑用qt 的界面和 qtwebikt 的库去实现这一系列操作. 本文参考: Qt移植到ARM Lin ...
- window上安装 MongoDB 及其 PHP扩展
window上安装 MongoDB 及其 PHP扩展 工具/原料 window MongoDB MongoDB 方法/步骤 MongoDB 下载 MongoDB提供了可用于32位和64 ...
- 在Window下编译LibGeotiff(含Libtiff)
核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...
- 在windows 上编译部署Rap2
在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...
- [No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)
1.7-ZIP简介 7-zip 是一款免费的压缩解压软件.ZIP格式的文件默认被苹果和微软支持,完全不需要额外安装其他软件就可以解压.但对于非US-ASCII编码的文件名和大于2GB的ZIP文件,可能 ...
- window上利用pip安装pandas
官网推荐的是直接使用Anoconda,它集成了pandas,可以直接使用.安装挺简单的,有windows下的安装包.如果不想安装庞大的Anoconda,那就一步一步用pip来安装pandas.下面我主 ...
- [原]在win上编译 subversion 源码实践Tonyfield的专栏
(百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...
- 解决Qt在openSUSE上编译出现“cannot find -lGL”错误
在openSUSE上编译QT5.4程序出现“cannot find -lGL”,就连example都无法通过编译.QT是在官网下的最新的安装包. 大体意思是,缺少qt运行时所需要的openGL库.决绝 ...
随机推荐
- Jquery Datatable自动生成序号
公司项目里,使用的是jquerydatatable框架来展示数据的,在使用的时候遇到一个问题,就是要自动生成序号,且在分页的时候,下一页的序号紧跟着前一页的序号,下面是代码: "fnDraw ...
- Mybatis入门及Dao开发方式
本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...
- day5模块学习--random模块
Python中的random模块用于生成随机数 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的浮点数 随机浮点数:0<= n < ...
- 【51nod】1164 最高的奖励 V2
题解 一道比较神奇的二分图匹配 既然有n个元素,那么能匹配n个位置,我们把这n个位置找出来,是每个区间从左端点开始找到一个没有被匹配到的位置作为该点(我们忽略右端点) 然后我们从价值大到小,然后从左端 ...
- CentOS7.6安装rime輸入法
# solve dependencyyum install -y gcc gcc-c++ boost boost-devel cmake make cmake3yum install glog glo ...
- MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值
F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...
- python import 与 from ... import ...
import test test = 'test.py all code' from test import m1 m1 ='code'
- mysql插入数据时,去掉重复的数据;
1. 利用insert ignore into语句去重 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VA ...
- 使用Swing的JSpinner组件设置日期时间选择器
代码: //获得时间日期模型 SpinnerDateModel model = new SpinnerDateModel(); //获得JSPinner对象 JSpinner year = new J ...
- JXOI2017-2018 解题报告
链接:JXOI2017-2018 解题报告 代码预览:Github