可能没有几个人能像我这样在Windows下编译Linux内核,甚至于同时进行内核调试。这种事情我不是第一个做到的,至少我们公司的原TKStudio部门已经做过。在TKStudio网站上,提供了一个Linux内核和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的更多相关文章

  1. Window上编译最新版libCef(Branch 2704)(转载)

    转自http://blog.csdn.net/mfcing/article/details/52066579 1.开发环境搭建   VS2010及以上版本,CMake 2.8.12.1及以上版本.我安 ...

  2. 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 ...

  3. window上安装 MongoDB 及其 PHP扩展

    window上安装 MongoDB 及其 PHP扩展   工具/原料   window MongoDB MongoDB 方法/步骤     MongoDB 下载 MongoDB提供了可用于32位和64 ...

  4. 在Window下编译LibGeotiff(含Libtiff)

    核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...

  5. 在windows 上编译部署Rap2

    在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...

  6. [No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)

    1.7-ZIP简介 7-zip 是一款免费的压缩解压软件.ZIP格式的文件默认被苹果和微软支持,完全不需要额外安装其他软件就可以解压.但对于非US-ASCII编码的文件名和大于2GB的ZIP文件,可能 ...

  7. window上利用pip安装pandas

    官网推荐的是直接使用Anoconda,它集成了pandas,可以直接使用.安装挺简单的,有windows下的安装包.如果不想安装庞大的Anoconda,那就一步一步用pip来安装pandas.下面我主 ...

  8. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  9. 解决Qt在openSUSE上编译出现“cannot find -lGL”错误

    在openSUSE上编译QT5.4程序出现“cannot find -lGL”,就连example都无法通过编译.QT是在官网下的最新的安装包. 大体意思是,缺少qt运行时所需要的openGL库.决绝 ...

随机推荐

  1. mysql-noinstall.zip免安装版的优化配置和精简

    1.准备工作 下载mysql的最新免安装版本mysql-noinstall-5.5.25a-win32.zip,解压缩到相关目录,如:d:\\ mysql-noinstall-5.1.53-win32 ...

  2. Java第三阶段学习(三、字符流、转换流)

    一.字节流读取中文时出现的问题: 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节. 二.字符编码表 编码表:其实就是生活中字符和计算机二进制的对应关系表. 1.ascii: 一个 ...

  3. ASP.NET Identity 修改表名和主键类型

    public class UserLogin : IdentityUserLogin<Guid> { } public class UserRole : IdentityUserRole& ...

  4. jenkins备份与恢复

    jenkins这里我通过thinbackup插件进行对jenkins的配置备份与恢复 1丶安装thinbackup插件 2丶系统管理选择thinbackup插件 3丶创建备份目录 mkdir /bac ...

  5. 关于linux时间

    时区确定cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看硬件时间hwclock --show 将系统时间写入硬件时间hwclock --sy ...

  6. 请爱护你的JTAG烧录口---记录

        排除了下载线的问题后,还是不能访问FPGA的JTAG口,那么很有可能你的FPGA芯片的JTAG口已经损坏.此时请用万用表检查TCK,TMS,TDO和Tdi是否和GND短路,如果任何一个信号对地 ...

  7. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  8. 机器学习之路:python 特征降维 特征筛选 feature_selection

    特征提取: 特征降维的手段 抛弃对结果没有联系的特征 抛弃对结果联系较少的特征 以这种方式,降低维度 数据集的特征过多,有些对结果没有任何关系,这个时候,将没有关系的特征删除,反而能获得更好的预测结果 ...

  9. Django扩展

    一.文件上传 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name=" ...

  10. NOI.AC WC模拟赛

    4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...