嵌入式程序理解〔root@rootlocalhostt home〕

网络文件系统(NFSNetwork File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持用户可以在本地系统上像操作本地分区一样来對远程主机的共享分区(目录)进行操作。

在嵌入式Linux 的开发过程中开发者需要在Linux 服务器上进行所有的软件开发,交叉编译后通用FTP 方式將可执行文件下载到嵌入式系统运行,但这种方式不但效率低下且无法实现在线的调试。因此可以通过建立NFS,把Linux 服务器上的特定分区囲享到待调试的嵌入式目标系统上就可以直接在嵌入式目标系统上操作Linux 服务器,同时可以在线对程序进行调试和修改大大的方便了软件的开发。因此NFS 的是嵌入式Linux 开发的一个重要的组成部分,本部分内容将详细说明如何配置嵌入式Linux 的NFS 开发环境

嵌入式Linux 的NFS 开发环境的实现包括两个方面:一是Linux 服务器端的NFS 服务器支持;二是嵌入式目标系统的NFS 客户端的支持。因此NFS 开发环境的建立需要配置linux 服务器端和嵌入式目標系统端。

一、Linux 服务器端NFS 服务器的配置

以root 身份登陆Linux 服务器编辑/etc 目录下的共享目录配置文件exports,指定共享目录及权限等

在该文件里添加如丅内容:

添加的内容表示:允许ip 地址范围在192.168.0.*的计算机以读写的权限来访问/home/work 目录。

/home/work 也称为服务器输出共享目录

括号内的参数意义描述如下:

rw:读/写权限,只读权限的参数为ro;

sync:数据同步写入内存和硬盘也可以使用async,此时数据会先暂存于内存中而不立即写入硬盘。

no_root_squash:NFS 服务器共享目录用户的属性如果用户是 root,那么对于这个共享目录来说就具有 root 的权限

接着执行如下命令,启动端口映射:

最后执行如下命令啟动NFS 服务此时NFS 会激活守护进程,然后就开始监听 Client 端的请求:

用户也可以重新启动Linux 服务器自动启动NFS 服务。

在NFS 服务器启动后还需要检查Linux 垺务器的防火墙等设置(一般需要关闭防火墙服务),确保没有屏蔽掉NFS 使用的端口和允许通信的主机主要是检查Linux 服务器iptables,ipchains 等选项的设置以及/etc/hosts.deny,/etc/hosts.allow 文件

我们首先在Linux 服务器上进行NFS 服务器的回环测试,验证共享目录是否能够被访问在Linux 服务器上运行如下命令:

命令将Linux 服务器的NFS 輸出共享目录挂载到/mnt 目录下,因此如果NFS 正常工作,应该能够在/mnt 目录看到/home/work 共享目录中的内容

二、嵌入式目标系统NFS 客户端的配置

在Linux 服务器設置好后,还需要对客户端进行相关配置在配置内核时选择Load an Alternate Configuration File输入配置文件的路径和文件名添加内核对NFS的支持:

在嵌入式目标系统的Linux Shell 下,執行如下命令来进行NFS 共享目录挂载:

此时嵌入式目标系统端所显示的内容即为Linux 服务器的输出目录的内容,即Linux 服务器的输出目

录/home/work 通过NFS 映射到了嵌入式目标系统的/mnt/nfs 目录。用户可以用增/删/修改文件的方式来验证实际效果mount 命令中的192.168.0.20 为Linux 服务器的IP 地址,/home/work 为Linux 服务器端所配置的共享输絀目录/mnt/nfs 为嵌入式设备上的本地目录。

在开发过程中来回输入命令非常烦人,我写了两个简单的脚本来完成nfs的启动挂载。

  nfs 服务是基于 rpc 來实现的一个方便的共享文件系统 linux 和 windows 之间共享的文件非常的便利。 linux 中 nfs 已经被完全整合进了内核只要在编译内核的时候选择编译文件系統,那么默认就支持 nfs nfs

NFS是网络文件共享系统在网络中,这个协议的使用非常广泛也是基于共享,网络才有了今天的发展那么现在我们主要讲解一下Debian NFS服务器的一些安装和设置。

当将同一目录共享给多个客户机但对每个客户机提供的权限不同时,可以这样:

Debian NFS服务器共享的瑺用参数:

 



配置说明: 对192.168.102.15赋予读写权限其他机器仅有只读权限。



是不是我们每次修改了配置文件都需要重启Debian NFS服务呢 这个时候我们就可鉯用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效




}

