68

帖子

0

TA的资源

纯净的硅(中级)

61
 

第三阶段:内核移植的过程(1)

内核移植阶段

内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。
内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。
一. 移植准备
1. 目标板
我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址:    https://bbs.eeworld.com.cn/thread-80832-5-1.htmlbootloader移植准备。


2. 内核源码
这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2

3. 烧写工具
我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持


4. 知识储备
要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进行简单介绍。
(1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录

(2)block/: 部分块设备驱动程序

(3)crypto: 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法


(4) documentation/: 文档目录,没有内核代码,只是一套有用的文档

(5) drivers/: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。

(6)fs/: 所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统, 例如fat和ext2

(7)include/: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录

(8) init/: 这个目录包含核心的初始化代码(注:不是系统的引导代码),主要包含两个文件main.c和Version.c,这是研究核心如何工作的好的起点之一

(9)ipc/: 这个目录包含核心的进程间通讯的代码


(10)kernel/: 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c

(11)lib/: 放置核心的库代码

(12) mm/:这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等

(13)net/: 核心与网络相关的代码


(14)scripts/: 描述文件,脚本,用于对核心的配置

(15)security: 主要是一个SELinux的模块


(16)sound: 常用音频设备的驱动程序等;


(17)usr: 实现了一个cpio


(18)COPYING: GPL版权申明;


(19)CREDITS: 光荣榜;

(20) Kbuild: 一个包含了某些通用规则的编译文件;


(21)MAINTAINERS: 维护人员列表,对当前版本的内核各部分都有谁负责;


(22) Makefile: 第一个Makefile文件。用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系,编译时使用;仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助;


(23)ReadMe: 核心及其编译配置方法简单介绍;


(24)REPORTING-BUGS:有关报告Bug 的一些内容;

一 般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联 系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。

二.内核源码修改
1.解压内核
解压内核源码到计算机的工作环境中,我们下载的内核源码是.bz2格式压缩包使用解压命令:#tar xvfj linux-2.6.25.8.tar.bz2 解压到当前目录。

2.添加arm支持

进如解压好的内核源码文件夹中,#cd linux-2.6.25.8修改“Makefile”文件,在大概193行“ARCH =SUBARCH”和194行“CROSS_COMPILE =”,将其修改为“ARCH =arm”和“CROSS_COMPILE =arm-linux-”(根据自己的实际情况添加自己的交叉编译工具的路径),然后保存。如下图:



3.修改平台时钟
修改平台的时钟频率,以满足开发板的工作频率。修改内核源码“arch/arm/mach-s3c2440/mach-s3c2440.c” 文件的162行,把16.9344MHz改为12MHz,因为我们选用的开发板使用的就是12MHz的外部时钟源输入。
如下图所示:

                                              此文章为顶嵌原创技术文章,如有转载请注明出处,否则顶嵌享有追究对方法律责任的权利,谢谢合作!

回复

2131

帖子

0

TA的资源

至上芯片

62
 
期待中,这样的课程不多啊!
大家要努力学习噢!
 
个人签名处处留心皆学问!
 

回复

18

帖子

0

TA的资源

一粒金砂(高级)

63
 
谢顶嵌和EEWORLD提供这么好的学习机会
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

64
 
紧密关注,中
 
 
 

回复

353

帖子

0

TA的资源

五彩晶圆(中级)

65
 
有时间得好好看下
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(高级)

66
 
好东西,要经常关注,学习。
 
 
 

回复

182

帖子

0

TA的资源

纯净的硅(高级)

67
 
顶一下,很想学习嵌入式可惜基础不够牢固,打基础ing!!!!!!!!:Q
 
个人签名基础决定高度!
 
 

回复

526

帖子

0

TA的资源

五彩晶圆(中级)

68
 
哦,来关注下……
 
 
 

回复

68

帖子

0

TA的资源

纯净的硅(中级)

69
 

第三阶段:内核移植的过程(2)

制作开发板配置文件
        我们选用的是比较通用配置的开发板,所以用内核中自带的配置文件,进行修改是比较方便的做法。该配置单在内核源码的“arch/arm/configs/”目录下面,名为:“s3c2410_defconfig”,该配置文件里面选择了几乎所有的和S3C24XX系列CPU相关的配置选项,我们完全可以在该配置单的基础上进行配置。首先将该文件考到根目录命名为.config  指令为:# cp arch/arm/configs/s3c2410default_config .config然后返回到配置界面,进入到内核配置单输入指令为:#make menuconfig 出现如图所示的配置界面:
        

        选择“System Type”选项,然后配置各个平台如下所示:
System Type  --->
          S3C2410 Machines  --->     
                SMDK2410/A9M2410   
                [ ] IPAQ H1940         
                [ ] Acer N30           
                [ ] Simtec Electronics BAST (EB2410ITX)
                [ ] NexVision OTOM Board         
                [ ] AML M5900 Series   
                [ ] Thorcom VR1000     
                [ ] QT2410
          S3C2412 Machines  --->      
                [ ] SMDK2413           
                [ ] SMDK2412           
                [ ] VMSTMS  
          S3C2440 Machines  --->      
                [ ] Simtec Electronics ANUBIS   
                [ ] Simtec IM2440D20 (OSIRIS) module
                [ ] HP iPAQ rx3715     
                SMDK2440           
                [ ] NexVision NEXCODER 2440 Light Board
                SMDK2440 with S3C2440 CPU module
          S3C2442 Machines  --->      
                [ ] SMDM2440 with S3C2442 CPU module
          S3C2443 Machines  --->      
                [ ] SMDK2443
        配置完毕这个地方后,退回到最初的配置单。然后选择选项:“Save an Alternate Configuration File”,将其保存为:“.config”文件,因为编译系统时会调用该文件。如下面的图所示:


        保存为“.config”文件后,退出配置单。

修改机器码
           在我们之前移植的uboot的机器码是168,这里需要修改机器码,否则会出现不能启动的情况。机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,在大概379行,把原来的362改为168保存即可。如下图:


修改nandflash分区
修改内核源码中的“arch/arm/liat-s3c24xx/common-smdk.c”文件,在109行附近会有名为 smdk_nand_part[]的结构体将其修改为:
static struct mtd_partition smdk_default_nand_part[] = {
         [0] = {
                 .name   = "Top-E:u-boot",
                 .size   = 0x40000,
                 .offset = 0,
         },
         [1] = {
                 .name   = "Top-E:kernel",
                 .offset = 0x40000,
                 .size   = 0x4c0000,
         },
         [2] = {
                 .name   = "Top-E:fs",
                 .offset = 0x500000,
                 .size   = 0x3b00000,
         }
};
其中name为内核启动时的标注,内容可根据自己需要填写,便于自己他人识别。offset为分区的起始地址,size为分区的大小。如下图所示:


   
        三.制作镜像
然后输入:#make zImage,就可以进行编译了,编译完毕后,会在内核源码的“arch/arm/boot/”目录下面生成名为“zImage”的镜像,利用mkimage工具把生成的zImage转换成uIamge,(可以直接烧写zImage启动,我比较习惯用uImage)使用命令:#./mkimage –A arm –O linux –T kernel –C none –a 30008000 –e 30008040 –n “linux kernel” –d arch/arm/boot/zImage uImage
        参数说明:
        -A 指定CPU 的体系结构:
        取值 表示的体系结构
        alpha Alpha
        arm A RM
        x86 Intel x86
        ia64 IA64
        mips MIPS
        mips64 MIPS 64 Bit
        ppc PowerPC
        s390 IBM S390
        sh SuperH
        sparc SPARC
        sparc64 SPARC 64 Bit
        m68k MC68000
        我们选arm
        -O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、
 
 
 

回复

565

帖子

513

TA的资源

裸片初长成(中级)

70
 
真的很详细 谢谢分享~~
 
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

71
 

来顶下

我买过以前李亚锋老师写过的书,其中书上面写的不够详细,还有部分错误,而这这里得到了改善,内容详细,叙述正确.写得真的很不错!我喜欢.UP
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

72
 
真的不错,太谢谢楼主了
 
 
 

回复

86

帖子

0

TA的资源

纯净的硅(初级)

73
 
不错的课程,就是最近太忙了,都没时间学习了
 
个人签名尽管我们不能改变制度,也不一定能够改变别人,但我们可以改变自己,因为没有人能够阻止我们不断进步。
 
 

回复

2131

帖子

0

TA的资源

至上芯片

74
 
在次项起,写的太好了!
 
个人签名处处留心皆学问!
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

75
 

加油!

顶嵌加油!EEWORLD加油,学习嵌入式的朋友们,加油!!!
 
 
 

回复

2万

帖子

74

TA的资源

管理员

76
 
大家在学习过程中有什么问题,也可以随时讨论啊 顶嵌的老师很乐于帮助大家解惑~~

也谢谢顶嵌老师的辛苦工作
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

针对本教程做一样的操作,会很简单,完全照模子改。但是,如果换了一个硬件平台,并且内核版本也不一样? 那么如何确定我要修改的位置?有什么说明文档或者介绍类的资料吗?  详情 回复 发表于 2014-8-6 18:14
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

77
 

顶嵌的另一个含义

就是:要想学好嵌入式系统,必须先要顶贴.顶顶顶~~~~~
 
 
 

回复

68

帖子

0

TA的资源

纯净的硅(中级)

78
 
第三阶段:内核移植的过程(3)

三.制作镜像

然后输入:#make zImage,就可以进行编译了,编译完毕后,会在内核源码的“arch/arm/boot/”目录下面生成名为“zImage”的镜像,利用mkimage工具把生成的zImage转换成uIamge,(可以直接烧写zImage启动,我比较习惯用uImage)使用命令:#./mkimage –A arm –O linux –T kernel –C none –a 30008000 –e 30008040 –n “linux kernel” –d arch/arm/boot/zImage uImage

参数说明:

-A 指定CPU 的体系结构:

取值 表示的体系结构

alpha Alpha

arm A RM

x86 Intel x86

ia64 IA64

mips MIPS

mips64 MIPS 64 Bit

ppc PowerPC

s390 IBM S390

sh SuperH

sparc SPARC

sparc64 SPARC 64 Bit

m68k MC68000

我们选arm

-O 指定操作系统类型,可以取以下值:

openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

我们选linux。

-T 指定映象类型,可以取以下值:

standalone、kernel、ramdisk、multi、firmware、script、filesystem

我们制作的是内核映象,所以选kernel。

-C 指定映象压缩方式,可以取以下值:

none 不压缩

gzip 用gzip 的压缩方式

bzip2 用bzip2 的压缩方式

我们用的是非压缩方式,所以是none。

-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage 制作映象时,这个参数所指定的地址值来下载这里指定为30008000,使用时要把内核映象加载到内存的30008000 处。不要使用其他的地址。

-e 指定映象运行的入口点地址,这个地址就是-a 参数指定的值加上0x40(因为前面有个mkimage 添加的0x40 个字节的头)uImage 其实就是mkimage 在zImage 前面加了个文件头。

-n 指定映象名

-d 指定制作映象的源文件


四.内核镜像的烧写

内核的烧写我们采用tftp方式,用网线将目标板和pc机连接起来,配置好目标板的网络参数,主要是serverip、ipaddr。

首先将uImage下载到内存中:
#tftp 30008000 uImage

按照之前内核的nandflash分区进行烧写,将内存中的内核镜像烧到flash中:

#nand erase 40000 4c0000


#nand write 30008000 40000 4c0000



重启uboot使其加载内核。

串口打印启动信息,部分信息如下图:

下图是打印的分区信息:
注意:

由于目前还没有烧写文件系统,所以内核运行到加载文件系统时会出现问题,提示信息如下:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
这将是下一阶段的内容。
 
个人签名顶嵌与您一起关注嵌入式行业!
http://www.top-e.org/
 
 

回复

157

帖子

0

TA的资源

纯净的硅(高级)

79
 
跟着学习................我转来这个版块了.
 
 
 

回复

157

帖子

0

TA的资源

纯净的硅(高级)

80
 
跟着学习........
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表