Hi Lance,

Thanks for your help. I tried both ways remove "root=/dev/ram0" and add "rootfstype=romfs". But I got exactly same error result:

//------------------------------------ kernel log -------------------------------//

RAMDISK driver initialized: 1 RAM disks of 1024K size 1024 blocksize
uclinux[mtd]: RAM probe address=0xf2450 size=0x1e000
Creating 1 MTD partitions on "RAM":
0x00000000-0x0001e000 : "ROMfs"
mtd: Giving out device 0 to ROMfs
uclinux[mtd]: set ROMfs to be root filesystem
VFS: Cannot open root device "<NULL>" or unknown-block(31,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,0)

//--------------------------------------------------------------------------------//

Would you please help me clarify several questions:

1. What should "root=?" be, if I remove "root=/dev/ram0" from kernel command line?

2. If romfs is located in main memory, should the kernel include the ramdisk module?

3. ROOT_DEV is (31,0), set in uclinux.c, do you think that should be correct one for mounting funciton?

4. There are several global variables defined in uclinux.c, like uclinux_ram_mtdinfo, uclinux_ram_map and uclinux_romfs. They are initialized in uclinux.c, but I can't find where and how they have been used directly or indirectly in later mounting procedure.

BTW, can you send me a kernel configure file you have? I guess i didn't config the kernel coreectly.

Thanks,
Shuanglin



Lance Spaulding wrote:

Hi Shaunglin,

Try removing the 'root=/dev/ram0' from your command line.  You can add
'rootfstype=romfs' if you want but it should work w/o it.

Thanks,
Lance

Shuanglin Wang wrote:
Hi Lance,

I'm doing similar things. I patched the kernel with your code, but i
got an kernel panic. The boot log is:

/---------------------------------------------------------------------/
Kernel command line: root=/dev/ram0
...
io scheduler noop registered (default)
atmel_usart.0: ttyS0 at MMIO 0xf800f000 (irq = 11) is a ATMEL_SERIAL
RAMDISK driver initialized: 1 RAM disks of 1024K size 1024 blocksize
uclinux[mtd]: RAM probe address=0xf02f0 size=0x1e000
Creating 1 MTD partitions on "RAM":
0x00000000-0x0001e000 : "ROMfs"
mtd: Giving out device 0 to ROMfs
uclinux[mtd]: set ROMfs to be root filesystem
Generic platform RAM MTD, (c) 2004 Simtec Electronics
VFS: Can't find a romfs filesystem on dev ram0.
No filesystem could mount root, tried:  romfs
Kernel panic - not syncing: VFS: Unable to mount root fs on
unknown-block(1,0)
/---------------------------------------------------------------------/

I made further test on it. And it seems it get an empty super inode
from romfs.

Did I miss something in kernel configuration or kernel command line?

Thansk a lot.

Shuanglin




Lance Spaulding wrote:

Mickael Sergent wrote:


Hello,

I'm trying to port uclinux 2.6.x on dev. board based on ARM946-E-S. (I
use uClinux-dist 20070130)

I would like to have kernel and ROMfs entirely in RAM but it seems to
be impossible on ARM architecture.

On uclinux 2.4 version a switch (CONFIG_RAM_ATTACHED_ROMFS) can be
used to do this.

Does an equivalent exist in 2.6 version ?


I tried to use CONFIG_MTD_UCLINUX_EBSS (after having defined _ebss
symbol in the end of kernel) but it doesn't solve problem (because RAM
where is stored ROMfs is used by uclinux), so a patch is needed to
reserve ROMfs memory

Do you know another solution to put ROMfs at the end of kernel ?

Thanks a lot !

Best regards,

Mickael.

------------------------------------------------------------------------


_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev
Hi Mickael,

We use a ram based rom filesystem on our ARM products (including ones
using an arm946).  I've attached a small patch of the changes I made to
get this to work.  Note that we use little-endian exclusively so if you
are using big-endian you will need to change the code slightly.
Thanks,
Lance


------------------------------------------------------------------------

diff -Naur
uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-common.S
uClinux-dist/linux-2.6.x/arch/arm/kernel/head-common.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-common.S 2006-06-28 01:22:16.000000000 -0600 +++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head-common.S 2007-04-18 17:57:48.000000000 -0600
@@ -10,7 +10,6 @@
* published by the Free Software Foundation.
*
*/
-
   .type    __switch_data, %object
__switch_data:
   .long    __mmap_switched
@@ -41,7 +40,6 @@
   ldrne    fp, [r4], #4
   strne    fp, [r5], #4
   bne    1b
-
   mov    fp, #0                @ Clear BSS (and zero fp)
1:    cmp    r6, r7
   strcc    fp, [r6],#4
@@ -215,3 +213,41 @@
   bl    __lookup_machine_type
   mov    r0, r5
   ldmfd    sp!, {r4 - r6, pc}
+
+#ifdef CONFIG_MTD_UCLINUX
+    .type    __relocate_romfs, %function
+__relocate_romfs:
+   adr r4, romfsinfo
+    ldmia    r4!, {r6, r7}
+   bic r6, r6, #0xc0000000
+   bic r7, r7, #0xc0000000
+   +   /* move the ram based rom filesystem to its correct final
location...      */
+   /* the value is stored
big-endian                                          */
+   mov fp, #0
+   add r4,r6,#8
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #24
+   add r4,r6,#9
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #16
+   add r4,r6,#10
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #8
+   add r4,r6,#11
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #0
+   add r4, r6, fp
+   add fp, r7, fp
+   sub r6, r6, #4
+1: ldr r5, [r4]
+   str r5, [fp]
+   sub r4, r4, #4
+   sub fp, fp, #4
+   cmp r4, r6
+   bne 1b
+   mov pc, lr
+romfsinfo:
+    .long    __bss_start            @ r6
+    .long    _end                @ r7
+#endif
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-nommu.S
uClinux-dist/linux-2.6.x/arch/arm/kernel/head-nommu.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-nommu.S 2007-01-29 18:55:08.000000000 -0700 +++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head-nommu.S 2007-04-19 08:25:58.000000000 -0600
@@ -16,7 +16,6 @@

