Ir al contenido

Progresos arrancando uClinux II: con el kernel del s3c2510


Publicaciones recomendadas

Despues de arreglar un par de fallos de compilacion (la mayoria faciles, en concreto las tipicas chorradas, el hecho de que los compiladores nuevos no admiten literales de cadena multilinea (partirlas en cachos y poner

al final de cada una, suele pasar con codigo ASM embebido) y que hay que borrar include/asm/constants.h para que se regenere bien), de infestar el codigo de init de memoria de pequeños debugs (hasta que me di cuenta de que el problema era que definia la memoria demasiado grande y se comia el kernel en el wraparound), y de dejar el driver serie del s3c2510 en un minimo (sin init, y simplemente hace putchars y esperas. Hay que repasar el tema a ver si inicializa bien, con el driver normal no me iba y simplemente he comentado todo menos la de escribir cadena que he sustituido por un simple PUTCHAR) parece que el kernel da señales de vida:

0!

012K

memset: 0x000a6000 [0x00001000]

Q>bc<<0***1234<

memset: 0x000a7000 [0x00018030]

Q>>567<

memset: 0x000bf040 [0x00000100]

Q>>89*(*(<

memset: 0x000bf140 [0x00000040]

Q>>)*(012******345<L

memset: 0x000bf180 [0x0000001c]

Q>M>3456789>[Hasta aqui son debugs mios, sin pasar por el driver de la consola]Architecture: 2510REF-AN

hm, page 00010000 reserved twice.

On node 0 totalpages: 2048

zone(0): 0 pages.

zone(1): 2048 pages.

zone(2): 0 pages.

Kernel command line: ÿpP

..G¢..... ë-E.ÿmT

ß{D.Øû.a.3..ÿß

Calibrating delay loop... 267596.59 BogoMIPS

Memory: 8MB = 8MB total

Memory: 7424KB available (381K code, 189K data, 23K init)

Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)

Inode cache hash table entries: 512 (order: 0, 4096 bytes)

Mount-cache hash table entries: 512 (order: 0, 4096 bytes)

Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)

Page-cache hash table entries: 2048 (order: 1, 8192 bytes)

POSIX conformance testing by UNIFIX

ENVM: Register envm driver.

Linux NET4.0 for Linux 2.4

Based upon Swansea University Computer Society NET3.039

Internal error: branch through zero: 0

CPU: 0

pc : [<00000004>] lr : [<000030a4>] Not tainted

sp : 00009c44 ip : 004e9fe8 fp : 00000000

r10: 00000001 r9 : 000788dc r8 : 00000001

r7 : 00015f98 r6 : 00000000 r5 : 00015f90 r4 : 00015f94

r3 : 00000000 r2 : 20000013 r1 : 00000000 r0 : 00000000

Flags: nzCv IRQs on FIQs on Mode SVC_32 Segment kernel

Control: C000107D

Process swapper (pid: 1, stackpage=004e9000)

Stack:

004e9fe0: 000030a4 00000004 20000013 00000000 00000800 00000000 00000000 00018118

Backtrace: no frame pointer

Code: <1>Unhandled fault: vector exception (0) at 0x0001a7b4 (pc=0x1a7b4,sp=0x4e9e64,lr=0x1a7a8)

process(swapper) fault-common.c(98): start_code=0xe3a08000, start_stack=0xe59ff018)

Internal error: Oops: 0

CPU: 0

pc : [<0001a7b4>] lr : [<0001a7a8>] Not tainted

sp : 004e9e64 ip : 004e9e38 fp : 00000000

r10: 00000001 r9 : 000f0000 r8 : 009f0000

r7 : 004e9000 r6 : 00000000 r5 : 00000004 r4 : fffffffe

r3 : 00000000 r2 : 00000001 r1 : fffffffc r0 : 00000006

Flags: nZCv IRQs off FIQs on Mode SVC_32 Segment kernel

Control: C000107D

Process swapper (pid: 1, stackpage=004e9000)

Stack:

004e9e40: 0001a7a8 0001a7b4 60000093

004e9e60: ffffffff 00073cb8 00000000 004e9fa8 0001a920 00000000 00015f90 00000000

004e9e80: 004e9fa8 0001acdc f8df0908 afd7c030 fff78043 bf7f0d10 3edfa618 ee7f2808

004e9ea0: efff8118 aa7f0a2e 7f770854 4f7d8393 afff6820 6e7712f0 fef71411 ffeb2148

004e9ec0: fffd2693 dff37212 ab3d6c06 ea5f8314 00017f50 00000000 00000001 004e0000

