admin 管理员组

文章数量: 1086019


2024年3月18日发(作者:animate用法)

技术应用

TECHNOLOGY

AND

MARKET

V

28,No.

2,2720

Linux

应用程序移植到

VxWor/s

的方法研究

侯波

黄众

覃事东

中车株洲电力机车有限公司

湖南

株洲

612602

介绍了

linux

应用程序移植到

VxWor/s

操作系统的方法。并通过具体的

SFTP

客户端移植,说明了此方法可行

关键词

VxWor/s

SFTP

程序移植

ResearcC

on

Applicction

mipretion

from

Linux

ta

VxWorkp

HOU

Bo

,

HUANG

Zhong

,

QIN

SSidong

(CRRC

Zhiizh

Locomotive

Co.

.Lth.

.Zhiizhon

412002,Chma

)

Abstroci

:

This

ar/me

intropuccs

thc

method

oO

porting

Linux

anpUca/ods

to

thc

VxWor/s

operating

system

And

thc

miaration

oO

syeciVc

SFTP

clieni

shows

that

this

method

is

feasidle.

Key

worOt

:

VxWor/s

SFTP

Program

miara/od

dol

:

12.

3060/j.

imn.

1906

-

8554.0021.02.

037

0

引言

程序移植是很早就被提岀的概念

,

其目的是将程序转移到

不同的环境下运行

采用程序移植的方法

可以极大降低开发

成本和周期

对平台的差异性分析是进行跨平台移植的前提,

的方法

SFTP

是主流的加密上传文件的方案

随着安全和加

密越来越受到重视

,SFTP

在互联网取代

ftp

成为趋势

1

系统分析

系统对比如表

1

所示。

由于

VxWorks

操作系统和

Linux

操作系统的设计思想和系统架构的差异明显

Linux

中复

然后通过操作系统函数替代

模块再设计技术等方案来实现程

序的跨平台移植。

由于

VxWxks

Linux

构架的巨大差异

导致移植过程中

杂的应用仅通过接口替换移植到

VxWorks

是不可行的。

VxWorks

没有保护模式

1

个线程崩溃

可能会蔓延到整个

操作系统

对代码的健壮性提岀了更高的要求

Linux

一个进程崩溃后

在保护模式下不会对其他进程产生影响

从这点看

Linux

程序移植到

VxWorks

VxWorks

移植到

存在很多困难

对于

VxWorks

Linux

之间的差异以及

VxWorks

程序移植到

Linux,

在国内外已经有很多研究

但将

Linux

程序移植到

VxWorks

的研究比较少

本文将

SFTP

协议

客户端代码移植到

VxWorks

作为实际案例

讲述移植应用程序

Lngux

难度大

1

2

个操作系统的对比

VxWorks

应用场景

实时操作系统

,

表现在强实时性和可靠性

Linux

通用型

OS,

界面版会注重用户的交互体验

內核大小

运行模式

微內核宏內核

实模式

不区分內核空间

用户空间

进程即线程

保护模式

区分用户地址空间和內核地址空间

进程

线程

內核线程

任务管理

內存管理

一般使用方式

实存储

所有任务运行在同一內

虚拟存储

,用户进程运行在虚拟地址空间

MMU

负责将虚拟地址

存空间

不提供任务间的內存保护

转换为物理地址

,用户进程只能访问本进程的內存空间

2

移植基本方案和过程

基本方案是

Linux

应用中的一个进程的主线程变为

makefiU

进行库的编译,

进行

gcc

编译

如果不会写

,

只能看懂

依赖关系

,

用自动化编译也可以

VxWorks

的一个任务

,

其余各个线程也变成一个任务

如有

应用中的数据共享

没有变化

注意移植任务中的变量不能和

3)

进行接口函数替换

可以反向参考文献

1

中的任务

函数替换和其他函数替换

还需要注意

Vx

进程是不存在的

系统中已有的应用变量冲突

过程如下

需要对全局变量

静态变量进行函数初始化;对打开的

IO

进行

关闭

这样任务退岀后才可以重新正常运行

任务函数的差异

很大,其余的

IO

管理

网络通信

任务通信等虽然函数有一点

2

需要选择合适且简单的库进行移植。

库选是否合适直

接关系到需要的功能能否移植成功

2

如果会熟练地使用

VxWorks

makefiU,

则可修改

差别

但是函数功能类似可以替换

102

技术与市场

222I

年第

28

卷第

2

如果没有函数可以替换

fork

函数,进程复刻函数

同时

复刻了全局和静态变量

Vx

不区分进程和线程

实现没法复

刻所有相关线程和变量

难度很大

,只能删掉这部分功能或者

进行模块重写

4)

根据需求

对库的代码进行改写

5)

对程序进行黑盒测试

稳定性测试,如果有问题,

根据错误

提示和错误表现

,

2

对弋码进行跟踪调试

,找到问题,并修改代码

3

SFTP

功能移植到

VxWorte

ftp

协议相比,

SFTP

在客户端与服务器间提供了一种

更为安全的文件传输方式

这个安全数据通道由

SSH

连接提

SSH

连接隧道作为安全数据通道

登录时采用非对称

加密

,

交互时采用对称加密

需要实现文件自动上传的功能

2

需要一个合适的库移植

Linnx

最常用的是

openssh,

个库依赖于

opense

zhb

两个库,

opense

的源码就有

20

M

o

还有个常用

putty

开源库

其不需要依赖

且源码有

5

M,

telnet