#include <asm/assembler.h>
#include <asm/mach-types.h>
-#include <asm/procinfo.h>
#include <asm/ptrace.h>
#include <asm/asm-offsets.h>
#include <asm/thread_info.h>
@@ -41,6 +40,9 @@
   ldr    r1, =machine_arch_type        @ find the machine type
   msr    cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
                       @ and irqs disabled
+#ifdef CONFIG_MTD_UCLINUX
+    bl __relocate_romfs
+#endif   #ifndef CONFIG_CPU_CP15
   ldr    r9, =CONFIG_PROCESSOR_ID
#else
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head.S
uClinux-dist/linux-2.6.x/arch/arm/kernel/head.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head.S 2006-11-29 19:03:00.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head.S    2007-04-19
08:27:23.000000000 -0600
@@ -16,7 +16,6 @@

#include <asm/assembler.h>
#include <asm/domain.h>
-#include <asm/procinfo.h>
#include <asm/ptrace.h>
#include <asm/asm-offsets.h>
#include <asm/memory.h>
@@ -73,6 +72,9 @@
   msr    cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
                       @ and irqs disabled
   mrc    p15, 0, r9, c0, c0        @ get processor id
+#ifdef CONFIG_MTD_UCLINUX
+    bl __relocate_romfs
+#endif       bl    __lookup_processor_type        @ r5=procinfo
r9=cpuid
   movs    r10, r5                @ invalid processor (r5=0)?
   beq    __error_p            @ yes, error 'p'
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/init.c
uClinux-dist/linux-2.6.x/arch/arm/mm/init.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/init.c    2006-11-29
19:03:01.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/init.c    2007-04-19
08:28:11.000000000 -0600
@@ -99,6 +99,23 @@
   unsigned int start_pfn, bank, bootmap_pfn;

   start_pfn   = PAGE_ALIGN(__pa(&_end)) >> PAGE_SHIFT;
+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* If using a romfs in ram, move the
bitmap                             */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      start_pfn=PAGE_ALIGN(__pa(ressiz)) >> PAGE_SHIFT;
+   }
+   +#endif
   bootmap_pfn = 0;

   for_each_nodebank(bank, mi, node) {
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/mmu.c
uClinux-dist/linux-2.6.x/arch/arm/mm/mmu.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/mmu.c    2006-11-29
16:28:08.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/mmu.c    2007-04-19
08:33:23.000000000 -0600
@@ -601,6 +601,24 @@
   reserve_bootmem_node(pgdat, __pa(swapper_pg_dir),
                PTRS_PER_PGD * sizeof(pgd_t));

+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* If using a romfs in ram reserve this
memory...                       */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      ressiz=((ressiz+4095)&0xfffff000); /* align on page
boundary            */
+      reserve_bootmem_node(pgdat, __pa(p), (ressiz-(unsigned)p)); \
+   }
+#endif
+
   /*
    * Hmm... This should go elsewhere, but we really really need to
    * stop things allocating the low memory; ideally we need a better
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/nommu.c
uClinux-dist/linux-2.6.x/arch/arm/mm/nommu.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/nommu.c    2006-12-12
07:16:47.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/nommu.c    2007-04-18
18:03:16.000000000 -0600
@@ -6,11 +6,14 @@
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/pagemap.h>
+#include <linux/bootmem.h>

#include <asm/cacheflush.h>
#include <asm/io.h>
#include <asm/page.h>

+#include <asm/mach/arch.h>
+
#include "mm.h"

extern void _stext, __data_start, _end;
@@ -36,6 +39,24 @@
    * alloc_page breaks with error, although it is not NULL, but "0."
    */
   reserve_bootmem_node(pgdat, CONFIG_VECTORS_BASE, PAGE_SIZE);
+
+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* Lance: If using a romfs in ram reserve this
memory...                */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      ressiz=((ressiz+4095)&0xfffff000); /* align on page
boundary            */
+      reserve_bootmem_node(pgdat, __pa(p), (ressiz-(unsigned)p)); \
+   }
+#endif
}

/*
diff -Naur uClinux-dist.orig/linux-2.6.x/drivers/mtd/maps/uclinux.c
uClinux-dist/linux-2.6.x/drivers/mtd/maps/uclinux.c
--- uClinux-dist.orig/linux-2.6.x/drivers/mtd/maps/uclinux.c 2006-10-11 01:07:52.000000000 -0600
+++ uClinux-dist/linux-2.6.x/drivers/mtd/maps/uclinux.c    2007-04-19
08:01:09.000000000 -0600
@@ -23,6 +23,7 @@
#include <asm/io.h>

/****************************************************************************/

+#define CONFIG_MTD_UCLINUX_EBSS /* Lance: this isn't defined in the
config system */

#ifdef CONFIG_MTD_UCLINUX_EBSS
   #define MAP_TYPE    "map_ram"
@@ -75,7 +76,7 @@
   unsigned long addr = (unsigned long) CONFIG_MTD_UCLINUX_ADDRESS;

   mapp = &uclinux_map;
-    mapp->phys = addr;
+    mapp->phys = __pa(addr); /* Lance: changed to get real phys
addr           */
   mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(addr + 8))));
   mapp->bankwidth = 4;



------------------------------------------------------------------------

_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev


_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev


_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to