找回密码
 注册
关于网站域名变更的通知
查看: 467|回复: 1
打印 上一主题 下一主题

KVM在嵌入式Linux上的移植

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-10-17 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    1 uCLinux及KVM简介+ o  h9 q7 r' G: d% z

    7 [' h& B5 U5 P4 J: KuCLinux是一款优秀的嵌入式Linux操作系统,是micro-Conrol-Linux的缩写,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit) 的嵌入式系统而设计的,它已经被成功地移植到了很多平台上。它秉承了标准Linux的优良特性,经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,却仍然保留了Linux的大多数优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的API。它专为嵌入式系统做了许多小型化的工作,目前已支持多款CPU。其编译后的目标文件可控制在几百KB数量级,并已被成功地移植到很多平台上。* l  K. v0 N& V' a7 z

    2 X- m7 @; d: P: f2 CKVM是一种专门为嵌入式设备使用的JAVA虚拟机,它主要为J2ME CLDC使用。KVM可以理解为K Virtual Machine或者是 KJava Virtual Machine。是一种精简,可移植的,专门为小设备,有内存,CPU等资源限制(例如:手机,PDA,POS机等嵌入式设备)设计的JAVA虚拟机。
    3 W, S( p. G& J+ D% p4 u# ^; E% U6 A  w! c
    KVM的目的是创造一个尽可能小的且尽可能完整的JAVA虚拟机,使开发者不用像开发C语言一样关心硬件,而通过JAVA语言来进行开发,达到一次编译,各种平台使用的目的。
    8 u1 c  N8 c2 d/ v' z0 f" k! r' u+ y  Z- z5 }2 F8 m
      2 获取并安装交叉开发工具- V3 O2 j/ `5 W# C0 v

    % \+ b) W9 H3 `! w从http://sourceforge.net/project/showfiles.php?group_id=58162&package_id=54041获取ARM-elf-tools交叉编译安装包。这里笔者曾经使用arm-elf-tools-20030314.sh编译KVM,但遇到编译错误。所以建议各位读者下载arm-elf-gcc3.0以上的版本进行编译。, m" F' E0 R* g9 ~+ }
    8 |$ m7 P+ J  I0 Q$ i4 W
      3. 获取KVM源代码
    9 ]1 Z/ _6 E* [  M9 x$ j: T: P2 |& f0 \3 `
    从http://www.sun.com/software/communitysource/j2me/cldc/download.xml获取KVM的源代码文件。
    % o# W, {' L! V' d$ I. ^+ t3 j: ~' c  v" }. N: H
      4. 修改KVM的Makefile; E3 s% E7 Z! H+ K

    9 _( m2 E  x' f/ N下载并且解压CLDC后,下面讲述KVM具体的移植过程:/ G" z7 `! R6 P9 u0 ?/ h; e

    : L0 \" t8 y" `) D1 L+ i7 t( S修改j2me_cldc/kvm/VmUnix/build/Makefile文件6 E2 v- p& G/ Q) t4 q+ _6 ~
    该Makefile是编译KVM所用到的,因为KVM是用C语言实现的,所以从理论上来讲,也只要使用针对不同体系结构CPU的编译器编译KVM即可,这样也就是如何实现交叉编译KVM的问题了。' W: j, y) ?9 k* R& w

    . i4 B1 \" r1 [; t修改Makefile文件需要熟悉makefile的语法规则,这里不对该语言规则详细讲述,只对修改Makefile过程中涉及的内容做解释,请读者参阅关于makefile语法规则方面的相关资料。所涉及的Makefile修改部分如下:$ [. Q, n; @5 g
    ifeq ($(PLATFORM), linux)' V$ n) J' P3 x. u0 p3 f
    # 注释掉原有LIBS = -lm -lnsl( r$ V& A( M( t6 T3 P4 Q% X
    # LIBS = -lm –lnsl% q1 Z. V* L8 ?
    # 添加如下一行
    4 `7 `0 e  B8 w! `6 B( Y7 HLIBS =9 f5 c- V, ^. i5 c" n
    # 注释掉原有CPPFLAGS = -DUNIX -DLINUX -D$(ARCH)& \+ y& G( Q: a$ M, Z) a) ~
    # CPPFLAGS = -DUNIX -DLINUX -D$(ARCH)
    # _) N# I9 F4 F8 A8 h: W: j# 修改CPPFLAGS 定义如下:
    , `$ ~, l. O2 l( ICPPFLAGS = -D$(ARCH)8 J: U  O0 V7 d
    -I$(TOP)/kvm/VmCommon/h -I$(TOP)/kvm/VmUnix/h* r9 h, Y# Y8 U7 s
    -I$(TOP)/kvm/VmExtra/h -I$(TOP)/jam/h -I$(TOP)/kvm/VmCommon/src
    " e) R2 x  n8 ^* J4 Mendif0 a, W' [! c  I. F
    BUILD_ROOT=/usr/local
    2 l9 J7 J  C' U. v0 F/ xlib1=${BUILD_ROOT}/lib/gcc-lib/arm-elf/3.0
    # J- R  M9 d/ u8 J( I" slib=${BUILD_ROOT}/arm-elf/lib
    5 a4 S, Y7 Y  U4 j* binclude=${BUILD_ROOT}/arm-elf/include/
    / S# L* v) R" u2 F# 用arm-elf-gcc定义CC,并指明包括的头文件路径和编译选项
    ) I  @4 G! o2 K0 HCC=arm-elf-gcc -I$(include) -D__uClinux__ -D__USE_BSD=1
    * t1 Y0 r- Z  g  d+ Q# 用arm-elf-ld定义LD,连接目标文件时使用% b. ?/ e6 W; ^9 z. R5 N  \7 I1 V
    LD=arm-elf-ld# ?' e, L" S/ F( p& c
    WEC_LDFLAGS=-L./ -L${lib} -L${lib}/lib -L${lib}/libc -L${lib1} -T${lib}/elf2flt.ld
    3 A2 I. B* W& [! u0 Q: aEXTLIBS= -lc -lgcc -lc5 r9 G9 W0 z% M: O3 K$ n( n) \
    LDFLAGS =7 M( c4 e+ q/ p; f
    ifeq ($(GCC), true)+ J( E! Q  b' p
    ; m9 T9 _) `4 ]* \2 |! k0 b' [
      # 注释掉CC = gcc, 事实上由于ifeq ($(GCC), true) 不成立,该处不会执行到。- e- b( _& D; n# p6 Q  [
    # CC = gcc
    4 J8 y9 L1 a4 p1 P: r0 m. C7 ^( DCFLAGS = -Wall $(CPPFLAGS) $(ROMFLAGS) $(OTHER_FLAGS)
      ?, P5 ^) H4 e9 H. W7 yDEBUG_FLAG = -g
      q4 l# |' A5 g, [3 R0 DOPTIMIZE_FLAG = -O2
      ?0 g  y, n/ l" A) G* V5 pelse; Y/ B' R8 c* b5 A9 i
    # 注释掉CC = cc 一行,这样,系统采用CC=arm-elf-gcc 编译KVM
    ; H8 T/ v& H. e! ~1 z$ V# CC = cc
    ! @% {7 H; t. W7 ~& Q! U: kCFLAGS = -Xa $(CPPFLAGS) $(ROMFLAGS) $(OTHER_FLAGS)8 y% U1 x  s, b; V3 m
    DEBUG_FLAG = -g -xsb) i; Z' r7 z; t4 P6 Q' M4 Z9 Z
    OPTIMIZE_FLAG = -xO2
    ) I! z* f8 b, l& F8 t) D0 Z9 {endif, x7 V) z& O6 P! q: Q
    DEBUG_FLAG += -DINCLUDEDEBUGCODE=1
    3 O; M; l8 c" P7 ~$ Z& {' D+ }7 Q$ [) f$(TOP)/tools/jcc/ROMjavaUnix.c $(TOP)/tools/jcc/nativeFunctionTableUnix.c: jcc6 |8 }1 X# [  C/ x/ V. C5 Y
    Unix
    0 T: Q# X& A0 B1 y) }6 b.PHONY: jccUnix
    7 ~6 {" B( E. E% PjccUnix:. u! v9 z8 T) o
    @(cd $(TOP)/tools/jcc; $(MAKE) unix)
    5 j# C$ t# h, {kvm$(j)$(g): obj$j$g/ $(CLEANUPXPM) $(OBJFILES)
    : l5 R( V) Y/ E( ~@Echo "Linking ... $@"5 d, R" O9 ?" F) I
    # 注释掉@$(CC) $(OBJFILES) -o $@ $(LIBS) $(EXTLIBS) 一行& K' m0 G) w* Y0 F. m
    # @$(CC) $(OBJFILES) -o $@ $(LIBS) $(EXTLIBS)7 ^$ }7 E* X. S5 f7 }8 E
    # 用arm-elf-ld连接目标文件
    : {" R8 u) V! c5 J$(LD) -o kvm.x $(WEC_LDFLAGS) -r -d $(OBJFILES) $(LIBS) $(EXTLIBS) -Map kvm.map
    ( N5 {, n4 G0 a& h# }8 U, x" C$ z7 L
      k( g5 v' |7 j  o, X: _4 X; P  5. 编译uCLinux版本的KVM! M* I& m3 p; ]* r; d* Y" d+ l: |

    . J% |0 Z" K& v2 y! C修改Makefile后,切换到j2me_cldc/build/linux目录,执行make命令编译kvm。如果不能通过编译,建议用arm-elf-gcc3.0以上版本的交叉编译工具进行编译。编译完成后,将在j2me_cldc/kvm/VmUnix/build目录下生成kvm.x文件,因为uClinux操作系统上可执行文件都必须为Flat格式,需用elf2flt工具对kvm.x进行转换。在终端提示符下执行如下命令:. V; o0 j6 c  L9 |
    elf2lft –o kvm kvm.x4 _/ N. _: E" f! \. X* z3 A: e8 z
    生成kvm可执行文件,至此,整个kvm编译过程完成。
    9 Y9 L, a8 _% ]" v6 H- \* [1 l: ?7 i( i' z; e
      6. 测试KVM
    ' @* S" N. p5 E$ G4 m- l0 t! e4 n. w
    这样编译出来的kvm是针对ARM体系结构的,所以在Red Hat Linux 7.3系统上无法运行,读者可以编辑“Hello World”程序。然后在终端提示符下做如下测试:
    & v. ?; j: s* [% ^2 _
    1 h% g. y) c# k  ?) j./kvm –classpath j2me_cldc/samples/classes HelloWorld4 g- @/ A/ a8 \9 i
    程序报错,这说明当前编译出来的KVM不是针对X86体系结构。接下来下载kvm到运行uClinux操作系统的嵌入式设备上,再测试kvm。6 ^$ D& B2 V6 H( w( u
    ( V8 C) X* Q6 j" w% |
    拷贝kvm以及HelloWorld.class到 uClinux-dist/romfs/bin目录下执行make image,生成包含kvm及HelloWorld.class的romfs.img& G& f; o( h9 b- F
    下载image.ram和romfs.img到板子上uClinux系统启动后,输入如下命令测试
    # u2 J, b" J* F: r0 r! _./kvm –classpath /bin HelloWorld
    6 {+ B% }7 B$ w
    0 f; J: ^2 X6 w; l2 ^* [  7. 小结
    + T: L8 X* ~  K* P, f$ g- _$ ^8 R' P1 Q1 ?
    本文以uCLinux嵌入式操作系统为例讨论了KVM的移植过程,若读者希望在其他体系结构的嵌入式Linux(比如PPC Linux, MIPS Linux)系统上移植KVM,可以根据其编译环境修改KVM的Makefile进行编译。如果为让系统支持更多的功能,如MIDP等,则需要作进一步的研究与探索。

    ! O8 p8 o7 }- k7 O& {9 n
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 02:09 , Processed in 0.140625 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表