的功能,

ssU

服务端功能

又可以减少代码

从工作量

角度可选

0.72

版本的

putty

2

)

Linnx

中安装

putty

,

运行

configure

生成

makefbe

可以看到有

2

sftp

客户端实现,分别是

psftp

psep

选取

psftp

进行移植

psftp_SOURCES

的全部文件拷贝到

Wind

River

Workbencli

3.

3

的新建项目中

根据

unin.

h

头文件和

VxWorks

增加全局定义

-

DNO_

IPV6

-

DNOT_X_WINDOWS

-

DNO_GSSAPI

-

HAVE_NO_

SYS_SELECT_H

,

3

个是功能的去除

后面是没有专用的

select.

h

头文件

3)

函数接口替换

搜索

pthread.

h,

没有找到线程函数

搜索

unistd.

h,

找到有

fork

函数的使用

fork

函数岀现在

ux-

Pruy.

c

这块功能是

sftp

的代理功能

即从

A

设备登录到

B,

再从

B

登录到

C,B

需要代码

在一般情况下,嵌入式系统不

需要实现中转功能

所以把代理功能也去掉

使用

nocprcy.

c

用空函数代替原函数实现

其余函数的替换,人工查找很慢

直接

build

等报错,

然后

逐个函数进行替换

缺少的头文件如

gdb.

h

sys/fbe.

h

termics.

h

pwd.

h

netdb.

h

分别进行源码分析

glob.

h

sys/fUe.h

用户文件查找

可以注释掉

,不用文件查找功

能,用指定固定名字的文件上传

;〈

termics.

h

pwd

.

h

串口和

用户名密码也没有用

需要

tep

文件传输功能

不需打印内容

和密码管理,

也能注释掉相关内容

然后将有错误提示的代码

修改

例如网络函数阻塞的设置

超时的设置

(VxWorks

不支持

超时设置)

IO

函数中

open

mkdir

参数个数不同

全局变量

、静态局部变量和

IO

的使用检查。

SFTP

的基本

流程:

tep

登录

打开一个文件进行上传

psftp

中的全局变量

和静态局部变量查找

例如

psftp.

c

中的

static

Backend

*

back

stativ

unsignen

chac

*

pending

=

NULL

static

unsignen

pendlen

=

2,

pendsize

2

增加到初始化代码

bacC

=

NULL

pendlen

=2

socket

的连接描述符

文件描述符

进行代码查

发现

feket

的描述符是全局变量

文件描述符不是全局变

技术应用

因为代码有多处

exit,

线程退岀会无法关闭文件

增加

1

全局文件描述符

,并在打开文件函数中

等于打开的文件描述

,在异常退岀处增加代码进行文件关闭。

测试发现这些都是

必须的

线程异常退岀后

初值不对

导致线程无法再次运行

因为初值中有

TCP

等待接收的字符个数等关键变量;文件不

关闭,

会打开很多文件描述符

,

导致其他任务无法运行,系统崩

另外,在网络传输中

,因为断网等问题会导致传输中断,

全面考虑各种异常状况的发生

由于这个库有很多全局变量

,

如果不进行大量修改

会导

致这个库在

VxWorks

中只能单任务运行

同时这个库使用了

eb

函数

则不能当做一般函数调用

必须开独立任务调用文

件上传函数

并同时对任务进行监视

,岀错后重启任务。

4)

经过测试

手动输入对应的命令,

SFTP

功能已经正常。

要自动上传

,

还必须对

sftp

库的部分函数改写,原先的客户端

是收命令后

执行

执行完毕再等待命令输入

第一步接收用

户名

密码

命令的地方进行替换和注释

;6c_sftp

函数是个循环

接收命令,

循环执行的函数

要实现自动上传,必须把这个函

数改为单步,

同时增加参数,直接传入命令

且根据执行结果返

回对应的值

同时还要增加文件夹的所有文件自动上传的函数,

且支持

断点续传

断点续传

reput

的使用

需要注意

sftp

ftp

的服务

端有所不同

,

如果

ftp

服务端没有文件

,

则不自动上传文件,

接返回无文件提示;

ftp

服务端收到续传命令

如果没有文件可

以直接创建文件

2

位置开始传输文件

6

稳定性测试

目前程序已经在某地铁公司的列车上稳

定运行

1

年,

没有发现异常问题

车上各个子系统的文件都可

ste

方式发到地面

4

结语

本文先阐述了

Linnx

的一个应用程序移植到

VxWorks

台的基本方法

又以

SFTP

客户端的代码移植举例

对移植前后

的代码进行功能测试和稳定性验证,

结果表示本文的移植方法

可行

参考文献

[

1

]

许志.从

VxWorks

Linnx

的应用移植与优化方法研究

[D].

武汉:华中科技大学

,2012

[

2

]

高鹏飞

李新明,

孙建

.Linux

VxWorks

任务调度机制

分析[

J].

工业控制计算机

,2025,2

(

6

)

32

-32.

[3

]

周浩尚

高照玲

.VxWorks

TRDP

协议栈移植

[J].

电子

技术应用

222,44(1

)

56

-56.

作者简介

侯波

(1985

)

,男

山西高平人

本科

工程师

研究方向

软件测试

黄众

(1989

)

湖南常德人

硕士研究生

工程师

研究

方向:软件测试

覃事东

(

186

)

湖南长沙人

硕士研究生

工程师

研究方向

软件测试

103


本文标签: 文件 移植 进行 函数 进程