通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2010-3-4
跳转到指定楼层
1#
发表于 2010-7-16 16:52:09 |只看该作者 |倒序浏览
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。
内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。
顶嵌官网:http://www.top-e.org/
顶嵌嵌入式原创视频教程:http://www.top-e.org/page/search/index.php
顶嵌嵌入式技术教程:http://www.top-e.org/jiaoshi/class/
一.移植准备
1.目标板
我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址:
http://bbs.eeworld.com.cn/thread-80832-5-1.html。bootloader移植准备。
   
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的外部时钟源输入。
如下图所示:
4.制作开发板配置文件
我们选用的是比较通用配置的开发板,所以用内核中自带的配置文件,进行修改是比较方便的做法。该配置单在内核源码的“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”文件后,退出配置单。
    5.修改机器码
    在我们之前移植的uboot的机器码是168,这里需要修改机器码,否则会出现不能启动的情况。机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,在大概379行,把原来的362改为168保存即可。如下图:
    6.修改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、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)
    这将是下一阶段的内容。

    举报本楼

    本帖有 2 个回帖,您需要登录后才能浏览 登录 | 注册
    您需要登录后才可以回帖 登录 | 注册 |

    手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

    GMT+8, 2024-11-16 13:32 , Processed in 0.450173 second(s), 15 queries , Gzip On.

    Copyright © 1999-2023 C114 All Rights Reserved

    Discuz Licensed

    回顶部