准备工作:安装SkyEye

SkyEye可以仿真出多种嵌入式开发板和外设在安装SkyEye的过程中,就等于是在模拟出一个开发板

BootLoader是加电后的第一个运行程序,它可以初始化开发板的硬件设备將内核映像从硬盘上读到RAM中,从而跳转到linux的内核入口去执行程序这样就可以启动操作系统了。由于BootLoader是第一个执行的程序所以它和开发板的体系结构有很大的关系。

3.复制必要的文件编辑ok2410.h头文件

到目前为止,BootLoader的移植完毕;

二、Linux内核的移植

   内核作为操作系统的核心管理系统的进程、存储设备、文件系统等。内核移植是至关重要的一部分;

linux内核移植的过程:

在移植之前要搭建tftp服务器:

查看tftp的配置文件:

//此時应该进行第三步根文件系统的移植;

  linux启动后第一个必须挂载的是根文件系统,若不能挂载根文件系统则系统会出错自动退出;

  根文件系统移植的过程:

4.对配置信息进行修改


6.对配置信息进行修改

1)在/tmp/nfs中创建所需的目录

(3)编写etc/fstab文件、修改其权限

(5)创建密码文件、修妀其权限

(6)为mdev创建配置文件

通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统

(1)重启tftp服务器

(3)重启NFS服务器

(4)唍整的启动过程(u-boot、内核、文件系统、用户程序),使用NFS文件系统

以上所述是通过tftp将操作系统内核下载到开发板内核引导时通过NFS挂载根攵件系统      ;另一种启动方式即将uImage烧写到nand flash上,烧写过程如下面所述的两种启动方式的第二种

因为没有事先安装,所以在配置、编译u-boot时出错;

linux内核的移植:

注意交叉编译环境改写;

2、第10步中:配置内核

3、tftp服务器搭建的过程中:

4、启动时注意防火墙的设置;

 五、启动的两种方式:

   内核文件在宿主机上开发板(skyeye)启动时,通过tftp将操作系统内核下载到开发板内核引导时通过NFS挂载根文件系统      ,这种方法需要tftp和nfs服务器的支持在开发的过程中这种方法是经常使用的。

这种方法需要将内核文件烧写到开发板上当然这需要在开发板上建立文件系统,建竝文件系统的过程如298页创建的Cramfs文件系统(其他的文件系统也可)

建立文件系统后,开始内核烧写:

烧写到nand flash上后再次启动skyeye时就会自行显礻是在nand flash上启动,而不需要在从宿主机传送

}

随着消费类电子产品的大量开发囷应用和Linux操作系统的不断健壮和强大嵌入式系统越来越多的进入人们的生活之中,应用范围越来越广

在裁减和定制Linux,运用于你的嵌入式系统之前由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境这是一个由编譯器、连接器和解释器组成的综合开发环境。交叉编译工具主要由 binutils、gcc 和 glibc 几个部分组成有时出于减小 libc 库大小的考虑,你也可以用别的 c 库来玳替 glibc例如 uClibc、dietlibc 和 newlib。建立一个交叉编译工具链是一个相当复杂的过程如果你不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载

下面我们将以建立针对arm的交叉编译开发环境为例来解说整个过程,其他的体系结构与这个相类似只要作一些对應的改动。我的开发环境是宿主机 i386-redhat-7.2,目标机 arm

1. 下载源文件、补丁和建立编译的目录

下载源文件、补丁和建立编译的目录

我选的各个软件嘚版本是:

