分享

虚拟机Linux Redhat 9与目标开发板进行系统编程方面的问题总结1

 kuainiao 2010-11-14
  虚拟机Linux Redhat 9与目标开发板进行系统编程方面的问题总结(转载)

  2008-09-13 15:50

  总结的知识点有:1、VMWare里Linux使用MINICOM实现与开发板的通讯;2、PC机中Linux系统与目标开发板的NFS文件系统的挂接;3、修改文件的使用权限;4、在Linux系统下设置NFS共享;5、tar压缩、解压用法(platinum);6、NFS网络文件系统的设置;7、修改外壳脚本的权限;8、内核的编译和移植(以PXA270为例);9、编写Red hat内核驱动程序前需要注意的;10、调试过程中利用printk跟踪;11、编写Makefile文件需要注意的;12、设备文件和设备文件系统;13、Linux驱动程序的编写细节点;14、嵌入式根文件系统;15、查看/dev目录下的设备的主次设备号的命令

  1、VMWare里Linux使用MINICOM实现与开发板的通讯

  MINICOM是Linux提供的和Windows超级终端一样的工具,一般用做串口与开发板通信,当然有的板子也用USB,这里总结串口的设置:

  一、VMWARE虚拟机添加串口(如果没用虚拟机可以跳过这步)

  如果在VMWARE虚拟机下 一定要记得先确认这步 要不不好使 很多朋友的问题就在这里!

  先关闭虚拟机下的LINUX,然后设置一下虚拟机:在vm-〉settings-〉hardware里添加串口 COM1 COM2都加上吧

  二 设置MINICOM

  进LINUX系统 开个控制台 字符里输入minicom 就启动了

  这时一般还要设置一下

  Ctrl+A进入控制界面(Esc返回)按Z进设置

  一般设置两个

  1 按O(注意:是O不是零)设置第三第四项,分别是串口设置与MODEM设置

  串口设置:不用说了吧 进去都看明白了 敲字母 设置相应项目 比如"115200 8-N-1"

  MODEM设置:也要设置一下 要不有的看不到东西 把上面两个选项都清空 就是按那行前面的字母(好象是'A'和什么)然后光标就跳过去了 删之

  回车 到开始选第三第四项的菜单 选下面的保存(别忘了保存 菜鸟们常犯)

  2 回到刚才按O的界面 看一下P 里面的串口设置对不对

  对就不用改了 不对改之

  提醒一下:LINUX设备的编号是从0开始的 比如串口1也就是COM1在LINUX里的设备号叫ttyS0

  串口设置里面要用到 那里添全部路径也就是"/dev/ttyS0"

  好了 就这么简单

  在这次的连接开发板的实验过程中,主要的问题有:

  1、在试用VMware虚拟机的时候没有给虚拟机添加上串口,所以在Linux虚拟机下的minicom是无法识别到连接到主机的串口上的。解决方法如上所示,在VMware中添加了串口,才可以通过虚拟机访问到串口设备。

  2、在启动的时候没有关闭掉windows中的"超级终端",所以在启动了虚拟机以后显示"com1"不能正常工作,发现该问题后,关闭了Windows中的"超级终端",然后重启了虚拟机。呵呵,从此Linux虚拟机下终于可以顺利的进行串口的连接了。

  最后退出设置菜单就可以使用minicom与开发板通讯了。

  2、PC机中Linux系统与目标开发板的NFS文件系统的挂接

  设置好相对应的IP地址后,一般我设的Linux系统的IP地址是192.168.0.14,网关是192.168.0.255,子网掩码是255.255.255.0

  目标开发板的IP地址操作是:

  mount eth0 192.168.0.5 broadcast 192.168.0.255 netmask 255.255.255.0

  建立好对接后先ping下各自的IP地址看是否都连通了。

  用指令mount -t nfs 192.168.0.14:/home /tmp/nfs进行挂接

  3、修改文件的使用权限

  chmod 777 文件名

  4、在Linux系统下设置NFS共享

  网络文件系统(NFS,Network 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,指定共享目录及权限等。

  执行如下命令编辑文件/etc/exports:

  # vi /etc/exports

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

  /home/work 192.168.0.*(rw,sync,no_root_squash)

  然后保存退出。

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

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

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

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

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

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

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

  # /etc/rc.d/init.d/portmap start

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

虚拟机Linux Redhat 9与目标开发板进行系统编程方面的问题总结1((2)



  # /etc/rc.d/init.d/nfs start

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

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

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

  # mount t nfs 192.168.0.20:/home/work /mnt

  # ls /mnt

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

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

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

  选中networking options-》IP:kernel level auloconfiguralion项

  选中file systems-》network file systems-》下的root file system on nfs

  和nfs file system support重新编译内核下载bootloader和kernel到开发板上

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

  # mkdir /mnt/nfs //建立Linux 服务器输出共享目录的挂载点;

  # mount t nfs 192.168.0.20:/home/work /mnt/nfs o nolock

  # cd /mnt/nfs

  # ls

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

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

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

  host启动nfs:

  snfs

  #!/bin/bash

  ifconfig eth0 192.168.0.20

  /etc/rc.d/init.d/portmap start

  /etc/rc.d/init.d/nfs start

  嵌入式目标机挂载nfs:

  mnfs:

  #!/bin/sh

  mount -t nfs 192.168.0.20:/home/work/nfs /mnt/nfs -o nolock

  echo "nfs ok!"

  总结:

  1、在配置NFS服务器之前用ping命令确保两个linux系统正常连接,如果无法连接关闭图形界面中的防火墙#service iptables stop

  2、在配置中确保输入的命令是正确的

  3、更改完"exports"文件后要输入exportfs rv ,使得"exports"文件生效。

  4、检查nfs服务是否开启,默认是关闭的。

  5、卸载的时候不能在/mnt目录中卸载,必须注销系统后卸载。

  卸载系统中已挂载的NFS共享目录:命令# umount /mnt/

  5、tar压缩、解压用法(platinum)

  解压:x

  压缩:c

  针对gz:z

  针对bz2:j

  用于显示:v

  解压实例

  gz文件:tar xzvf xxx.tar.gz

  bz2文件:tar xjvf xxx.tar.bz2

  压缩实例

  gz文件:tar czvf xxx.tar.gz /path

  bz2文件:tar cjvf xxx.tar.bz2 /path

  6、NFS网络文件系统的设置

  NFS本身不提供信息传输的协议和功能,但它的确能够透过网络实现信息的分享,它是Linux系统中广泛使用的文件系统,可以方便地实现异构网络系统的文件共享、数据交换,以及其他分布式的应用。

  Linux会默认安装NFS文件系统,查看NFS是否安装,可以执行以下命令:

  rpm -qa |grep nfs

  启动NFS服务器主要分为以下两步:

  portmap start

  /etc/rc.d/init.d/nfs start

  NFS服务器的共享配置保存在/etc/exports文件中,如果用户修改了这个文件,可以运行以下的命令行,以便马上生效。

  /etc/rc.d/init.d/nfs restart

  挂接可以使用mount进行,挂接前必须创建好要挂接到的目标目录

  例如:mount -t nfs 192.168.8.188:/install /home/install

  另外如果用户希望开机时自动挂接,也可以用以下方法编辑/etc/fstab文件,在/etc/fstab文件中追加一行:(以IP为192.168.8.188为例)

  192.168.8.188:/install /home/install nfs defaults,auto 0 0

  192.168.8.188:/Downloads /home Downloads nfs ro 0 0

  /etc/fstab文件格式如下:

  fs_spec fs_file fs_type fs_options fs_dump fs_pass

  fs_spec-该字段定义要加载的文件系统所在的设备或远程文件系统,对于NFS文件系统一般配置为:192.168.8.188:/install的格式

  fs_file-本地的挂载目标路径

  fs_type-对于NFS来说文件系统为nfs

  fs_options-挂载的参数,这个参数可以参考mount命令行

  fs_dump-该选项可以设置为0

  fs_pass-该选项可以设置为0

  7、修改外壳脚本的权限

  chmod u+x filename 只用自己可以执行,其他人不能执行

  chmod ug+x filename 只有自己以及同一工作组的人可以执行,其他人不能执行

  chmod +x filename 或者 chmod 777 filename 所有人都可以执行 8、内核的编译和移植(以PXA270为例) 针对目前嵌入式系统中最流行的ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。把它打到我们的Linux内核上,再进行交叉编译就行。

虚拟机Linux Redhat 9与目标开发板进行系统编程方面的问题总结1((3)



  其基本过程是这样的(以Linux2.6.9为例):

  1)、到 ftp://ftp.arm.linux.org.uk 上下载Linux2.6.9 内核及其关于ARM 平台的补丁

  2)、给Linux2.6.9 打补丁

  3)、准备交叉编译环境。交叉编译环境工具链一般包括binutils(含AS 汇编器,LD 链接器等),arm-gcc,glibc 等。交叉编译环境的搭建也是个复杂的过程,后面我将做进一步介绍。

  4)、修改内核目录下的makefile 文件,主要是以下几行:

  注释掉ARCH:=$(shell uname m | sed e s/i.86/i386/-e s/sun4u/sparc64/ -e s/arm.

  \ */arm/ - e s/sa110/arm/)这一行。

  ARCH := 改为 ARCH := arm

  CROSS_COMPILE := 改为 CROSS_COMPILE = 您的交叉编译工具中arm-linux 所在目录/arm-linux-

  例如:CROSS_COMPILE = /opt/crosstool/arm-linux/bin/arm-linux-

  5)此后就可以进行编译。

  6)以上可以使您的目标板上跑起linux 系统,但是您的pxa270 目标板上的一些硬件还没有驱

  动起来,这需要您编写相应的硬件驱动程序。

  修改Linux的内核源码:

  在Linux启动的第一阶段,内核与体系结构相关部分(arch目录下)首先执行,它完成硬件寄存器设置,内存映像等初始化工作。然后把控制权转给内核中与系统结构无关部分。而我们移植工作中要改动的代码主要集中在与体系结构相关部分。

  在arch 目录中我们可以看到有许多子目录,它们往往是用芯片命名的,表示是针对该芯片体系结构的代码。为arm 系列芯片编译内核,就应修改ARM目录下的相关文件。在ARM的子目录下我们可以找到一个boot/bootp目录,在bootp下有一个init.S 的文件,.S表示它是汇编语言文件。这里init.S是用ARM汇编写成的。这个init.S就是引导Linux内核在Arm平台上启动的初始化代码。它里头定义了一个全局符号_start,它定义了默认的起始地址。同时它也是整体内核二进制镜像的起始标志。Init.S主要完成以下功能:(具体的代码可以查阅UP-TECHPXA270A-LINUX实验指导书V5.0)

  1) 定义数据段、代码段、bbs(未初始化数据段)起始地址变量并对bbs段进行初始化。

  2) 设置寄存器以初始化系统硬件。

  3) 关闭中断。

  4) 初始化LCD显示。

  5) 将数据段数据复制到内存。

  6) 跳转到内核起始函数start_kernel继续执行。

  7) 对主寄存器的修改。

  Linux 内核的编译菜单有好几个版本,您运行:

  1)make config:进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍.

  2)make menuconfig:进入我们熟悉的menuconfig 菜单,相信很多人对此都不陌生.

  3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。(本人推荐使用这种)

  编译内核:

  进入目录

  tar xjvf up-linux-2.6.9-release.tar.bz2 -C /up-techpxa270/kernel/

  ln s linux-2.6.9 linux

  cd linux

  make clean

  make dep

  make bzImage(或者make zImage)

  生成的二进制文件为zImage 存储在./arch/arm/boot/zImage。

  把生成的zImage 文件拷贝到PC 机的tftp 服务目录/tftpboot/下,在进行以下操作前请确保已配置好您的PC 机TFTP 服务器。(安装软件tftp32)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多