Brezniew |
» 2014-03-07 23:59:43 Do przekierowania przerwań użyj tego: io.h: #ifndef _ASM_I386_IO_H #define _ASM_I386_IO_H
#include <sys/types.h>
static inline void outb( byte val, word port ) { __asm__ __volatile__( "outb %%al, %%dx\n\t" ::"a"( val ), "d"( port ) ); }
static inline byte inb( word port ) { byte val; __asm__ __volatile__( "inb %%dx, %%al\n\t" : "=a"( val ) : "d"( port ) ); return val; }
static inline int io_btsb( word port, byte b ) { if( b >= 8 ) return - 1; __asm__ __volatile__( "inb %%dx, %%al\n\t" "btsb %%bl, %%al\n\t" "outb %%al, %%dx\n\t" ::"b"( b ), "d"( port ) : "al" ); return 0; }
static inline int io_btrb( word port, byte b ) { if( b >= 8 ) return - 1; __asm__ __volatile__( "inb %%dx, %%al\n\t" "btrb %%bl, %%al\n\t" "outb %%al, %%dx\n\t" ::"b"( b ), "d"( port ) : "al" ); return 0; }
static inline int io_btcb( word port, byte b ) { if( b >= 8 ) return - 1; __asm__ __volatile__( "inb %%dx, %%al\n\t" "btcb %%bl, %%al\n\t" "outb %%al, %%dx\n\t" ::"b"( b ), "d"( port ) : "al" ); return 0; }
#endif
intr.c #include <asm-i386/io.h> #include <asm-i386/intr.h>
void set_idt( desc_t * desc, word code_sel, byte type_attr, const void * ptr ) { desc->a =(( 0xFFFF &( dword ) ptr ) |( code_sel << 16 ) ); desc->b =( type_attr << 8 ) |( 0xFFFF0000 &( dword ) ptr ); }
int enable_irq( byte irq ) { if( irq > 0xF ) return - 1; if( irq & 0x8 ) io_btrb( PIC2 + 1, irq - 0x8 ); else io_btrb( PIC1 + 1, irq ); return 0; }
int disable_irq( byte irq ) { if( irq > 0xF ) return - 1; if( irq & 0x8 ) io_btcb( PIC2 + 1, irq - 0x8 ); else io_btcb( PIC1 + 1, irq ); return 0; }
void disable_all_irq( void ) { outb( 0xFF, PIC1 + 1 ); outb( 0xFF, PIC2 + 1 ); }
void init_pic( byte offset1, byte offset2 ) { outb( 0x11, PIC1 ); outb( 0x11, PIC2 ); outb( offset1, PIC1 + 1 ); outb( offset2, PIC2 + 1 ); outb( 0x04, PIC1 + 1 ); outb( 0x02, PIC1 + 1 ); outb( 0x01, PIC1 + 1 ); outb( 0x01, PIC2 + 1 ); disable_all_irq(); }
intr.h #ifndef __INTR_H #define __INTR_H
#include <types.h>
#define PIC1 0x20 #define PIC2 0xA0
#define INT_GATE 0x8E #define TRAP_GATE 0x8F #define TASK_GATE 0x05 #define SYS_GATE 0xEF
#ifndef _DESCR_T #define _DESCR_T typedef struct { dword a, b; } desc_t; #endif
#define cli() __asm__ __volatile__( "cli" ) #define sti() __asm__ __volatile__( "sti" )
extern desc_t idt[ 256 ];
#ifdef KERNEL void pic_init( byte offset1, byte offset2 ); #endif
void set_idt( desc_t * desc, byte sel, byte type_attr, void * ptr ); int enable_irq( byte irq ); int disable_irq( byte irq ); void disable_all_irq( void );
#endif
types.h #ifndef __TYPES_H #define __TYPES_H
#define byte unsigned char #define word unsigned short int #define dword unsigned long
#define __byte( x, i ) ((( byte * )&( x ))[ i ]) #define __word( x, i ) ((( word * )&( x ))[ i ]) #define __dword( x, i ) ((( dword * )&( x ))[ i ])
typedef unsigned int size_t;
typedef struct { dword back_link, esp0, ss0, esp1, ss1, esp2, ss2, cr3, eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi, es, cs, ss, ds, fs, gs, ldt; word trace, io_map; } tss_t;
#endif
I wywołaj gdzieś w systemie funkcje pic_init( 0x20, 0x28 ); Te pliki są z mojego systemu. To jest stara implementacja może ci się przyda ja już jej nie używam :) |
|
Elaine |
» 2014-03-08 02:48:34 I jeśli używasz C++ to lepiej przepisz kod do C w C++ jest zaimplementowanych wiele rzeczy do których obsługi wymagana jest biblioteka standardowa C++, a w c wszystko generowane jest przez kompilator. Pisanie głównego kodu w c powoduje wiele błędów, a niektóre, elementy są niemożliwe lub niepraktyczne do zaprogramowania |
? |
|
Brezniew |
» 2014-03-08 14:15:50 Chodzi oto np. jak używasz takich rzeczy jak new, delete itp. Kod w C++ jest często wolniejszy nisz kod w C w przypadku pisania systemu ze względu na wyższy poziom abstrakcji co w samym systemie jest bardzo ważne. Jeśli już chce używać c++ to niech inicjacje kernel-a, kod przerwań i wszystkie powiązane funkcje a szczególnie moduł schedule jeśli zamierzasz go implementować. A jeśli już potrzebujesz czegoś czego nie da zaimplementować w samym c to użyj asm inline, makra z asm-em bądź mechanizmów wbudowanych w kompilator takich jak __attribute__ , co jest o wiele wygodniejsze nisz w C++. W przypadku pisania programów jest na odwrót ale to jądro systemu operacyjnego. Sam osobiście na początku chciałem napisać system w C++ ale przy większej ilości kodu jest to męcząco nie praktyczne :P. Do tego nie widziałem jeszcze kodu systemu napisanego w samym c, a jeśli był c++ używany to tylko do nie których zewnętrznych albo dopiero w kmain systemu ale wtedy był init_kernel który wszystko inicjował i tego kodu było znacznie więcej nisz w C++. W twoim przypadku widziałem że używałeś extern "C" to nie rozwiąże wszystkich problemów, to jedynie wyłącza wikłanie nazw i zmienia nieznacznie kod funkcji. A co do problemu skoro wszystko działa to najwidoczniej jest błędnie napisane sterowniki do ekranu albo niepoprawna mapa znaków, spróbuj zmienić znaki w mapie a jeśli to nie pomoże to wstaw kod obsługi ekranu bo te znaki co widziałem nie było ich w mapie a znaki do vga podaje się w 2-bajtach a nie jednym jak char to może tłumaczyć dlaczego wpisywało dwa znaki na ras. Jeśli to nie pomoże to mogę ci dać mój kod w starej implementacji. |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-03-08 15:26:05 sterownik ekranu działa dobrze - został wcześniej przetes towany |
|
MrPoxipol |
» 2014-03-08 16:19:53 @Brezniew, Dla przykładu Haiku jest napisane w C++ i wcale nie jest wolne.. (oprócz tego, że jest licencji OpenSource). PS Pisz po polsku. |
|
Brezniew |
» 2014-03-08 16:24:56 Daj kod kbdBuf i mosKbdToASCII.
@up Pisze po polski. |
|
Elaine |
» 2014-03-08 16:30:38 Chodzi oto np. jak używasz takich rzeczy jak new, delete itp. Kod w C++ jest często wolniejszy nisz kod w C w przypadku pisania systemu ze względu na wyższy poziom abstrakcji |
Gdzie tam.
A jeśli już potrzebujesz czegoś czego nie da zaimplementować w samym c to użyj asm inline, makra z asm-em bądź mechanizmów wbudowanych w kompilator takich jak __attribute__ , co jest o wiele wygodniejsze nisz w C++. |
Te same rozszerzenia GCC są dostępne i w C++. |
|
pekfos |
» 2014-03-08 16:34:25 "nisz" pisze się przez ż, a "nie których", "nie praktyczne", itp razem. |
|
1 « 2 » 3 |