Untar: Memory problem with big files (800k) in RTEMS filesystem: simple trial!]

Oscar Martinez de la Torre omt at wm.estec.esa.nl
Fri Feb 11 10:16:08 UTC 2000


Hi!

	I'm trying to use Kaffe with RTEMS on ERC32.

	As I need a filesystem with the .class file and Klasses.jar
	I tar them and ld and link with the executable (Kaffe0.exe)
	But I have found several problems because of the 
	untar function and memory.

	Is anyone working with filesystem and big files (1Mb)?
	I'm using linux and RPMs of snapshot 19991203!

	Below, I tell you more details!

Thanks,
								Oscar



	In order to test and isolate the problem, I have taken
	a simple program (test.c I attach it) which works pretty good
	It untars, reads and write a small file (hola)
	So, I haved added several files which I use with Kaffe!

-rwxr-xr-x   1 omt      wms       2601580 Feb 11 10:06 Kaffe0.exe
-rw-r--r--   1 omt      wms        885137 Feb 11 10:05 Klasses.jar
-rwxr-xr-x   1 omt      wms             5 Jan 27 14:54 hola*

	The settings are:

<confdefs.h>
#define CONFIGURE_EXTRA_TASK_STACKS 1000000

( I tried
#define CONFIGURE_EXTRA_TASK_STACKS 4000000
  but 
bspstart: Not enough RAM!!!)

	I have overridden the default values:

/opt/rtems/sparc-rtems/lib/linkcmds
/* Default values, can be overridden */
_PROM_SIZE = 8M;
_RAM_SIZE = 32M;

	I have made 2 trials: First, if I do like this:

venus:~/TEST3$ tar cvf tarfile Kaffe0.exe Klasses.jar hola
venus:~/TEST3$  sparc-rtems-ld -r -o tarfile.o -b binary tarfile
venus:~/TEST3$ /opt/rtems/bin/sparc-rtems-gcc --pipe
-B/opt/rtems//erc32/lib/ -specs bsp_specs -qrtems -g -Wall -ansi -fasm 
-O4       -mcpu=cypress      -c  -I/opt/rtems/sparc-rtems/include/ -o
test.o test.c
venus:~/TEST3$ /opt/rtems/bin/sparc-rtems-gcc --pipe
-B/opt/rtems//erc32/lib/ -specs bsp_specs -qrtems -g -Wall -ansi -fasm 
-O4       -mcpu=cypress   test.o tarfile.o -o test.exe


venus:~/TEST3$ /usr/local/erc32/bin/sis -ram 32000 -rom 8000 test.exe 
 SIS - SPARC instruction simulator 3.0.5,  copyright Jiri Gaisler
1995-1998
 Bug-reports to jgais at ws.estec.esa.nl
serial port A on stdin/stdout
allocated 32768 K RAM memory
allocated 8192 K ROM memory
loading:
section .text at 0x02000000 (106416 bytes)
section .data at 0x02019fb0 (3494112 bytes)
section .bss at 0x0236f090 (22124 bytes)(not loaded)
sis> run
IU in error mode (257)
       16  00000000  00000000  unimp  0


venus:~/TEST3$ /usr/local/erc32/bin/sparc-rtems-gdb
test.exe                      
GNU gdb 4.17.gnat.3.11p
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "--host=i686-pc-linux-gnu
--target=sparc-erc32-elf32"...
(gdb) tar sim -ram 32000 -rom 8000

 SIS - SPARC instruction simulator 3.0.5
 Bug-reports to Jiri Gaisler ESA/ESTEC (jgais at ws.estec.esa.nl)
serial port A on stdin/stdout
allocated 32768 K RAM memory
allocated 8192 K ROM memory
Connected to the simulator.
(gdb) lo
loading:
section .text at 0x02000000 (106416 bytes)
section .data at 0x02019fb0 (3494112 bytes)
section .bss at 0x0236f090 (22124 bytes)(not loaded)
(gdb) bre Init
Breakpoint 1 at 0x2001238: file test.c, line 70.
(gdb) 
Note: breakpoint 1 also set at pc 0x2001238.
Breakpoint 2 at 0x2001238: file test.c, line 70.
(gdb) n
Cannot find bounds of current function
(gdb) run
Starting program: /home/omt/TEST3/test.exe 
loading:
section .text at 0x02000000 (106416 bytes)
section .data at 0x02019fb0 (3494112 bytes)
section .bss at 0x0236f090 (22124 bytes)(not loaded)
Breakpoint 1, Init (argument=0) at test.c:70
70        char                  prueba[5]="rtems";
77        status = Untar_FromMemory((unsigned char
*)(&_binary_tarfile_start), (unsigned long) &_binary_tarfile_size);
(gdb) n
assertion "memory" failed: file
"../../../../../../rtems-19991203.joel/c/src/lib/libc/memfile.c", line
340
Program exited normally.

rtems-19991203.joel/c/src/lib/libc/memfile.c line 340:
  memory = memfile_alloc_block();
  assert( memory );
  if ( !memory )
    return 1;
  *block_entry_ptr = memory;
  return 0;
}




	If I only use Klasses.jar

venus:~/TEST3$ tar cvf tarfile  Klasses.jar hola
-rw-r--r--   1 omt      wms        890880 Feb 11 10:18 tarfile
-rw-r--r--   1 omt      wms        891360 Feb 11 10:19 tarfile.o

