《linux内核移植》由会员分享,可在线阅读,更多相关《linux内核移植(6页珍藏版)》请在金锄头文库上搜索。
1、Linux 内核移植在 Linux 内核移植到 ARM 处理器时,有一个问题不能忽视,那就是移植Bootloader,Linux 内核启动部分的代码需要判断从 Bootloader 传递过来的寄存器值。为什么需要 Bootloader 呢?这与硬件本身的启动方式有关,有了Bootloader 可以方便系统的开发。通过这段 Bootloader 小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。(1)Bootloader 所支持的 CPU 和嵌入式板每种不同的 CPU 体系结构都有不同的 Bootloader,
2、有些 Bootloader也支持多 种体系结构的 CPU,如 UBoot 。除了依赖于 CPU 的体系结构外,Bootloader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对 于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot-loader 程序也能运行在另一块板子上,通常也都 需要修改Bootloader 的源程序。(2)Bootloader 的安装媒介系统加电或复位后,所有的 CPU 通常都从某个预先安排的地址上取指令。比如,基于 ARM 内核的 CPU 在复位时通常都从地址 Ox00000000 取它的第一条指令。而基于 C
3、PU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 Hash 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Bootloader 程序。如图所示就是一个同时装有Bootloader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。图 固态存储设备的典型空间分配结构(3)用来控制 Boot-loader 的设备或机制主机和目标机之间一般通过串口建立连接,Bootloader 软件在执行时通常会通过串口来进行 IO,比如:输出打印信息到串口,从串口读取用户控制字符等。(4)Boot-loader 的启动过程是单
4、阶段还是多阶段通常多阶段的 Boot-loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot-loader 大多都是 2 阶段的启动过程,即启动过程可以分为 stage 1 和 stage2 两部分。(5)Boot-loader 的操作模式大多数 Boot-loader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这两种区别不是很大。从最终用户的角度看,Boot-loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。启动加载模式:这种模式也称为“自主” 模式。即 Bootloader 从目标机上的某个固态存储
5、设备上将操作系统加载到 SDRAM 中运行,整个过程并没有用户的介入。这种模式是 Bootloader 的正常工作模式,因此在嵌入式产品发布时,Boot-loader 必须工作在这种模式下。下载模式:在这种模式下,目标机上的 Bootloader 将通过串口连接或网络连接等通信手段从 主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Bootloader 保存到目标板的 SDRAM 中,然后 再被 Boot-loader 写到目标板上的 Hash 类固态存储设备中。Bootloader 的这种模式通常在第一次安装内核与根文件系统时被使用;此 外,以后的
6、系统更新也会使用 Bootloader 的这种工作模式。工作于这种模式下的Bootloader 通常都会向它的终端用户提供一个简单的命令 行接口。(6)Bootloader 与主机之间进行文件传输所用的通信设备及协议最常见的情况就是,目标机上的 Bootloader 通过串口与主机之间进行文件传输,传输协议通 常是 xmodem ymodem zmodem 协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。此外,主机方所用的软件也要 考虑。比如,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来提供 TFTP 服
7、务。(7)Bootloader 的主要任务与典型结构框架首先做一个假定:假定内核映像与根文件系统映像都被加载到 SDRAM 中运行。因为,在嵌入式系统中 内核映像与根文件系统映像也可以直接在 ROM 或ash这样的固态存储设备中直接运行,但这种做法无疑是以运行速度的牺牲为代价的。从操作系统的角度 看,Boot loader 的总目标就是正确地调用内核来执行。另外,由于 Bootloader 依赖于 CPU 的体系结构,因此大多数Bootloader 都分 为 stage 1 和 stage 2 两大部分。依赖于 CPU 体系结构的代码,比如设各初始化代码等,通常都放在 stage1 中,而且通
8、常都用 ARM 汇编语言来实现,以达到短小精悍的目的。 而 stage 2 则通常用 C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。Bootloader 的 stage 1 和 stage 2 通常包括如表所示的 5 个步骤(以执行的先后顺序列出)。(8)串口终端Bootloader 程序设计与实现后,串口终端就能正确地收到打印信息了。此外,向串口终端打印信息也是一个非常重要而又有效的调试手段。但是,经常会碰到串口终端显示乱码或根本没有显示的问题。发生这样的问题主要有两种原因:Bootloader 对串口的初始化设置不正确。运行在 Host 端的终端仿真程序对
9、串口的设置不正确,这包括波特率、奇偶校验、数据位和停止位等方面的设置。此外,有时也会碰到这样的问题,那就是:在 Bootloader 的运行过程中可以正确地向串口终端输出信息,但当 Bootloader 启动内核后却无法看到内核的启动输出信息。对发生这一问题的原因可以从以下几个方面来考虑。首先确认内核编译时配置了对串口终端的支持,并配置了正确的串口驱动程序。Bootloader 对串口的初始化设置可能会和内核对串口的初始化设置不一致,例如,Bootloader 和内核对其 CPU 时钟频率的设置不一致。最后,还要确认 Bootloader 所用的内核基地址必须和内核映像在编译时所用的运行基地址
10、 一致,尤其是对于 ARM Linux 而言。假设内核映像在编译时用的基地址是 0xc0028000,但 Bootloader 却将它加载到 0xc0010000 处去执行,那么内核 映像就不能正确地执行。在 Linux 内核移植到 ARM 处理器时,有一个问题不能忽视,那就是移植Bootloader,Linux 内核启动部分的代码需要判断从 Bootloader 传递过来的寄存器值。为什么需要 Bootloader 呢?这与硬件本身的启动方式有关,有了Bootloader 可以方便系统的开发。通过这段 Bootloader 小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件
11、环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。(1)Bootloader 所支持的 CPU 和嵌入式板每种不同的 CPU 体系结构都有不同的 Bootloader,有些 Bootloader也支持多 种体系结构的 CPU,如 UBoot 。除了依赖于 CPU 的体系结构外,Bootloader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对 于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot-loader 程序也能运行在另一块板子上,通常也都 需要修改Bootloader 的源程序。(2)Bootloader 的
12、安装媒介系统加电或复位后,所有的 CPU 通常都从某个预先安排的地址上取指令。比如,基于 ARM 内核的 CPU 在复位时通常都从地址 Ox00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 Hash 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Bootloader 程序。如图所示就是一个同时装有Bootloader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。图 固态存储设备的典型空间分配结构(3)用来控制 Boot-loader 的设备或机制主机和目标
13、机之间一般通过串口建立连接,Bootloader 软件在执行时通常会通过串口来进行 IO,比如:输出打印信息到串口,从串口读取用户控制字符等。(4)Boot-loader 的启动过程是单阶段还是多阶段通常多阶段的 Boot-loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot-loader 大多都是 2 阶段的启动过程,即启动过程可以分为 stage 1 和 stage2 两部分。(5)Boot-loader 的操作模式大多数 Boot-loader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这两种区别不是很大。从最终用户的角度看,Boot-
14、loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。启动加载模式:这种模式也称为“自主” 模式。即 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 SDRAM 中运行,整个过程并没有用户的介入。这种模式是 Bootloader 的正常工作模式,因此在嵌入式产品发布时,Boot-loader 必须工作在这种模式下。下载模式:在这种模式下,目标机上的 Bootloader 将通过串口连接或网络连接等通信手段从 主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Bootloader 保存到目标板的
15、 SDRAM 中,然后 再被 Boot-loader 写到目标板上的 Hash 类固态存储设备中。Bootloader 的这种模式通常在第一次安装内核与根文件系统时被使用;此 外,以后的系统更新也会使用 Bootloader 的这种工作模式。工作于这种模式下的Bootloader 通常都会向它的终端用户提供一个简单的命令 行接口。(6)Bootloader 与主机之间进行文件传输所用的通信设备及协议最常见的情况就是,目标机上的 Bootloader 通过串口与主机之间进行文件传输,传输协议通 常是 xmodem ymodem zmodem 协议中的一种。但是,串口传输的速度是有限的,因此通过以
16、太网连接并借助 TFTP 协议来下载文件是个更好的选择。此外,主机方所用的软件也要 考虑。比如,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来提供 TFTP 服务。(7)Bootloader 的主要任务与典型结构框架首先做一个假定:假定内核映像与根文件系统映像都被加载到 SDRAM 中运行。因为,在嵌入式系统中 内核映像与根文件系统映像也可以直接在 ROM 或ash这样的固态存储设备中直接运行,但这种做法无疑是以运行速度的牺牲为代价的。从操作系统的角度 看,Boot loader 的总目标就是正确地调用内核来执行。另外,由于 Bootloader 依赖于 CPU 的体系结构,因此大多数Bootloader 都分 为 stage 1 和 stage 2 两大部分。依赖于 CPU 体系结构的代码,比如设各初始化代码等,通常都放在 stage1