Unfortunately no one can be told what fun_plug is - you have to see it for yourself.
You are not logged in.
I'm the proud owner of a Zyxel NSA-220. This has comparable hardware to the DNS-323. The kernel has some problems for me:
1) It doesn't have EABI support, and as far as I could find this makes it impossible to chroot Debian.
2) It doesn't support IPv6, and I can't add it with a module, due to a bug in the kernel.
3) It doesn't support USB sound. I can add it with kernelmodules, but I can play only one stream. If the stream ends, the kernel crashes.
In order to load my own kernel, I was looking at the reloaded module here: http://www.inreto.de/dns323/reloaded/dn … -0.7.167/. Reading the code it seems to me that the new kernel and initrd are loaded to memory, after which the processor reboots. No trace of the previous boot remains in memory. Right? So this doesn't cost any extra memory, besides the difference in size of both kernels and initrd's?
I have the sources of my firmware kernel, and I want to compile it with the extra stuff I need, by changing .config. Then I load this kernel with the firmware initrd. This should give me the wanted functionality, without disabling the Zyxel firmware.
A few questions:
1) The lack of EABI keeps me from chrooting Debian, can the presence of EABI keep me from running the firmware stuff?
2) The NSA-220 can run a script at boot, comparable to the fun_plug construction, but called much earlier, before the HD's are mounted and the services are started. When I reload the kernel here, I need a way to see if it's reloaded already, to avoid a loop. Any suggestions?
3) The contents of /proc/cmdline is
rootfstype=squashfs root=/dev/mtdblock1 ro mtdparts=physmap-flash.0:2432k(kernel),12928k(initrd),896k(etc),-(bootbase) console=ttyS0,115200n8 mem=128M init=/linuxrc
. I suppose this is the commandline provided to the kernel. It seems the size and the location of the kernel is provided here. Can that give a problem when providing a kernel which isn't located at flash.0? Of course I can change the size, but I can't provide a location. The location is on USB stick, which isn't available when boot starts.
Offline
Mijzelf wrote:
1) It doesn't have EABI support, and as far as I could find this makes it impossible to chroot Debian.
You can't use the armel port, but 'standard' Debian/arm should work.
Mijzelf wrote:
In order to load my own kernel, I was looking at the reloaded module here: http://www.inreto.de/dns323/reloaded/dn … -0.7.167/. Reading the code it seems to me that the new kernel and initrd are loaded to memory, after which the processor reboots. No trace of the previous boot remains in memory. Right? So this doesn't cost any extra memory, besides the difference in size of both kernels and initrd's?
Correct.
Mijzelf wrote:
I have the sources of my firmware kernel, and I want to compile it with the extra stuff I need, by changing .config. Then I load this kernel with the firmware initrd. This should give me the wanted functionality, without disabling the Zyxel firmware.
A few questions:
1) The lack of EABI keeps me from chrooting Debian, can the presence of EABI keep me from running the firmware stuff?
2) The NSA-220 can run a script at boot, comparable to the fun_plug construction, but called much earlier, before the HD's are mounted and the services are started. When I reload the kernel here, I need a way to see if it's reloaded already, to avoid a loop. Any suggestions?
3) The contents of /proc/cmdline is ...Of course I can change the size, but I can't provide a location. The location is on USB stick, which isn't available when boot starts.
1) The kernel can support both EABI and OABI binaries:
CONFIG_AEABI=y CONFIG_OABI_COMPAT=y
2) You can append a custom string to the kernel version that will be shown in 'uname -r', e.g. '2.6.25.1-ffp'.
CONFIG_LOCALVERSION="-ffp"
I think, for older kernels this setting is in linux/Makefile and not in .config.
3) No idea. Try and error...
Offline
You can't use the armel port, but 'standard' Debian/arm should work.
Are you sure about that? I've tried several 'distros' (if distro is the word here) for the DNS-323 and the NSLU2. Further I've tried to cdebootstrap both Etch and Lenny (cdebootstrap -aarm). All attemps ended in 'Invalid instruction', when executing 'chroot debian /bin/bash', or 'chroot debian /bin/sh'
Offline
Mijzelf wrote:
'Invalid instruction'
Could be a floating point issue. If the debian arm port uses hardware floating point instructions (I think it does), you need matching floating point emulation in the kernel. Does your kernel have CONFIG_FPE_NWFPE enabled?
Offline
I don't think so. From .config:
# # At least one emulation must be selected # # CONFIG_FPE_NWFPE is not set CONFIG_FPE_FASTFPE=y CONFIG_VFP=y
Is there a way to ask the kernel itself?
Last edited by Mijzelf (2008-12-13 20:24:08)
Offline
Mijzelf wrote:
Code:
# CONFIG_FPE_NWFPE is not set CONFIG_FPE_FASTFPE=y CONFIG_VFP=y
That's the wrong options for Debian/arm. See below.
Mijzelf wrote:
Is there a way to ask the kernel itself?
Yes, if you have enabled /proc/config.gz:
# zgrep FP /proc/config.gz CONFIG_FPE_NWFPE=y # CONFIG_FPE_NWFPE_XP is not set # CONFIG_FPE_FASTFPE is not set # CONFIG_VFP is not set
Offline
And the enabling of /proc/config.gz is done in .config, I suppose? I don't have an /proc/config.gz.
Will enabling CONFIG_FPE_NWFPE break my firmware?
Does this mean I don't need EABI?
Offline
Mijzelf wrote:
And the enabling of /proc/config.gz is done in .config, I suppose? I don't have an /proc/config.gz.
I think it's these two:
CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y
Mijzelf wrote:
Will enabling CONFIG_FPE_NWFPE break my firmware?
Don't know, but that's possible.
Mijzelf wrote:
Does this mean I don't need EABI?
If possible, use EABI. Because of the different floating point and ABI issues, it can be tricky to find a working configuration. Generally, the floating point emulation is awfully slow, really, really slow. That's why ffp is compiled using a soft-float toolchain. ffp also uses OABI for compatibily reasons.
There's some documentation about Debian OABI/EABI and floats here: http://wiki.debian.org/ArmEabiPort
Offline
Mijzelf wrote:
I'm the proud owner of a Zyxel NSA-220. This has comparable hardware to the DNS-323. The kernel has some problems for me:
1) It doesn't have EABI support, and as far as I could find this makes it impossible to chroot Debian.
Somewhat tangential to your topic, but if you want to run Debian, consider installing it natively. http://www.cyrius.com/journal/debian/or … nk/dns-323 has all the latest info. If "comparable" means "something like" rather than "rebadged, with the same innards", then you might need to do some porting work. I've documented the process I went through for the DNS-323 at http://www.hezmatt.org/~mpalmer/blog/ge … s_323.html
- Matt
Offline
'Comparable' means 'A two drive NAS with the same processor running Linux', in this case. So yes, I should have to do some porting. For the moment that is beyond my scope. One step a time. But thanks for the link, it's interesting reading.
Offline
I'm stuck while compiling reloaded.ko. I changed symlink linux to point to the root of the kernelsources, created this 'script':
#!/bin/sh export PATH=/opt/montavista/pro/devkit/arm/v5t_le/bin:${PATH} export FUN_TARGET=arm_v5t_le make all
I had to edit proc-arm926.S:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) #include <asm/constants.h> #else #include <asm/asm-offsets.h> #endif
While I have kernel 2.6.18, it yet has a asm/asm-offsets.h, and no asm/constants.h. So I changed the condition.
Now I get this output:
make -C linux M=/home/mijzelf/dns323-reloaded-0.7.167 CROSS_COMPILE=arm_v5t_le- ARCH=arm modules make[1]: Entering directory `/home/mijzelf/NSA-220/nsa220/linux-2.6.18.6' AS [M] /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.o /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S: Assembler messages: /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S:366: Error: undefined symbol PTE_SMALL_AP_MASK used as an immediate value /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S:367: Error: undefined symbol PTE_TYPE_MASK used as an immediate value /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S:368: Error: undefined symbol PTE_TYPE_SMALL used as an immediate value /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S:371: Error: undefined symbol PTE_SMALL_AP_URO_SRW used as an immediate value /home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.S:374: Error: undefined symbol PTE_SMALL_AP_UNO_SRW used as an immediate value make[2]: *** [/home/mijzelf/dns323-reloaded-0.7.167/proc-arm926.o] Error 1 make[1]: *** [_module_/home/mijzelf/dns323-reloaded-0.7.167] Error 2 make[1]: Leaving directory `/home/mijzelf/NSA-220/nsa220/linux-2.6.18.6' make: *** [all] Error 2
Offline
OK, I sorted that part. Had to include <asm/pgtable-hwdef.h> in proc-arm926.S.
Offline
Status so far:
1) I've builded a kernel, in which I added support for /proc/config.gz and ipv6. This gave me a file vmlinux, 4862752 bytes.
2) Copied initrd: dd -if=/dev/mtd1 of=initrd. This makes a file of 12928kB.
3) Tried to gunzip this file. This fails, so I assume it's not compressed.
4) Build reloaded.ko, with the same toolchain as I used to build the kernel. 16589 bytes.
5) The box has 2 devices mounted, /dev/md0, and /dev/sdc1 (the usbstick). I stopped and killed everything until I could remount them readonly.
6) Used this script:
#!/bin/sh CMDLINE=` cat /proc/cmdline ` /sbin/insmod reloaded.ko machtype=526 kernel=vmlinux initrd=initrd cmdline=\"$CMDLINE\"
First I had a typo in 'vmlinux', then I got a 'could not insmod, permission denied'. I solved the typo, and then the prompt didn't return, as expected.
But: as far a I could investigate, the box did not reboot. It had no samba, ssh, ftp of http available, after waiting for about 15 minutes. (Normally they are available in less than a minute). But I could ping the box.
Which options do I have to find out what is going wrong?
Offline
- use 'make zImage' to build the kernel. it will compile arch/arm/boot/zImage, pass the zImage file to realoded.ko instead of vmlinux
- also note that reloaded.ko must not be compiled for the kernel it's going to boot, but for the original kernel.
Offline
Tried that. BTW, zImage already existed. It was about 1 minute younger than vmlinux, but *much* smaller, 1849176 bytes. This time I couldn't ping the box after the script run, and it didn't return in network either.
I suppose initrd or zImage is wrong. Succeeded in mounting ./initrd (had to compile a loop.ko for that), so I suppose that's not the problem. Will retry with a kernel with a firmware default .config soon.
Offline
I build a kernel with the .config which is packed with the sources provided by ZyXEL. Tried to reload twice. The first time my both ssh sessions froze, but my (permanent) ping just continued. I rebooted the box after 15 minutes, and retried. This time ssh froze, and ping started to give timeouts. The box didn't come back again.
The kernel in flash is 2490368 bytes. (dd if=/dev/mtd0 of=./kernel.flash). On my build system there are 3 'kernelish' files, linux/vmlinux (4850717 bytes) linux/arch/arm/boot/Image (3792944 bytes) and linux/arch/arm/boot/zImage (1842632 bytes).
I suppose the flash kernel should be one of these, but none of the sizes fit, or comes close. I tried to reload with kernel.flash either, but it didn't work.
I'm pretty sure my build environment (which is provided by ZyXEL) is OK. I have build several kernel modules which just work.
Ideas?
Offline
Searching further.
In my build environment I found a file ras.bin which is identical to my 'flash kernel'. This file starts with 384kB of something which looks like an extended bootloader, according to the strings it contains. Then a header of 48 bytes, and then zImage. The remaining 254472 bytes are just filled with zero's. So 48 bytes header + zImage + zero's is exactly 2MB.
In reloaded main.c I found this:
/* current array sizes: 200 for kernel 280 for initrd mean segment size is 32k, two longs needed per segment kernel < 200/2 * 32k = 3.2M initrd < 280/2 * 32k = 4.3M */
My initrd is 12.6MB. This will cause troubles, I suppose?
What about the machtype? I've been reading about this, and found it fuzzy. AFAIU the bootloader has to put the machtype in a register before calling the kernel, so the kernel can do board specific things. Sounds smart, but is this not just moving the trouble to the bootloader? I have searched in the kernelsources if I could find the entry point, to see where it's stored, but no luck.
How do I find the machtype for my kernel?
Offline
The mach-types files is identical to the vanilla version, and there is no nsa220-ish device in it.
A grep on nsa220 in the linux directory (after a build, with all temporary files present) learned that almost all hits were in the arch/arm/mach-mv88fxx81 directory. So I suppose 859 is the needed machtype.
I changed reboot.S: 137, 280->809, to meet my initrd size.
Alas it still didn't reboot.
Offline
You can try to use proc-arm926.S and proc-macros.S off from NSA-220 kernel.
Offline
is there a boot log somewhere for the nas-220?
i found there are two hardcoded addresses in reload.S which I took from u-boot output of the dns-323. it might be needed to change them for the nsa-220.
one of them is also in main.c (t->u.initrd.start = 0x800000;)
Offline
I did attach reboot log to this post.
859 should be correct machtype for zyxel kernel.
mv88fxx81 MACH_MV88fxx81 MV88fxx81 859
Offline
Wait, wait, now you're going too fast. What did you do to get this bootlog?
Offline
Mijzelf wrote:
Wait, wait, now you're going too fast. What did you do to get this bootlog?
I didn't do anything yet, it' simple reboot log. I have had no time to test reloader out. But I am sure that machtype is 859. If you're using initrd you will need to modify some addresses in reload.S as fonz mentioned. But additionally you may try to use proc-arm926.S and proc-macros.S off from zyxel kernel when you're compiling reloader module.
Offline
I'm trying to find the hardcoded addresses in reboot.S (there is no reload.S). I suppose it's 0x8000 for the kernel and 0x800000 for initrd. This fits with the DNS-323 bootlog I found here. Unfortunately I'm not able to find corresponding addresses in the bootlog Sala posted. Maybe initrd starts at 0x2000000, but that's a quarter of the total memory range? Isn't that weird?
Offline