venus:~/TEST3$ /usr/local/erc32/bin/sparc-rtems-gdb
test.exe                      
GNU gdb 4.17.gnat.3.11p
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "--host=i686-pc-linux-gnu
--target=sparc-erc32-elf32"...
(gdb) tar sim -ram 32000 -rom 8000
 SIS - SPARC instruction simulator 3.0.5
 Bug-reports to Jiri Gaisler ESA/ESTEC (jgais at ws.estec.esa.nl)
serial port A on stdin/stdout
allocated 32768 K RAM memory
allocated 8192 K ROM memory
Connected to the simulator.
(gdb) lo
loading:
section .text at 0x02000000 (106416 bytes)
section .data at 0x02019fb0 (893152 bytes)
section .bss at 0x020f4090 (22124 bytes)(not loaded)
(gdb) bre Init
Breakpoint 1 at 0x2001238: file test.c, line 70.
77        status = Untar_FromMemory((unsigned char
*)(&_binary_tarfile_start), (unsigned long) &_binary_tarfile_size);
(gdb) 
Error during write

Untar_FromMemory (tar_buf=0x201a0e0 "Klasses.jar", size=890880) at
../../../../../../rtems-19991203.joel/c/src/libmisc/untar/untar.c:93

	So, the same problem I send you yesterday night by going inside untar:

215                 for (i=0; i<nblocks; i++)
(gdb) 
217                    len = ((sizeToGo < 512L)?(sizeToGo):(512L));
(gdb) 
218                    n = fwrite(&tar_buf[ptr], 1, len, fp);
(gdb) 
219                    if (n != len)
(gdb) 
224                    ptr += 512;

++++++++++++++
This is a loop
++++++++++++++

(gdb) print nblocks
$118 = 1729
(gdb) print i
$119 = 11

        it needs 5 next for i=i+1
        so, I try i=i+1000

(gdb) next 5000
Error during write


	I don't know how to solve the problem... 

Thanks for your support,
									Oscar
-- 
Óscar Martínez de la Torre -  Office Phone: +31-(0)71.565.5844
Telecommunication Engineer at Universidad Politécnica de Madrid 
European Space Agency ESTEC/TOS/EMS Erasmus Building Office Nb212 
Keplerlaan,1 - NL 2201 AZ - Noordwijk ZH - The Netherlands
Mail: omt at wm.estec.esa.nl - Personal Mail: omt at etsit.upm.es
-------------- next part --------------
/*  Init
 *  This routine is the initialization task for this test program.
 */

#include <bsp.h>

#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE

#define CONFIGURE_EXECUTIVE_RAM_SIZE    (512*1024)
#define CONFIGURE_MAXIMUM_SEMAPHORES    20
#define CONFIGURE_MAXIMUM_TASKS         20

#define CONFIGURE_INIT_TASK_STACK_SIZE  (10*1024)
#define CONFIGURE_INIT_TASK_PRIORITY    120
#define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \
                                           RTEMS_NO_TIMESLICE | \
                                           RTEMS_NO_ASR | \
                                           RTEMS_INTERRUPT_LEVEL(0))

#define CONFIGURE_INIT

rtems_task Init(
  rtems_task_argument argument
);

/* configuration information */

#include <confdefs.h>

#include <errno.h>
#include <time.h>

#include <confdefs.h>
#include <stdio.h>
#include <rtems/rtems_bsdnet.h>
#include <ftpd.h>

#include <unistd.h>
     
#include <rtems/error.h>
#include <rpc/rpc.h>
#include <netinet/in.h>
#include <time.h>

#include <arpa/inet.h>
#include <sys/socket.h>

#include <fcntl.h>
#include <rtems/untar.h>

#define PERMS 0666


extern int _binary_tarfile_start;
extern int _binary_tarfile_size;

rtems_task Init(
  rtems_task_argument argument
)

{

  rtems_status_code     status;
  int			fd;
  int			fd2;
  int			ok;
  char                  buffer[5];
  char		  	prueba[5]="rtems";


  printf( "START\n" );

  printf("%s\n",prueba);

  status = Untar_FromMemory((unsigned char *)(&_binary_tarfile_start), (unsigned long) &_binary_tarfile_size);

  fd = open("hola",O_RDWR);
  if (fd==-1)
     printf("problems open: %i\n",fd);

  while ((ok = read(fd, buffer, 4)) >0)
        printf("n:%i leo:%s\n",ok,buffer);

  ok = close(fd);
  fd = open("hola",O_RDWR);
  if (fd==-1)
     printf("problems open: %i\n",fd);

  ok=write(fd,prueba,4);
  if (ok==-1)
     printf("problems w1: %i\n",ok);
 
  ok = close(fd);
  fd = open("hola",O_RDWR);

  while ((ok = read(fd, buffer, 4)) >0)
        printf("2n:%i leo:%s\n",ok,buffer);

  fd2 = creat("adios",PERMS);
  if (fd2==-1)
     printf("problems creat: %i\n",fd);

  ok=write(fd2,prueba,4);
  if (ok==-1)
     printf("problems w2: %i\n",ok);

  ok=read(fd2,buffer,4);
  if (ok==-1)
     printf("problems r2: %i\n",ok);

  printf("%s\n",buffer);
  printf("%s\n",prueba);

  exit(0);
}



More information about the users mailing list