《Linux系统移植-Uboot.pdf》由会员分享,可在线阅读,更多相关《Linux系统移植-Uboot.pdf(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Linux系统移植 目 录 目 录第一部分 前言.81硬件环境.81.1 主机硬件环境.81.2目标板硬件环境.81.3 工具介绍.82 软件环境.82.1 主机软件环境.82.1.1Windows操作系统.82.1.2Linux操作系统 .82.1.3目标板最后运行的环境.92.2Linux下工作用户及环境.92.2.1交叉工具的安装.92.2.2uboot移植工作目录.92.2.3内核及应用程序移植工作.92.3配置系统服务.102.3.1tftp 服务器的配置.102.4工具使用.122.4.1minicom的使用.123作者介绍.133.1策划,组织,指导,发布者.133.2ADSbo
2、otloader部分.133.3交叉工具部分.133.4uboot 部分.133.5内核部分.133.6应用程序部分.133.7网卡驱动部分.133.8NandFlash驱动部分.13第二部分 系统启动bootloader 的编写(ADS).141工具介绍.141.1ADS命令行命令介绍.141.1.1armasm.141.1.2armcc,armcpp.141.1.3armlink.142基本原理.152.1可执行文件组成及内存映射.152.1.1可执行文件的组成.152.1.2装载过程.162.1.3启动过程的汇编部分.172.1.4启动过程的 C部分.173AXD的使用以及源代码说明.1
3、83.1源代码说明.183.1.1汇编源代码说明.183.1.2C语言源代码说明.233.1.3源代码下载.233.2AXD的使用.233.2.1配置仿真器.233.2.2启动 AXD配置开发板.23第三部分 GNU交叉工具链.251设置环境变量,准备源码及相关补丁.251.1设置环境变量.251.2准备源码包.251.2.1binuils.251.2.2gcc.251.2.3glibc.251.2.4linuxkernel.261.3准备补丁.261.3.1ioperm.c.diff.261.3.2flow.c.diff.261.3.3tlinux.diff.261.4编译 GNUbinut
4、ils.261.5准备内核头文件.261.5.1使用当前平台的 gcc编译内核头文件.261.5.2复制内核头文件.271.6译编glibc头文件.271.7编译gcc第一阶段.271.8编译完整的glibc.271.9编译完整的gcc.282GNU 交叉工具链的下载.282.1ARM 官方网站.282.2本文档提供的下载.283GNU 交叉工具链的介绍与使用.293.1常用工具介绍.293.2.1armlinuxgcc的使用.293.2.2armlinuxar和 armlinuxranlib 的使用.303.2.3armlinuxobjdump的使用.303.2.4armlinuxreade
5、lf 的使用.313.2.6armlinuxcopydump的使用.324ARMGNU 常用汇编语言介绍.324.1ARMGNU常用汇编伪指令介绍.324.2ARMGNU专有符号.334.3操作码.335可执行生成说明.335.1lds文件说明.335.1.1主要符号说明.335.1.2段定义说明.34第四部分 uboot 的移植.351uboot的介绍及系统结构.351.1uboot 介绍.351.2获取uboot.351.3uboot 体系结构.351.3.1uboot目录结构.352uboot的启动过程及工作原理.362.1启动模式介绍.362.2阶段1 介绍.362.2.1定义入口.3
6、62.2.2设置异常向量.372.2.3设置 CPU的模式为SVC模式.372.2.4关闭看门狗.372.2.5禁掉所有中断.372.2.6设置以 CPU的频率.372.2.7设置 CP15.372.2.8配置内存区控制寄存器.382.2.9安装 UBOOT 使的栈空间.382.2.10BSS 段清 0.382.2.11搬移 NandFlash代码.392.2.12进入 C代码部分.392.3阶段2 的C语言代码部分.392.3.1 调用一系列的初始化函数.392.3.2初始化网络设备.412.3.3进入主 UBOOT 命令行.412.4代码搬运.413uboot的移植过程.423.1环境.4
7、23.2步骤.423.2.1修改 Makefile.423.2.2在 board子目录中建立 crane2410.423.2.3在 include/configs/中建立配置头文件.423.2.4指定交叉编译工具的路径.423.2.5测试编译能否成功.423.2.6修改 lowlevel_init.S 文件.433.2.9UBOOT 的 NandFlash移植.453.2.8 重新编译uboot.453.2.9把 uboot烧入flash.454UBOOT 命令的使用.464.1UBOOT命令的介绍.464.1.1获得帮助信息.464.2常用命令使用说明.474.2.1askenv(F).47
8、4.2.2autoscr.474.2.3base.474.2.4bdinfo.474.2.5bootp.474.2.8tftp(tftpboot).484.2.9bootm.484.2.10go.484.2.11cmp.484.2.12coninfo.484.2.13cp.484.2.14date.494.2.15erase(F).494.2.16flinfo(F).494.2.17iminfo.494.2.18loadb.494.2.19md.494.2.20mm.504.2.21mtest.504.2.22mw.504.2.23nm.504.2.24printenv.504.2.25pin
9、g.514.2.26reset.514.2.27run.514.2.28saveenv(F).514.2.29setenv.514.2.30sleep.514.2.31version.514.2.32nandinfo.514.2.33nanddevice.514.2.34nandbad.514.2.35nandread.524.2.36nanderease.524.2.37nandwrite.524.3命令简写说明.524.4把文件写入NandFlash.534.5下载提供.535参考资料.53第五部分 linux2.6内核的移植.531内核移植过程.531.1下载linux 内核.531.2
10、修改Makefile.531.3设置flash 分区.541.3.1 指明分区信息.541.3.2指定启动时初始化.561.3.3禁止 FlashECC校验.561.4配置内核.561.4.1支持启动时挂载 devfs.561.4.2 配置内核产生.config 文件.571.4.3 编译内核.581.4.4下载 zImage到开发板.582创建 uImage.612.1相关技术背景介绍.612.2在内核中创建uImage 的方法.612.2.1获取 mkimage工具.612.2.2修改内核的 Makefile文件.613 追加实验记录.623.1 移植 linux2.6.15.7.623.
11、2 移植 linux2.6.16.21.623.3移植linux2.6.17.624参考资料.62第六部分 应用程序的移植.631 构造目标板的根目录及文件系统.631.1建立一个目标板的空根目录.631.2在 my_rootfs 中建立Linux 目录树.631.3创建linuxrc文件.632移植 Busybox.642.1下载busybox.642.3编译并安装Busybox.653移植 TinyLogin.663.1下载.663.2修改tinyLogin 的 Makefile.663.3编译并安装.664相关配置文件的创建.664.1创建帐号及密码文件.664.2创建profile文件
12、.674.4创建fstab 文件.674.5创建inetd.conf 配置文件.675移植 inetd.675.1inetd的选择及获取.675.1.1获取 inetd.675.2编译inetd.675.2.1修改 configure文件.675.2.2编译.685.3配置inetd.685.3.1拷贝 inetd 到根文件系统的usr/sbin目录中.686移植 thttpdWeb服务器.696.1下载.696.2编译thttpd.696.3配置.696.3.1拷贝 thttpd 二进制可执行文件到根文件系统/usr/sbin/目录中.696.3.2修改 thttpd 配置文件.696.3.
13、3转移到根文件系统目录,创建相应的文件.697建立根目录文件系统包.707.1建立CRAMFS 包.707.1.1下载 cramfs 工具.707.1.2制作 cramfs 包.707.1.3写 cramfs 包到NandFlash.708参考资料.70第七部分 Nandflash驱动的编写与移植.711Nandflash工作原理.711.1Nandflash芯片工作原理.711.1.1芯片内部存储布局及存储操作特点.711.1.2重要芯片引脚功能.711.1.3寻址方式.711.1.4Nandflash主要内设命令详细介绍.721.2NandFlash控制器工作原理.721.2.1NandF
14、lash 控制器特性.721.2.2NandFlash 控制器工作原理.721.3Nandflash控制器中特殊功能寄存器详细介绍.721.4NandFlash控制器中的硬件ECC介绍.731.4.1ECC产生方法.731.4.2ECC生成器工作过程.741.4.3ECC的运用.742在 ADS下flash 烧写程序.742.1ADS 下 flash 烧写程序原理及结构.742.2第三层实现说明.742.1.1特殊功能寄存器定义.742.1.2操作的函数实现.742.3第二层实现说明.752.3.1NandFlash初始化.752.3.3获取 NandflashID.752.3.4Nandfl
15、ash写入.762.3.5Nandflash读取.772.3.6Nandflash标记坏块.782.3.7NandFlash 检查坏块.792.3.8擦除指定块中数据.792.4第一层的实现.803在 UBOOT 对NandFlash 的支持.823.1UBOOT对从 NandFlash启动的支持.823.1.1从 NandFlash启动UBOOT 的基本原理.823.1.2支持 NandFlash启动代码说明.823.2UBOOT对 NandFlash命令的支持.843.2.1主要数据结构介绍.843.2.2支持的命令函数说明.854在 Linux 对NandFlash 的支持.874.1L
16、inux下NandFlash调用关系.874.1.1NandFlash 设备添加时数据结构包含关系.874.1.2NandFlash 设备注册时数据结构包含关系.874.2Linux下NandFlash驱动主要数据结构说明.884.2.1s3c2410 专有数据结构.884.2.2Linux通用数据结构说明.894.3.1注册 driver_register.944.3.2探测设备 probe.944.3.3初始化 NandFlash控制器.944.3.4移除设备.944.3.5NandFlash 芯片初始化.944.3.6读 NandFlash.954.3.7写 NandFlash.95第八
17、部分 Cs8900a网卡驱动的编写与移植.951Cs8900a工作原理.952在 ADS下cs8900a的实现.952.1在 cs8900a下实现的ping工具.953在 uboot下cs8900a的支持.963.1uboot 下cs8900a的驱动介绍.963.2uboot 下cs8900a的移植说明.964在 linux 下cs8900a驱动的编写与移植.964.1Linux下cs8900a的驱动说明.964.2Linux下 cs8900a的移植说明.964.2.1为 cs8900a建立编译菜单.964.2.2修改 S3C2410相关信息.97序 该文档的目的是总结我们在工作中的一些经验,
18、并把它们分享给喜欢 ARM 和 Linux 的朋友,如有错误之处,请大家多多指点.同样,我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步.该文档是一份交流性文档,只供个人学习与交流,不允许公司和企业用于商业行为.第一部分 前言第一部分 前言1 硬件环境硬件环境1.1 主机硬件环境主机硬件环境 开发机:Pentium-4 CPU 内存:512MB 硬盘:60GB1.2 目标板硬件环境目标板硬件环境 CPU:S3C2410 SDRAM:HY57V561620 Nand flash:K9F1208U0B(64MB)以太网芯片:CS8900A(10M/100MB)1.3 工具介绍工具
19、介绍 仿真器:Dragon-ICE 电缆:串口线,并口线2软件环境软件环境2.1 主机软件环境主机软件环境2.1.1 Windows 操作系统操作系统 ADS 编译工具:ADS1.2 仿真器软件:Dragon-ICE daemon 程序2.1.2 Linux操作系统 操作系统 GNU 交叉编译工具:2.95.3:作用:编译 u-boot 3.3.2,3.4.4:作用:编译内核和应用程序 其它工作:tree 工具:作用:查看文件目录树下载:从 ftp:/mama.indstate.edu/linux/tree/下载编译2.1.3 目标板最后运行的环境目标板最后运行的环境 启动程序:u-boot-
20、1.1.4 内核:linux-2.6.14.1 应用程序:1.busybox-1.1.32.TinyLogin-1.4 3.Thttpd-2.252.2 Linux 下工作用户及环境下工作用户及环境2.2.1 交叉工具的安装交叉工具的安装工具链的编译过程请参考第三部分.1.下载交叉工具2.95.3 下载地址:ftp:/ftp.arm.linux.org.uk/pub/armlinux/toolchain/cross-2.95.3.tar.bz23.3.4 下载地址:2.编译交叉工具rootlocalhost mkdir/usr/local/armrootlocalhost cd/usr/loc
21、al/arm把 cross-2.95.2.tar.bz2,cross-3.4.4.tar.gz 拷贝到/usr/local/arm 目录中。解压这两个包。rootlocalhost tar-xjvf cross-2.95.2.tar.bz2rootlocalhost tar-xzvf cross-3.4.4.tar.gz2.2.2 u-boot移植工作目录移植工作目录1.添加工作用户rootlocalhost#useradd-G root-g root-d/home/uboot uboot2.建立工作目录ubootlocalhost$mkdir dev_homeubootlocalhost$c
22、d dev_homeubootlocalhost dev_home$mkdir doc mybootloader uboot.|-doc|-mybootloader-uboot3.建立环境变量ubootlocalhost vi/.bashrcexport PATH=/usr/local/arm/2.95.3/bin:$PATH2.2.3 内核及应用程序移植工作内核及应用程序移植工作1.添加工作用户rootlocalhost#useradd-G root-g root-d/home/arm arm2.建立工作目录armlocalhost arm$mkdir dev_homearmlocalhos
23、t arm$cd dev_homearmlocalhost arm$mkdir bootldr btools debug doc images kernel localapps rootfs sysapps tmp toolsarmlocalhost arm$tree-L 1.|-bootldr|-btools|-debug|-doc|-images|-kernel|-localapps|-rootfs|-sysapps|-tmp-tools 可以看到如上树形结构。注:tree 命令3.建立环境变量设置脚本armlocalhost arm$vi env_sh#!/bin/bashPRJROOT
24、=/dev_homeKERNEL=$PRJROOT/kernelROOTFS=$PRJROOT/rootfsLAPP=$PRJROOT/localappsDOC=$PRJROOT/docTMP=$PRJROOT/tmpexport PRJROOT KERNEL LAPP ROOTFSexport PATH=/usr/local/arm/3.4.4/bin:$PATH4.登陆时启动环境变量armlocalhost arm$vi/.bashrc./dev_home/env_sh重新登陆 arm 用户,环境变量生效armlocalhost arm$su arm2.3 配置系统服务配置系统服务2.3.
25、1 tftp服务器的配置服务器的配置如果用下面一条命令能够看到服务已经启动,则不用安装,否则需要按 1 或 2 点安装 tftp-server 服务器.armlocalhost arm#netstat-a|grep tftpudp 0 0*:tftp *:*1.从 RPM 包安装 tftp-server 从对应 Linux 操作系统版本的安装光盘上找到 tftp-server 的安装包.下面 tftp-server-0.32-4.i386.rpm 包为例,把 rpm 包拷贝到 dev_home/btools/下.armlocalhost arm#cp tftp-server-0.32-4.i3
26、86.rpm/home/arm/dev_home/btools/armlocalhost arm#su rootrootlocalhost arm#rpm-q tftp-server如果没有安装 tftp-server,就要用下面命令安装,否则,直接进入第 2 步配置服务.rootlocalhost arm#cd/home/arm/dev_home/btools/rootlocalhost btools#rpm-ivh tftp-server-0.32-4.i386.rpm 建立 tftp 的主工作目录rootlocalhost btools#mkdir/tftpboot2.修改配置文件并启动
27、服务 备份配置文件rootlocalhost btools#if -f/etc/xinetd.d/tftp then cp/etc/xinetd.d/tftp/etc/xinetd.d/tftp.old fi 修改配置文件rootlocalhost btools#vi/etc/xinetd.d/tftpservice tftp disable=no socket_type =dgram protocol =udp wait =yes user =root server =/usr/sbin/in.tftpd server_args =-s/tftpboot per_source =11 cps
28、 =100 2 flags =IPv4 检查 tftp 服务是否打开rootlocalhost btools#chkconfig-list 如果 tftp 的服务没有打开,则用下面命令打开 tftp 服务开关rootlocalhost btools#chkconfig tftp on 重启服务#/etc/init.d/xinetd restart#netstat-a|grep tftpudp 0 0*:tftp *:*2.3.2 NFS服务器的配置服务器的配置1.安装 NFS 服务器rootlocalhost btools#rpm-q nfs-utils如果没有安装,从对应 Linux 操作系
29、统版本的安装光盘上找到 nfs-utils 的安装包.Fedora 5 中的安装包名称为 nfs-utils-1.0.8.rc2-4.FC5.2.i386.rpm。下面以该安装包为例说明:rootlocalhost btools#rpm-ivh nfs-utils-1.0.8.rc2-4.FC5.2.i386.rpm2.配置 NFS 服务器rootlocalhost btools#vi/etc/exports#加入要允许被另外计算机 mount 的目录:#/home/arm/dev_home/tmp 为被另外计算机 mount 的目录#192.168.1.134 允许另外计算机 mount 的
30、 IP#rw,sync,no_root_squash 表示访问限制,更详细说明见相关手册./home/arm/dev_home/tmp 192.168.1.134(rw,sync,no_root_squash)3.启动 NFS 服务器第一启动 NFS 服务器时用下面命令.rootlocalhost btools#/etc/init.d/nfs start如果你已经启动了 NFS 服务器时,并且重新修改了/etc/exports 文件,用如下命令使新加入的目录生效:rootlocalhost btools#/etc/init.d/nfs reload4.测试 NFS 服务器rootlocalho
31、st btools#netstat-a|grep nfs5.显示被 export 出的目录列表rootlocalhost btools#exportfs2.4 工具使用工具使用2.4.1 minicom的使用的使用1.切换到 root 用户.rootlocalhost btools#su-2.查找有效的串设备.rootlocalhost#cat/proc/devices.4 ttyS.188 ttyUSB.如果是普通串口设备,设备名前缀为 ttyS,第一串口为 ttyS0,第二串口为 ttyS1,依次类推.如果是 USB 转串口的设备,设备名前缀为 ttyUSB,第一串口为 ttyUSB0.3
32、.配置 ttyUSB 设备rootlocalhost#minicom-s ttyUSB0 会出现一个 configuration 窗口,configuration Filenames and paths File transfer protocols Serial port setup Modem and dialing Screen and keyboard Save setup as ttyUSB0 Save setup as.Exit Exit from Minicom 选择 Serial port setup 配置.会出现如下窗口:A-Serial Device :/dev/ttyUS
33、B0 B-Lockfile Location :/var/lock C-Callin Program :D-Callout Program :E-Bps/Par/Bits :115200 8N1 F-Hardware Flow Control:No G-Software Flow Control:No Change which setting?我的设置如上所示,设置完成后,Change which setting?项上按回车退出当前窗口,回到第一个窗口.按 Save setup as ttyUSB0保存设置.再按 Exit from Minicom 退出Minicom.4.启动 minicom
34、rootlocalhost#minicom3 作者介绍作者介绍3.1 策划策划,组织组织,指导指导,发布者发布者 刘勇 email: 如果您有新的内容,请发到这个电子邮件,我们会把您的内容加入文档,并在作者列表中加入您的名字.3.2 ADS bootloader部分部分作者:刘勇email:3.3 交叉工具部分交叉工具部分作者:孙贺email:3.4 uboot部分部分作者:聂强email:作者:孙贺email:3.5 内核部分内核部分作者:聂大鹏email:作者:牛须乐(8900a 网卡移植部分)email:3.6 应用程序部分应用程序部分作者:聂大鹏email:3.7 Nand Flash
35、 驱动部分驱动部分作者:孙磊,刘勇email:4 支持企业支持企业4.1尚观科技 为我们提供统许多套远峰公司的 ARM 开发板,才能让我们做出统一的文档.第部分 系统启动第部分 系统启动bootloader的编写的编写(ADS)1 工具介绍工具介绍1.1 ADS 命令行命令介绍命令行命令介绍1.1.1 armasm1.命令:armasm 选项-o 目标文件 源文件2.选项说明-Errors 错误文件名 ;指定一个错误输出文件-I 目录,目录 ;指定源文件搜索目录-PreDefine 预定义宏 ;指定预定义的宏-NOCache ;编译源代码时禁止使用 Cache 进行优化-MaxCache ;编
36、译源代码时使用 Cache 进行优化-NOWarn ;关闭所有的警告信息-G ;输出调试表-keep ;在目标文件中保存本地符号表-LIttleend ;生成小端(Little-endian)ARM 代码-BIgend ;生成大端(Big-endian)ARM 代码-CPU ;设立目标板 ARM 核类型,如:arm920t.-16 ;建立 16 位的 thumb 指令.-32 ;建立 32 位的 ARM 指令.3.编译一个汇编文件c:adsloaderarmasm-LIttleend-cpu ARM920T-32 bdinit.s把汇编语言编译成小端,32 位,ARM920T CPU.1.1.
37、2 armcc,armcpp1.命令:armcc 选项 源文件 1 源文件 2.源文件 n2.选项说明-c ;编译但是不连接-D ;指定一个编译时使用的预定义宏常量-E ;仅仅对 C 源文件做预处理-g ;产生调试信息表-I ;指头文件的搜索路径-o ;指定一个输出的目标文件-O0/1/2 ;指定源代码的优化级别-S ;输出汇编代码来代替目标文件-CPU ;设立目标板 ARM 核类型,如:arm920t.3.编译一个 C 程序c:adsloaderarmcc-c-O1-cpu ARM920T bdisr.c编译不连接,二级优化,ARM920T CPU.1.1.3 armlink1.命令:arm
38、link 选项 输入文件2.选项说明-partial ;合并目标文件-Output 文件 ;指定输出文件名-scatter 文件 ;按照指定的文件为可执行文件建立内存映射-ro-base 地址值 ;只读代码段的起始地址-rw-base 地址值 ;RW/ZI 段的起始地址3.把多个目标文件合并成一个目标文件c:adsloaderarmlink-partial bdmain.o bdport.o bdserial.o bdmmu.o bdisr.o-o bd.o4.把几个目标文件编译一个可执地文件c:adsloaderarmlink bd.o bdinit.o-scatter bdscf.scf-
39、o bd.axf1.1.4 fromelf1.命令:fromelf 选项 输入文件2.选项说明-bin 二进制文件名 ;产生的二进制文件-elf elf 文件名 ;产生一个 elf 文件-text text 文件名 ;产生 text 文件3.产生一个可执行的二进制代码c:adsloaderfromelfbd.axfbinobd.bin2 基本原理基本原理2.1 可执行文件组成及内存映射可执行文件组成及内存映射2.1.1 可执行文件的组成可执行文件的组成 在 ADS 下,可执行文件有两种,一种是.axf 文件,带有调试信息,可供 AXD 调试工具使用.另一种是.bin文件,可执行的二进制代码文件
40、。我们重点是讲描.bin 文件的组成。我们把可执行文件分为两种情况:分别为存放态和运行态。1.存放态 存放态是指可执行文件通过 fromelf 产生后,在存储介质(flash 或磁盘)上的分布.此时可执行文件一般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段(.text)和只读数据段(.rodata),数据段又分为初始化数据段(.data)和未初始化数据段(.bss)。可执行文件的存放态如下:+-+-|.bss|+-+-数据段|.data|+-+-|.rodata|_|代码段|.text|+-+-2.运行态 可执行文件通过装载过程,搬入到 RAM 中运行,这时候可执行文件就变成运
41、行态。在 ADS 下对可执行代码各段有另一个名称:|.|+-+-|.bss|ZI 段 +-+-数据段|.data|RW 段 +-+-|.rodata|_|代码段(RO 段)|.text|+-+-|.|装载前 当可执行文件装载后,在 RAM 中的分布如下:|.|+-+-ZI 段结束地址|ZI 段|+-+-ZI 段起始地址|保留区 2|+-+-RW 段结束地址|RW 段|+-+-RW 段起始地址|保留区 1|+-+-RO 段结束地址|RO 段|+-+-RO 段起始地址|.|装载后 所以装载过程必须完成把执行文件的各个段从存储介质上搬到 RAM 指定的位置。而这个装载过程由谁来完成呢?由我们的启动程
42、序来完成.2.1.2 装载过程装载过程 在 ADS 中,可以通过两种方式来指定可执行代码各段在 RAM 中的位置,一个是用 armlink 来指定,一种是用 scatter 文件来指定.RAM 区的起始地址:0 x30000000.1.armlink 指定代码段地址 我们通常的代码,只用指定两个段开始地址,RO 段的起始地址和 RW 段的起始地址,ZI 段紧接在 RW 段之后.示例见该部分的 1.1.3.2.scatter 指定代码段地址 我们也可以通过 scatter 文件指定可执行文件各段的详细地址.Scatter 文件如下:MYLOADER0 x30000000 ;MYLOADER:为可
43、执行文件的名称,可自定义 ;0 x3000000:起始地址 RO0 x30000000 ;RO只读代码段的名称 ;0 x30000000:只读代码段的起始地址 init.o(Init,+First);Init 代码段为可执行文件的第一部分.*(+RO);所有其它的代码段和只读数据段放在该部分 RW+0 ;RW:RW段的名称 ;+0:表示 RW 段紧接着 RO段 *(+RW);所有 RW段放在该部分 ZI+0 ;ZI:ZI 段的名称 ;+0:表示 ZI 段紧接着 RW 段 *(+ZI);所有 ZI 段放在该部分 3.ADS 产生的各代码段宏|Image$RO$Base|/*RO代码段起始地址*/
44、|Image$RO$Limit|/*RO代码段结束地址*/|Image$RW$Base|/*RW 代码段起始地址*/|Image$RW$Limit|/*RW代码段结束地址*/|Image$ZI$Base|/*ZI代码段起始地址 */|Image$ZI$Limit|/*ZI代码段结束地址 */注意:在两个$之间的名称,与 scatter 中指定的段的名称相同.4.装载过程说明 当从 NorFlash 启动时,要把 flash 芯片的首地址映射到 0 x00000000 位置,系统启动后,启动程序本身把自己从flash中搬到 RAM中运行.搬移后的各段起始地址,由以上宏来确定.当从 NandFla
45、sh 启动时,S3C2410会自动把前 NandFlash 的前 4k 搬到 S3C2410 的内部 RAM中,并把内部RAM的首地址设为 0 x00000000,CPU从 0 x00000000 开始执行.所以,在 nandFlash 的前 4k 程序中,必须包含从NandFlash把 BootLoader的其余部分装入 RAM的程序.2.1.3 启动过程的汇编部分启动过程的汇编部分 当系统启动时,ARMCPU会跳到 0 x00000000 去执行。一般 BootLoader都包括如下几个部分:1.建立中断向量异常表2.显示的切换到 SVC 且 32 指令模式3.关闭 S3C2410 的内部
46、看门狗4.禁止所有的中断5.配置系统时钟频率和总线频率6.设置内存区的控制寄存器7.初始化中断8.安装中断向表量9.把可执行文件的各个段搬到运行态的各个位置10.跳到 C 代码部分执行2.1.4 启动过程的启动过程的C部分部分1.初始化 MMU2.初始化外部端口3.中断处理程序表初始化4.串口初始化5.其它部分初始化(可选)6.主程序循环3 AXD的使用以及源代码说明的使用以及源代码说明3.1 源代码说明源代码说明3.1.1 汇编源代码说明汇编源代码说明;=;引用头文件;=get bdinit.h;=;引用标准变量;=IMPORT|Image$RO$Base|;Base address o f
47、 RO section IMPORT|Image$RO$Limit|;End address of RO sectionIMPORT|Image$RW$Base|;Base address o f RW sectionIMPORT|Image$RW$Limit|;End address of RW sectionIMPORT|Image$ZI$Base|;Base address o f ZI sectionIMPORT|Image$ZI$Limit|;End addresss of ZI sectionIMPORT bdmain ;The entry function of C progra
48、m;=;宏定义;=;macro HANDLER MACRO$HandlerLabel HANDLER$HandleLabel$HandlerLabel sub sp,sp,#4 ;Decremen t sp(to store jump address)stmfd sp!,r0 ;PUSH the work register to stack ldr r0,=$HandleLabel;Load the address of HandleXXX to r0 ldr r0,r0 ;Lo ad the contents(service routine start address)of HandleXX
49、X str r0,sp,#4 ;S tore the contents(ISR)of HandleXXX to stack ldmfd sp!,r0,pc ;POP the work register and pc(jump to ISR)MEND;=;汇编语言的入口代码;=AREA Init,CODE,READONLYCODE32ENTRY;=;建立中断向量表;=b reset_handler ;0 x00000000:Reset(SVC)b undef_handler ;0 x00000004:Undefined instruction(Undef)b swi_handler ;0 x00
50、000008:Software Interrupt(SVC)b iabr_handler ;0 x0000000C:Instruction Abort(Abort)b dabr_handler ;0 x00000010:Data Abort(Abort)b no_handler ;0 x00000014:b irq_handler ;0 x00000018:IRQ(IRQ)b fiq_handler ;0 x0000001C:FIQ(FIQ)LTORGundef_handler HANDLER HandleUndefswi_handler HANDLER HandleSWIiabr_handl