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