004e9ee0: 004e1fb8 00009c44 00000078 004e8000 004e9efc 00017f50 000683d0 00000013

004e9f00: 00000000 00000000 0000000b 00000000 00030001 00000000 004e9f3c 004e9f28

004e9f20: 0001dce4 0001dbc4 00000000 00000001 004e8000 004e9f40 0001fc68 0001dc98

004e9f40: 004e0000 004e9f9c 60000013 004e8000 00078840 004e0000 00079098 00078000

004e9f60: 00076000 000845c0 004e9f98 0001df80 00015f7c 00000000 00000000 004e8000

004e9f80: 00016f80 00000078 00015f94 00015f90 00000000 004e8000 00000000 00016e00

004e9fa0: 00015f94 00000600 00000000 00000000 20000013 00000000 00015f94 00015f90

004e9fc0: 00000000 00015f98 00000001 000788dc 00000001 00000000 004e9fe8 00009c44

004e9fe0: 000030a4 00000004 20000013 00000000 00000800 00000000 00000000 00018118

Backtrace: no frame pointer

Code: e3a03000 e0851104 (e4b12000) e3530000 e3a01008

Kernel panic: Attempted to kill init!

Para pequeños debugs uso:

#define PUTCHAR(x) {int i; *((char *)0xF007000C)=(x); for(i=0;i<0xfff;i++){i=i;}}

Por lo demas, es el kernel que posteó MyADSL, compilado con gcc 3.4.3 y binutils 2.15.90.0.1.1, preparados usando el uclibc buildroot con el config que pegué en el post anterior. Notas: editar arch/armnommu/Makefile y poner TEXTADDR=0x10060 bajo arch 2510REF (no 10050 ya que redondea y se fastidia) y luego configurar (la arquitectura es 2510REF, y calculadle la RAM empieza en 0x00000000 y son 8MB ese banco como minimo, supongo que los otros 8MB iran en el otro banco pero eso mas adelante) y la ROM son 2MB en 0x80000000. Desactivad todas las funciones innecesarias menos lo del serial High-speed UART S3C2510. Luego en el archivo drivers/char/serial_s3c2510.c simplemente en init_console poner un return al principio, l final en el tema de inicializar la consola, comentar todo, y en s3c2510_console_write reemplazar esos putchar por mi macro PUTCHAR (sin la estructura info). En drivers/char/tty_io.c console_init subir la init del S3C2510 justo despues del disable_early_printk. Es una guarreria, si, pero por ahora funciona :P Ah y en arch/armnommu/kernel/head-armv.S buscar #elif defined(CONFIG_BOARD_2510REF) y antes del mov r1,... añadir

mov r0, #0x83

swi 0xff

Recomiendo poner PUTCHARs en init/main.c rutina start_kernel para saber por donde va en la inicializacion. Si no se llega a ejecutar, es algo con head-armv.S (pero a mi me funcionó solo añadiendo el SWI)

Compilar con make linux y luego crear un archivo con 4 NOPs para rellenar (y que se convierta en algo cargable en 0x10050) algo tal que asi (NOP es 0xe1a00000, grabado en little-endian en el archivo claro):

$ hexdump -vC nops

00000000 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 |................|

Despues arm-linux-objcopy -O binary linux linux.tmp y cat nops linux.tmp > linux.bin. Subir eso (m) por XMODEM en 0x10050 y ejecutar con y (tras haber entrado en modo admin, !) en el bootloader.

Lo que no entiendo es porque se tira milenios en el calibrating delay loop (muchos minutos? una hora? »267596.59 BogoMIPS eso es evidente que no esta bien (mi Athlon64 3000+ da 3546.31). Quizas esta mal configurado el timer o algo asi y no recibe las interrupciones bien? Porque si no estoy equivocado los jiffies (que se usa para calcular los BogoMIPS) son las interrupciones de timer o algo por el estilo). Ah y lo del commandline salia bien la primera vez que lo probé, no se porqué sale mal ahora :casstet:

Seguiremos investigando ;)

[Editado el 26/12/2004 por marcansoft]

Enlace al mensaje
Compartir en otros sitios web
Invitado
Este tema está cerrado a nuevas respuestas.
×
×
  • Crear nuevo...

Información importante

Términos de Uso Política de privacidad Hemos colocado cookies en su dispositivo para ayudar a mejorar este sitio web. Puedes ajustar la configuración de tus cookies ; de lo contrario, asumiremos que quieres continuar.