Linux 交叉编译环境详细配置


 2011-03-02


 

我用过很久的Ubuntu,不过也是Linux下开发的新手,我在使用Linux做交叉编译环境时候遇到不少麻烦,一顿“google、百度发现有用的文章没几个,都是互相抄,还抄的显得很专业,嗬嗬,所以想这里写些经验体会,加以分享!:-)


不多说,直奔正题!


 

关于嵌入式LINUX开发环境主要有以下几个方案:

1、直接安装 LINUX 操作系统;

2、在 WINDOWS 下安装虚拟机后,再在虚拟机中安装LINXUX操作系统;

3、两台电脑,一台 Linux 服务器,一台 Windows 客户端。

三种方案各有各的好处, 第三种方案,这种方式适合多人同时开发。可是需要以下设备:

       1 Linux 服务器

服务器,用来交叉编译 bootlaoder、内核以及应用程序等,

       1 Windows 机器

机器,SSH远程登陆至 Linux 服务器进行操作。

考虑到开发人员并不是那么多,也为了节省一台服务器,我们选择第一种方案:直接安装 LINUX 操作系统。

 

一、安装Ubuntu 10.10 

至于以前使用Windows XP的选手,突然让我们换装Linux系统构成双系统,会有许多麻烦,因为Linux文件系统为EXT2EXT3等文件系统,如果我们直接安装Linux,将使Linux系统文件与原Windows XP系统文件隔离,访问起来麻烦。而且Linux的安装很容易破坏原XP的启动,为此,我们选择Ubuntu的简单安装方式,在Windows环境下,像安装软件一样使用WUBI安装Ubuntu 10.10,简单方便,至于具体安装步骤,网上有的是,不多罗嗦,也不是本文的重点`````至此Ubuntu 10.10算是安装结束。


 

二、Ubuntu 10.10的基本设置

为了接下来的配置方便,这里先对Ubuntu进行一些简单的配置。

        1、右键增加以管理员身份打开

            在终端输入sudo apt-get install nautilus-gksu,然后回车就可以了。

        2、修改root账户的密码。

           在终端键入sudo passwd root” ,然后两次输入密码,即可。

           以后在终端需要转换root账户的时候,只需键入su root,输入密码。

           请牢记密码哈,当然如果实在忘了,可以通过$sudo passwd root 进行更改。


 

三、Ubuntu 10.10下的NFS服务器配置

1、安装Ubuntu NFS
   Ubuntu
上默认是没有安装Ubuntu NFS 服务器的,因此我们首先安装Ubuntu NFS服务器端:

      NFS(Network File System, 网络文件系统)可以通过网络将分享不同主机(不同的OS)的目录——可以通过NFS挂载远程主机的目录,访问该目录就像访问本地目录一样!因此,我们交叉编译以后,可以让开发板共享Ubuntu下编译好的文件目录,来运行程序。

      (一般而言,使用nfs能够方便地使各unix-like系统之间实现共享.但如果需要在unix-likewindows系统之间共享,就得使用samba!

       NFS运行在SUNRPC(Remote Procedure Call, 远程过程调用)基础上, RPC定义了一种与系统无关的方法来实现进程间通信.由此, NFS server也可以看作是RPC server.

      正因为NFS是一个RPC服务程序,所以在使用它之前,先要映射好端口——通过portmap设定.比如:某个NFS client发起NFS服务请求时,它需要先得到一个端口(port).所以它先通过portmap得到port number. (不仅NFS,所有的RPC服务程序启动之前,都需要设定好portmap,不过一般情况下,使用默认的即可)

 

       $ sudo apt-get install nfs-kernel-server
在一些文档中,提出还需要使用apt-get来手动安装NFS的客户端nfs-common,以及端口映射器portmap,但其实这是没有必要的,因为在安装nfs-kernel-server时,apt会自动为我们把它们安装好。Nfs-commonnfs-kernel-server都依赖于portmap

 

2、配置portmap

 

方法1:编辑/etc/default/portmap, -i 127.0.0.1去掉.

方法2: sudo dpkg-reconfigure portmap ,Should portmap be bound to the loopback address?N.

配置/etc/hosts.deny

(禁止任何host(主机)能和你的NFS服务器进行NFS连接),加入:

### NFS DAEMONS

portmap:ALL

lockd:ALL

mountd:ALL

rquotad:ALL

statd:ALL

配置/etc/hosts.allow

允许那些你想要的主机和你的NFS服务器建立连接。下列步骤将允许任何IP地址以192.168.1开头的主机(连接到NFS服务器上),也可以指定特定的IP地址。参看man hosts_access(5), hosts_options(5)。加入:

### NFS DAEMONS

portmap: 192.168.1.

lockd: 192.168.1.

rquotad: 192.168.1.

mountd: 192.168.1.

statd: 192.168.1.

/etc/hosts.deny /etc/hosts.allow 设置对portmap的访问.采用这两个配置文件有点类似"mask"的意思.现在/etc/hosts.deny中禁止所有用户对portmap的访问.再在/etc/hosts.allow中允许某些用户对portmap的访问.

运行 sudo /etc/init.d/portmap restart重启portmap daemon.

 

3、配置/etc/exports
Ubuntu NFS
允许挂载的目录及权限在文件/etc/exports中进行了定义。
例如,我们要将根目录下的/home/sun/mc9260目录共享出来,那么我们需要在/etc目录下找到exports文件,这时候就看出我们对Ubuntu的配置起作用了,单击鼠标右键,以管理员身份打开此文件,在文件的末尾添加如下一行:

/home/sun/mc9260 *(rw,sync,no_root_squash)


其中:/home/sun/mc9260是要共享的目录,*代表允许所有的网络段访问(此处十分关键,如果不是*的话,后面自己验证自己的共享目录是否可以加载的时候会出问题,后面会再提到,标记此处为:rw是可读写权限,sync是资料同步写入内存和硬盘,no_root_squashUbuntu NFS客户端分享目录使用者的权限,如果客户端使用的是root用户,那么对于该共享目录而言,该客户端就具有root权限。

其它Ubuntu NFS常用的参数有:
ro
只读访问
rw
读写访问sync所有数据在请求时写入共享
async nfs
在写入数据前可以响应请求
secure nfs
通过1024以下的安全TCP/IP端口发送
insecure nfs
通过1024以上的端口发送
wdelay
如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay
如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置。
hide
nfs共享目录中不共享其子目录
no_hide
共享nfs目录的子目录
subtree_check
如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check
和上面相对,不检查父目录权限
all_squash
共享文件的UIDGID映射匿名用户anonymous,适合公用目录。
no_all_squash
保留共享文件的UIDGID(默认)
root_squash root
用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root
用户具有根目录的完全管理访问权限
anonuid=xxx
指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx
指定nfs服务器/etc/passwd文件中匿名用户的GID

4Ubuntu NFS重启服务
$sudo /etc/init.d/portmap restart
$sudo /etc/init.d/nfs-kernel-server restart

5、测试Ubuntu NFS
此时可以运行以下命令来显示一下共享出来的目录:
$showmount -e
或者可以使用以下命令把它挂载在本地磁盘上,例如将/home/sun/mc9260挂载到/mnt下:
$mount -t nfs localhost:/home/sun/mc9260  /mnt
可以运行df命令查看是否挂载成功。查看后可以使用以下命令卸载:
          $ sudo umount /mnt   (
注意不要随便运行此句)

由于我在home/sun/mc9260 目录下建立了hello文件夹,所以$ls /mnt会有以下结果:



 
 


 

四、Ubuntu10.10下的超级终端

windows下大家都使用过超级终端,可以通过超级终端与开发板进行交互。由于这次我使用的开发板为ATMELMC9620处理器,不支持显示屏来进行交互,所以这里我们使用超级终端,那么在Linux下的超级终端都有哪些呢?最著名的莫属MiniCom了,不过我觉得使用起来不是很方便,我采用的是GTKTerm,关于GTKTerm的安装比较简单:

$sudo apt-get install gtkterm

$ gtkterm          //回车后就会弹出一个对话柜 :
一般情况下不用设置就可以使用,但是有时候不能用的情况下你要对configuration(配置)进行设置,点击configuration:对相应的产数进行设置,OK保存就行了,不用了直接退出。

 

 

以下进入开发板的Linux系统,即可看出串口连接已经完成

 

至于不喜欢GTKTerm的可以选择Minicom,安装过程是我择优转载的:

 

一般linux系统都自带了此工具,如果你的linux系统没有安装(判断是否安装参见步骤2)

一、安装

将下载的文件解压到任意目录,例如:/minicom

进入/minicom,执行./configure

执行命令make

执行命令make install

上述过程参见解压后的README

 

debianUbuntu下直接终端运行apt-get install minicom即可

 

二、配置(需要root用户角色)

      执行minicom –s后出现配置界面

       ==========================

[configuration]

Filename and paths

File transfer and protocols

Serial port setup

Modem and dialing

Screen and keyboard

Save setup as df1

Save setup as……

Exit

Exit from minicom

     ==========================

使用向下键选择serial port setup(串口设置),按回车出现设置界面

==========================

A — Serial Device:/dev/ttyS0              //这里很关键

B — lockfile Location : /var/lock

C — Calling Program :

D — Callout Program:

E —  Bps/par/Bits:9600 8N1

F —  Hardware Flow Control : YES

     G —  Software Flow Control : NO

Change with setting?

===========================

A,设置串口设备为/dev/ttyS0Windows下的COM1

E:设置为9600

按回车,保存设定,回到主菜单,可以选择Save setup as df1(设为默认配置)。

设置完成后选择Exit退出

三、直接输入minicom,就可以像使用Windows的超级终端一样操作了。

补充:

运行dmesg |grep ttyS察看系统上面的serial ports,一般情况下都是ttyS0
退出程序,先按CTRL-A,然后按Q

  


 

五、开发板与Ubuntu10.10共享NFS目录

Ubuntu端配置:

在上文中已经提到过我的共享目录为/home/sun/mc9260,在每次开发板需要与PCUbuntu

共享文件的时候,Ubuntu都需要先挂载共享目录,具体指令如下:

 

 

 

从截图大家可以看出来,mount指令是需要root权限的,至于root的密码设置,在文章的最开始已经介绍过了,ls /mnt指令可以看出已经将/home/sun/mc9260共享目录下的文件夹hello挂载到/mnt下。

PS: mount 命令简介 总是敲击这命令总该明白咋回事吧:-)

    mount [-t vfstype] [-o options] device dir

  其中:

  1.-t vfstype指定文件系统的类型,通常不必指定。mount会自动选择正确的类型。常用类型有:

  光盘或光盘镜像iso9660

  DOS fat16文件系统:msdos

  Windows 9x fat32文件系统:vfat

  Windows NT ntfs文件系统:ntfs

  Mount Windows文件网络共享:smbfs

  UNIX(LINUX)文件网络共享:nfs

    2.-o options主要用来描述设备或档案的挂接方式。常用的参数有:

  loop:用来把一个文件当成硬盘分区挂接上系统

  ro:采用只读方式挂接设备

  rw:采用读写方式挂接设备

  iocharset:指定访问文件系统所用字符集

  3.device要挂接(mount)的设备。

4.dir设备在系统上的挂接点(mount point)

开发板配置:

启动ARM开发板,应该保证开发板与Ubuntu在同一个网段。我的PCUbuntuIP地址为192.168.1.244

$ ifconfig eth0 192.168.1.100   //可以对开发板IP进行设置。

 

也可以在开发板启动的时候进入U-BOOT选项进行配置,由于针对不同的开发板,配置不同,这里就简单说一下我的开发板,大家具体看说明书进行配置。

 

上电启动板子,在超级终端显示 Hit any key to stop autoboot 时快速敲一下回车键,

进入 u-boot 进行配置(如未配置 uboot 环境变量中的启动脚本,将不出现 Hit any key to

stop autoboot,而自动停在 uboot 命令提示符界面)U-boot命令可以只输入前几个字母,

setenv=set,save=sa 等。

设置物理地址:

setenv ethaddr 00.11.22.33.44.55

设置本地 IP 地址

setenv ipaddr 192.168.1.100

保存设置

save

 

至此,开发板的IP问题解决。

 

下面进行 NFS 连接,

将主机 NFS 共享目录的/ home /sun/mc9260 目录 mount ARM Linux/mnt /nfs

目录下。

$ mount -t nfs -o nolock 192.168.1.244: /home/sun/mc9260  /mnt/nfs

运行后,可以查看ARM开发板中/mnt/nfs目录下的文件:

$ls /mnt/nfs

至此,可以看见ARM开发板已经与Ubuntu主机共享了文件目录,以后可以将需要开发板运行的程序放在此目录中即可。

 


 

六、Ubuntu10.10下的交叉编译器的安装配置

1、解压缩编译器工具包

把交叉编译工具的安装包 arm-2007q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2直接解压缩到根目录下。如果使用的是Ubuntu可以直接右键解压缩,当然也可以使用命令行,在终端进入压缩包所在文件目录,然后执行:

$tar jxvf arm-2007q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/sun

2、建立环境变量

关于在Ubuntu下建立环境变量的方法有很多,网上的介绍也是数不尽。这里我党然是选最简单的办法啦:

找到/etc/profile文件,单击鼠标右键,以管理员身份打开(文章开头的介绍很方便有用的),然后在文件的末尾加上PATH="$PATH:/home/sun/arm-2007q1/bin"

export PATH

如下图:

  

 

 

 

修改结束后保存关闭文件,重启Ubuntu即可。

当然了,这里的修改可以在用vi指令修改:

$ vi ~/.bashrc

在文件最后一行修改为:

export PATH=/home/sun/arm-2007q1/bin/:$PATH

保存退出,执行下面命令。:$ source ~/.bashrc

测试环境变量$ arm-none-linux-gnueabi-gcc -v

arm-none-linux-gnueabi-gcc -v 用来查看 arm-linux-gcc 的版本,输出信息如下说明交叉编 译环境安装成功:

细心的朋友可以发现我使用两种方式修改的不是同一个文件,前者修改/etc/profile文件,后者修改~/.bashrc文件,关于这其中的原因,就是两种修改环境变量的不同方法,也是不同级别的,关于这方面得知识,大家可以自己学习,也不是本文的重点。

 

 

同样我们编辑我们的Makefile文件,如下

 

 

输入make命令: $make

 

 

 

至此,交叉编译结束,由于开发板与Ubuntu共享此文件目录,所以可以通过GTKTerm来给开发板输入执行hello程序的命令来运行程序:

 


 

 

至此,hello程序运行成功!

这种交叉编译环境的配置方法,是我自己试着做的,我觉得算是比较简单的方式,针对不同的ARM芯片开发板的不同、开发系统得不同,使用方式自然有区别,我以前用过可以用开发板的USB直接进行下载运行的,也可以在线仿真的,用过WinCE的朋友们会知道那种方式更简单,可是这次我使用的是ATMEL芯片,就不得不使用这种方法了。以上说明可能不是很清晰,因为我是先前配置的,自己也是怕忘记,好久以后才整理,如果大家有疑问可以与我联系[email protected]或者[email protected],毕竟是自己的第一篇文章,错误之处在所难免,望见谅:-)


2011-03-02


你可能感兴趣的:(嵌入式应用)