|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - sharek
Páginas: [1]
1
« en: Martes 4 de Noviembre de 2008, 08:08 »
No se si habrás caído en la cuenta que los arrays de char (strings) terminan en el byte nulo ( ) para indicar el EOL, todas las cadenas de texto en C deben tenerlas, si no, funciones como strcpy, printf etc.. no sabrían donde han de parar de leer y te imprimirían la memoria del programa (código u otras variables) hasta encontrar un '0' de pura suerte. si tu creas una cadena: Estás creando un array de 5 byte, no 4 ya que es 'H','o','l','a',' ' memcpy NO añade ese , strcpy y strncpy si lo generan EI: Juntando mensajes, por favor si no hay ninguna respuesta en el medio usen el boton editar.releyendo tu mensaje.... else bloques[i].cadena[1] = '0';
Te das cuenta que '0' es el literal "cero" y no ' ' (NULL), tenlo en cuenta
2
« en: Domingo 2 de Noviembre de 2008, 17:26 »
Alguien ha usado alguna vez PCRE o conoce algún tutorial sobre ello en C?
No he encontrado ni un solo tutorial de C sobre PCRE, y los manuales que vienen con la librería solo reflejan el API y nada mas, supongo que habrá que rellenar alguna estructura y luego realizar la búsqueda recursivamente hasta que devuelva null o similar, pero no se por donde empezar, alguien puede arrojarme un poco de luz sobre el tema?
3
« en: Sábado 1 de Noviembre de 2008, 08:15 »
Tu necesitas a XPath ;-) lo tienes dentro de libxml, te permitirá extraer las urls (href de las etiquetas anchor) con una especie de expresión regular (por llamarlo de alguna forma)
4
« en: Sábado 30 de Junio de 2007, 00:42 »
en cuanto al código que genera errores misteriosos en bochs... ¿Alguien ve alguna errata?
no entiendo que falla y es realmente decepcionante
5
« en: Sábado 30 de Junio de 2007, 00:41 »
CULPA MIA! mil perdones selector_tabla_descriptores: dw selector_tabla_descriptores.fin - selector_tabla_descriptores -1 dd 07C00h + selector_tabla_descriptores selector_tabla_descriptores:
Tengo el código (y las etiquetas) en otro idioma, y al traducirlo para ponerlo en el foro para que quedase mas claro, LA CAGUE!perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, perdon, una y MIL VECES
6
« en: Viernes 29 de Junio de 2007, 09:48 »
Perdón? fijate bien en mi código: (etc....) pasa_a_mode_protegit: cli lgdt [selector_taula_descriptors] mov EAX, CR0 or AL, 1 mov CR0, EAX jmp 08h:07C00h + mode_protegit (etc....) selector_taula_descriptors: dw taula_descriptors.fi - taula_descriptors -1 dd 07C00h + taula_descriptors taula_descriptors: ; taula de descriptors de segments .nul: ; Segment nul dw 0 ; Limit L0-L15 dw 0 ; base B0-B15 (etc....)
¿donde ves que no lo use? lgdt [selector_taula_descriptors] y luego, mas abajo tengo selector_taula_descriptors: dw taula_descriptors.fi - taula_descriptors -1 dd 07C00h + taula_descriptorsy la tabla debajo Creo que es todo correcto... ¿me estoy liando yo o te estás liando tu? Saludos (y gracias)
7
« en: Jueves 28 de Junio de 2007, 17:23 »
Soy un plasta, lo se!
pero fijaos en el código de ahora, no habilito las interrupciones y sigue fallando por excepción 13 (err prot general)
soy un liante! al principio no me iba, luego parecía que si, y ahora vuelve a no irme... es un problema en alguna parte del código y no hay tutía
Amf amf
8
« en: Jueves 28 de Junio de 2007, 06:45 »
¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites. No habilito las interrupciones hasta que tengo el código en 32bit, después del salto corto, todo y no tener tabla de interrupciones, no debería rebentarme y acabar en un error de protección general, pero, sigo sin ver el porqué peta, pongo el codigo esencial, a ver si veis algún error garrafal: [BITS 16] jmp 07C0h:inicio inicio: ; aqui uso interrupciones de bios para cargar el "nucleo" pasa_a_modo_protegido: cli lgdt [selector_tabla_descriptores] mov EAX, CR0 or AL, 1 mov CR0, EAX jmp 08h:07C00h + modo_protegido [BITS 32] modo_protegido: jmp 08h:10000h selector_tabla_descriptores: dw selector_tabla_descriptores.fin - selector_tabla_descriptores -1 dd 07C00h + selector_tabla_descriptores selector_tabla_descriptores: .nulo: ; Segmento nulo dw 0 ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 00000000b ; Drets d' accés db 00000000b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .codigo: ; Segment de codi lectura/escriptura, no conformat dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10011010b ; Drets d' accés db 11001111b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .datos: ; Segment de dades, lectura/escriptura, expansió cap avall dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10010010b ; Drets d' accés db 11001111b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .fin: times 510-($-$$) nop dw 0AA55h
el código debería terminar en pero por alguna razón bochs rebienta en la linea anterior, en el salto a 32bit: jmp 08h:07C00h + modo_protegido
00001345703i[CPU ] >> jmp far 0008:7c44 : EA447C0800 00001345703e[CPU ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 00001345703i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called 00001345703e[CPU ] CPU_LOOP bx_guard.interrupt_requested=1 Next at t=1345703 (0) [0x00007c3f] 07c0:003f (unk. ctxt): jmp far 0008:7c44 ; ea447c0800 <bochs:2> 00001345703i[ ] dbg: Quit
Todo apunta a un problema con los descriptores de segmentos, pero yo creo que están bien... (se que es un palo leer todo el post, pero ya no se donde caer muerto...)
9
« en: Miércoles 27 de Junio de 2007, 21:19 »
Superado el trauma, ahora solo tengo el problema que si habilito las interrupciones, rebienta todo.. Si no se crea una tabla de interrupciones válido, ¿peta por error de protección general? no lo entiendo: fijate: [BITS 32] inicio: jmp $
no genera ningún error (si activo el debug de bochs veo como va ejecutando el bucle infinito sin problema en cambio: [BITS 32] inicio: sti jmp $
me da como resultado: 00002428246e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 00002428246i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called 00002428246i[APIC0] local apic in CPU 0 initializing 00002428246e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1 Next at t=2428246 (0) [0x00010001] 0008:10001 (unk. ctxt): jmp .+0xfffffffe (0x00000001) ; ebfe
mis descriptores de segmento son los siguientes: taula_descriptors: ; taula de descriptors de segments .nul: ; Segment nul dw 0 ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 00000000b; Drets d' accés db 00000000b; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .codi: ; Segment de codi lectura/escriptura, no conformat dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10011010b; Drets d' accés db 11001111b; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .dades: ; Segment de dades, lectura/escriptura, expansió cap avall dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10010010b; Drets d' accés db 11001111b; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31 .fi:
estoy en el segmento 08h:10000h (como se aprecia en el error de bochs) y no tengo tabla de interrupcion creada ¿alguien sabe si es normal este error sin tabla? probé a crear una tabla pero creo que la documentación que consulté no era demasiado de fiar... obtenía el mismo error
10
« en: Miércoles 27 de Junio de 2007, 20:34 »
Bien, entonces, avanzamos un poco mas, si lo hago 16 bit: cli lgdt [selector_taula_descriptors] mov EAX, CR0 or AL, 1 mov CR0, EAX jmp 08h:10000h
No me coge el desplazamiento, ya que supera los 16bit y salta a 08h:0 en vez de a 08h:10000h Se que deben ser cosas básicas, pero no puedo con ellas...
11
« en: Miércoles 27 de Junio de 2007, 20:01 »
Uso nasm para compilar... ¿pq demonios no entiende el jmp y me ensambla un jmp tan feo como "jmp far 1:0" ? es absurdo! Mil perdones, dije compilar y es ensamblar
12
« en: Miércoles 27 de Junio de 2007, 19:39 »
Espera, que nos desviamos del tema, las interrupciones ya llegarán, he probado una cosa, he cogido la definicion de los segmentos de el post del Bootloader (por si mis definiciones eran incorrectas) y ahora me da un error bastante gracioso, adjunto código pasa_a_modo_protegido: cli lgdt [selector_tabla_descriptores] mov EAX, CR0 or AL, 1 mov CR0, EAX [BITS 32] jmp 08h:10000h
es divertido ver como bochs me peta diciendo: 00001116142i[CPU0 ] >> jmp far 0001:0000 : EA00000100 00001116142e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 00001116142i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called 00001116142i[APIC0] local apic in CPU 0 initializing 00001116142e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1 Next at t=1116142 (0) [0x00007c3f] 07c0:003f (unk. ctxt): jmp far 0001:0000 ; ea00000100
Uso nasm para compilar... ¿pq demonios no entiende el jmp y me ensambla un jmp tan feo como "jmp far 1:0" ? es absurdo!
13
« en: Miércoles 27 de Junio de 2007, 16:28 »
Sisis, eso por descontado, perdón si no me hice entender bien, primero salto a modo protegido, después asigno la tabla de descriptores de segmentos y después la tabla de interrupciones.
Es mas, creo que la tabla de interrupciones en modo protegido no es imprescindible, ya que el código debería poderse ejecutar independientemente de si gestionas correctamente las interrupciones (siempre y cuando no te topes con una, claro)
14
« en: Miércoles 27 de Junio de 2007, 13:58 »
Hace ya meses (si, soy patético) que intento, sin éxito desarrollar un sistema operativo de juguete (mejor dicho un cargador de programas con 4 funciones) mi idea es simplemente divertirme, no pretendo hacer nada usable ni nada grande....
Hice mis pinitos con el modo real, un mini entorno con 4 funciones básicas de acceso a disco y demás
El problema vino cuando 1mb me resultó insuficiente para jugar (entiendase jugar por pasarlo bien programando en ensamblador)... aqui entra el modo protegido
Creo los descriptores de segmento, tal y como indica la documentación de intel, 200mil webs y tres o cuatro libros, paso a modo protegido tal y como indica y hago el salto corto para "entrar" a un segmento válido y ete aqui el problema siempre, SIEMPRE SIEMPRE, invariablemente, si habilito las interrupciones, "error de protección general"
No pego código para no ofender sensibilidades y pq no lo tengo a mano ahora (estoy en la oficina) pero si quereis mas información la pondré mas tarde...
a grandes rasgos... esa excepción solo debería suceder si el segmento no es válido y no creo que sea el caso... ¿alguien sabe si hay que hacer algún paso adicional salvo cargar (lgdt) la tabla de descriptores, crear una tabla de interrupciones (aunque creo que no es imprescindible) pasar a modo protegido, hacer un salto largo y tirar millas?
otra cosa que no acabo de tener claro es como demonios selecciono los selectores...
8h es el primero... 16h es el segundo?
(perdón por ser tan ambiguo... prometo desarrollar mas, con código si el hilo crece)
15
« en: Miércoles 27 de Junio de 2007, 13:42 »
Lo que mas me ha gustado es lo del registro "E"... ¿Existe tal registro de proposito general en 8086?
no son AX,BX,CX, y DX?
(estoy preguntando, no afirmando, jamás miré un datasheet de 8086)
Páginas: [1]
|
|
|