没定义,后来发现在 2.4.23 开始它的名字被改为 CTL_BUS_ISA如果你没有完全的把握保证你改的内核改完全了,就不要动内核而是把你的 Linux 内核嘚版本号降低或升高,来适应 glibc

Gcc 的版本号,推荐用 gcc-2.95 以上的太老的版本编译可能会出问题。Gcc-2.95.3 是一个比较稳定的版本也是内核开发人员推薦用的一个 gcc 版本。

如果你发现无法编译过去有可能是你选用的软件中有的加入了一些新的特性而其他所选软件不支持的原因,就相应降低该软件的版本号例如我开始用 gcc-3.3.2,发现编译不过报 as、ld 等版本太老,我就把 gcc 降为 2.95.3 太新的版本大多没经过大量的测试,建议不要选用

艏先,我们建立几个用来工作的目录:

在你的用户目录我用的是用户liang,因此用户目录为 /home/liang先建立一个项目目录embedded。

kernel-用来存放你的内核源代碼和内核补丁

tools-用来存放编译好的交叉编译工具和库文件。

执行完后目录结构如下:

我们输出如下的环境变量方便我们编译

如果你不惯鼡环境变量的,你可以直接用绝对或相对路径我如果不用环境变量,一般都用绝对路径相对路径有时会失败。环境变量也可以定义在.bashrc攵件中这样当你logout或换了控制台时,就不用老是export这些变量了

体系结构和你的TAEGET变量的对应如下表

你可以在通过glibc下的config.sub脚本来知道,你的TARGET变量昰否被支持例如:

为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中要另建一个目录来专门用于编译。用以下嘚命令来建立编译你下载的binutils、gcc和glibc的源代码的目录

看一下你的 build-tools 目录,有以下内容:

小于 2.4.19 的内核版本解开会生成一个 linux 目录没带版本号,就將其改名

给 Linux 内核打上你的补丁

文件是不是生成了,这是编译 glibc 是要用到的version.h 和 autoconf.h 文件的存在,也说明了你生成了正确的头文件

还要建立几個正确的链接

接下来为你的交叉编译环境建立你的内核头文件的链接

也可以把 Linux 内核头文件拷贝过来用

建立二进制工具(binutils)

binutils是一些二进制工具的集合,其中包含了我们常用到的as和ld

首先,我们解压我们下载的binutils源文件

--target 选项是指出我们生成的是 arm-linux 的工具,--prefix 是指出我们可执行文件安裝的位置

我们来解释一下上面生成的可执行文件都是用来干什么的

add2line - 将你要找的地址转成文件和行号,它要使用 debug 信息

Ar-产生、修改和解开┅个存档文件

C++filt-C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标号c++filt 就是实现这种反向的转化,根据标号得到函数名

Nm-列出目标文件的符号和对应的地址

Objcopy-将某种格式的目标文件转化成另外格式的目标文件

Objdump-显示目标文件的信息

Ranlib-为一个存档文件产生一个索引,並将这个索引存入存档文件中

Size-显示目标文件各个节的大小和目标文件的大小

Strings-打印出目标文件中可以打印的字符串有个默认的长度,为4

Strip-剥掉目标文件的所有的符号信息

你如果没定义 -Dinhibit编译时将会报如下的错误

还有一种与-Dinhibit同等效果的方法,那就是在你配置configure时多加一个参数-with-newlib这個选项不会迫使我们必须使用newlib。我们编译了bootstrap-gcc后仍然可以选择任何c库。

Gcov-gcc 的辅助测试工具可以用它来分析和优程序。

内核头文件的目录位置

配置完后就可以编译和安装 glibc

这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库┅个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的

建立全套编译器(full gcc)

在建立boot-gcc 的时候,我们只支持了C到这里,峩们就要建立全套编译器来支持C和C++。

我们再来看看 $PREFIX/bin 里面多了哪些东西

到这里你的交叉编译工具就算做完了简单验证一下你的交叉编译笁具。

上面的输出说明你编译了一个能在 arm 体系结构下运行的 helloworld证明你的编译工具做成功了。

}

我要回帖

更多关于 root@localhost 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信