从零开始搭建嵌入式Linux平台(一)

2019-07-12 18:05发布

        由于教学需要,最近弄了块基于Intel XScale PXA255芯片的开发板,从无到有地搭建了一个Linux平台,总的来说还算顺利,现在把经过写下来,希望能给需要的朋友做个参考。         首先是连接硬件平台。由于板上没有系统,一切都要从零开始,所以需要通过JTAG (1) 接口将BootLoader下载到开发板上,然后利用串口使用PC机作为终端设备,因为很多开发板上都没有键盘接口,而且别忘记了,现在是裸机。注意的是JTAG接口不要装反了,而且一般开发板上都有两到三个串口,但通常只有一个是多功能串口,只有这个才能用于系统下载,通常是离电源较远的那个(至少我看过三种开发板都是如此,也不知道是不是惯例)。另外还要接上网线,直连PC或者是通过交换机连都可以。一切就绪后,打开电源吧。         首先是烧写Bootloader。通常PC机上常见的BIOS不会用在嵌入式系统中,诸如初始化CPU/ SDRAM/ FLASH/ UART/ GPIO 等硬件,引导系统,管理Flash等功能都是通过Bootloader实现的。使用JFlash程序将Bootloader写入开发板:JFlash x-boot255。一般JFlash程序和Bootloader会随开发板一起提供,若没有或不合用的话需要自己编译。我在编译的时候发现一个问题,不知道是不是Ubuntu的原因,在/usr/include/asm-i386/io.h中的#include 要改成 #include 。另外,由于Bootloader是运行在目标平台上,所以要使用目标平台的编译系统进行交叉编译,对于跑armlinuxARM9/XSCALE等ARM系列而言,通常是使用arm-linux-gcc。
        由于很多开发板上没有PS2接口,而且嵌入式系统中通常也没有BIOS,所以只能使用PC机利用远程终端进入操作,在Windows平台下是智能终端,在Linux下就是minicom了。不幸,我的Ubuntu Desktop系统中没带minicom...没关系,在控制台中用sudo apt-get install minicom命令下吧。装好以后,在控制台中sudo minicom进入程序界面,Ctrl+A,再按Z,选O进行设置。在Serial Port Setup中按A设置PC端的串口,若是COM1,就输入/dev/ttyS0 ,注意S大写;若是COM2,就是/dev/ttyS1。然后按E,将bps改为115200,再按F将硬件流控制设为No。回车退回上层菜单,选择Modem And Dialing,将Init string和Reset string全部清空,回车退回上层菜单,选择Save setup as df1,保存后重新启动minicom,然后重新启动开发板,当看到Autoboot in progress, press any key to stop” 3秒内按下任意键,将进入bootloader 命令模式 。         现在开发板上还没有操作系统,自然也就无法分配IP地址,这时可以使用bootp (2) 协议来自动分配。Ubuntu默认并不支持bootp,可以从http://packages.ubuntu.com/warty/net/bootp下载安装包,完成后就可以使用tftp (3) 下载kernel和File system,不幸,Ubuntu又没有tftp(Ubuntu Desktop 真不适合用来进行>开发啊)...下载tftpd:sudo apt-get install tftpd-hpa tftp-hpa xinetd,然后进行配置:
sudo mkdir /tftpboot                      
sudo chmod 777 /tftpboot               
sudo vim /etc/default/tftpd-hpa

###tftpd-hpa Start                        
#Defaults for tftpd-hpa                
RUN_DAEMON="yes"                            
OPTIONS="-l -s /tftpboot"             
###tftpd-hpa End                            

sudo vim /etc/xinetd.d/tftp        

###tftp Start                                 
service tftp                                    
{                                                         
socket_type = dgram                     
protocol = udp                                
wait = yes                                        
user = tftp                                     
server = /usr/sbin/in.tftpd      
server_args = -l /tftpboot       
#only_from = client.test.net     
}                                                     
 
###tftp End                                

sudo /etc/init.d/xinetd restart
sudo /etc/init.d/tftp-hpa restart


        配置好后,将kernel和File System文件复制到/tftpboot中。这两个文件通常也会随开发板光盘一起提供,如果没有,则需要自己使用内核源文件和arm linux 补丁进行编译。由于是在目标机上执行,所以同样要进行交叉编译。然后在minicom中的bootloader命令行模式下:
tftp zImage kernel
flash kernel
tftp rootfs.img root
flash root
成功后使用boot命令,就可以进入系统了。


( 1 ) JTAG         70年代中期测试板子是使用bed-of-nails"技巧直接接触PCBs(print circuit boards)的方式(现在也在使用叫zig的测试设备)。但是随着板子各端子之间的距离缩小, 测试越发困难, 最终随着多层板子的出现上述测试方法彻底失败, 经常在测试过程中损坏硬件或引起高额成本费用等问题。为解决这些问题, 在80年代中期组成了Joint European Test Access Group组织, 发展了“a serial shift register around the boundary of the device的概念。          JTAG提供的功能可以激活设备所有的外围管脚并读取它们的值,与CPU状态无关。
  • 截取所有外部连接信息 (connecting each pin one-on-one to outside)
  • 每一个cell通过串行移位寄存器连接(边界扫描寄存器)
  • 全部的接口由5个管脚控制(TDI, TMS, TCK, nTRST, TDO)
  • 测试器件的线路和电气连接。
  • 测试设备间的连接。
  • Flash烧写。
( 2 ) BOOTP
        BOOTP服务的全称是BOOTSTRAP PROTOCOL,是一种比较早出现的远程启动的协议,我们经常用到的DHCP服务就是从BOOTP服务扩展而来的。BOOTP协议用 TCP/IP 网络协议中的UDP 67/68两个通讯端口。 BOOTP主要是用于无磁盘的客户机从服务器得到自己的IP地址、服务器的IP地址、启动映象文件名、网关IP等等。

( 3 )TFTP
        TFTP服务的全称是Trivial File Transfer Protocol,可以翻译为“简单文件传输协议”。 FTP大家很熟习了,TFTP可以看成一个简化了的FTP,主要的区别是没有用户权限管理的功能,也就是说TFTP不需要认证客户端的权限,这样远程启动 的客户机在启动一个完整的操作系统之前就可以通过TFTP下载启动映象文件,而不需要证明自己是合法的用户。这样TFTP服务也就存在着比较大的安全隐 患,现在黑客和网络病毒也经常用TFTP服务来传输文件。所以TFTP在安装时一定要设立一个单独的目录作为TFTP服务的根目录,比如c:/ tftpboot,做为下载启动映象文件的目录,这样除了这个目录以外TFTP服务就不能访问。并且可以设置TFTP服务只能下载,不能上传等等,以减少安全隐患。