zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« : Janeiro 08, 2010, 11:53:34 » |
|
Bom, eu sempre me interessei pelo desenvolvimento de drivers, mas nunca havia feito nada antes, e agora com o sombra que é bem simples da pra fazer algumas brincadeiras  Esses dias comecei a tentar escrever um de video para a cirrus, consegui fazer um mode-setting de várias resoluções mas estranhamente o sistema parava de responder e muitos outros problemas com o PCI... e no mais é mazoquismo escrever drivers para VGA's  então desisti e fui tentar algo mais simples. Comecei a escrever um do VESA, mas não queria ter que mudar pro modo real e depois voltar pro PM, tentei usar a vm86, tive muitos problemas para usar a combinação nos registradores ES:DI que as funções da INT 10 necessitam pra escrever os dados, só depois fui pensar em escrever estes dados no endereço baixo de 0x8000 onde o grub instala o stage2, bem poderia ser até outro mais baixo, mas este está bom, até porque posso copiar o dados de lá e escrever novamente depois que pegar os dados que me interessam, e o melhor é que não precisa ir até o modo real (quer dizer em partes xD vm86)... Aqui estão os primeiros resultados, consigo mostrar os modos, as informações, e fazer o mode-setting. Mas agora estou tendo problemas em escrever no Framebuffer (estou usando o modo linear), o framebuffer fica em 0xC0000000, mas mesmo que eu escreva lá não aparece nada na tela... Mostrando as informações:  Mostrando os modos:  Nem adianta mostrar com o modo ligado pois só aparece coisa preta xD Sobre o Framebuffer em 0xC0000000, tentei usar o page_map com um ponteiro mas ele não consegue alocar as páginas, se alguem tiver alguma idéia de como dá pra resolver isto...
|
|
|
|
|
Registrado
|
|
|
|
|
gnomo
|
 |
« Responder #1 : Janeiro 09, 2010, 10:59:09 » |
|
Olá! atualmente estou trabalhando em um Driver BGA(Bochs Graphics Adaptor) e outro VGA, no BGA também estou tendo problemas com o framebuffer, ja tentei até modificar o endereço nas configurações PCI do dispositivo e nada, provavelmente é problema no SOmBRA mesmo, portanto o BGA (com extensoes VBE) só esta usando o modo "banked" de memória até para resoluções como 1024x768x32, o que o deixa consideravelmente mais lento! Outra consideração quanto "a tela fica preta" é que o Bochs/Qemu(?) não inicia com a paleta de cores do DAC(Digital-Analog Converter) totalmente setada, me parece que só as 64 primeiras entradas (EGA), um erro que eu estava cometendo era justamente por causa disso, nos modos 8-bits, que necessitam dessa paleta de cores, eu tentava desenhar a tela totalmente branca para visualizar o resultado, ou seja, valor de pixel 0xFF, porém na paleta de cores só estava setado até a cor de valor 64, portanto o resultado que eu tinha na tela era uma tela totalmente preta!
Add, meu msn ai.
Abraços.
|
|
|
|
|
Registrado
|
|
|
|
|
gnomo
|
 |
« Responder #2 : Janeiro 09, 2010, 11:01:04 » |
|
Ah... quanto ao FrameBuffer e a paginação, semana que vem o Mounter volta das férias do SOmBRA, ele vai poder ajudar melhor, já que ele que esta elaborando a paginação.
|
|
|
|
|
Registrado
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #3 : Janeiro 10, 2010, 01:23:15 » |
|
Usando o modo de bankswitch o driver responde a escrita em 0xA0000, mas o fb que é bom não está funcionando de maneira alguma. Geralmente o fb está em 0xC0000000, mas o kernel é mapeado lá como está no script do ld, não sei se isto tem alguma relação, mas mesmo colocando o kernel em 0x80000000 não adiantou nada... Mas acho que o problema é a paginação, pois mesmo usando o page_map(0xC0000000,0xC000xxxx) e tentando escrever na tela não aparece nada, e usando o modo com ponteiro diretamente também não ocorre nada.
|
|
|
|
|
Registrado
|
|
|
|
|
Mounter
|
 |
« Responder #4 : Janeiro 10, 2010, 08:55:00 » |
|
Só para frisar, o page_map aloca um endereço virtual e não o endereço físico de memória, essa vai ser uma das funções que ainda devo fazer! Caso necessário, vou fazer isso imediatamente!
Só as páginas até os primeiros 1MB pode-se ter certeza que são alocadas de 1 para 1, então ali o endereço virtual == físico. Faltaria uma função page_map_vf(void *virt_addr, void *fisic_addr);
Em breve poderemos ter essa função, o certo seria libera-la somente para endereços especiais.
Abraços
|
|
|
|
|
Registrado
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #5 : Janeiro 14, 2010, 12:25:30 » |
|
Formatei meu pc pra colocar o windows 7, mas só depois lembrei que não tinha salvo o driver vesa (mas da pra reescreve-lo facilmente xD) e que o wubi não funciona no windows 7. Agora o desafio é compilar o sombra nele pois no ubuntu é muito fácil, mas aqui no windows tá difícil, estou baixando o cygwin pra tentar compilar...
|
|
|
|
|
Registrado
|
|
|
|
|
Mounter
|
 |
« Responder #6 : Janeiro 14, 2010, 10:17:53 » |
|
Você pode compilar o SOmBRA seguindo o tutorial que está na Wiki do Projeto. Abraços
|
|
|
|
|
Registrado
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #7 : Janeiro 16, 2010, 01:14:24 » |
|
Eu consegui compilar usando o sdk + cygwin, mas devo dizer que é lento (muito lento...) e isso é ruim pois sempre faço uma modificação tenho que recompilar e toma tempo, no ubuntu o processo era uma bala xD Mas resolvi parcialmente o problema, instalei o ubuntu 9.10 dentro de uma vm do virtualbox e está rodando liso, compila umas 7x mais rápido que no windows, essa velocidade usando toda a interface pesada do ubuntu, vou por um fluxbox e vamos ver no que dá.
|
|
|
|
|
Registrado
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #8 : Fevereiro 22, 2010, 04:31:15 » |
|
Agora sim, o problema era justamente a paginação, eu mesmo criei uma função pra mapear um endereço em 1:1, então pude escrever como bem entender na tela usando um framebuffer linear e em quantas cores quiser, não dá pra postar fotos agora pois estou numa lan house. Agora o próximo passo é criar uma estrutura para drivers de console, para poder criar um em vesa, algo parecido com o linux. Agora um coisa importante também é criar uma fonte descente xD pois eu criei uma 8x8 e 10x8, a 10x8 ainda fica bem legal com cores cinza, mas se por branco fica parecendo letras bold. E mais para frente seria legal criar um driver pro mouse xD Há, notei que quando tento usar a vm86 no qemu da sempre erro na int 0x20-0x21 ou causa exceção...no virtualbox e bochs está rodando bem, apesar do bochs acusar algo parecido com read_virtual_dword: segment violation... EDIT: 
|
|
|
|
« Última modificação: Fevereiro 25, 2010, 05:07:14 por zMad »
|
Registrado
|
|
|
|
|
Mounter
|
 |
« Responder #9 : Fevereiro 25, 2010, 05:39:45 » |
|
Opa, tudo certo zMad? Bom, esses erros deverão sumir com o tempo, ainda tenho que ver uma interface para gerenciar endereços físicos, até por questão de manipular DMA, e outros hardwares que nos entregam um endereço físico para acesso... No caso estava pensando em fazer uma alteração da função malloc e do free. Mas se alguem tem alguma proposta, podemos ver! EDIT: Quanto ao bochs o erro deve possivelmente vir dessa linha do código do emulador: http://bochs.sourceforge.net/cgi-bin/lxr/source/cpu/vm8086.cc#L93Pode ser que o mesmo erro esteja afetando o qemu... Eu imagino qual linha do SOmBRA está causando esse erro e vou checar se é ela mesma. EDIT 2: Muito boa a imagem, estou vendo que em breve poderemos ter uma interface gráfica no SOmBRA! Abraços
|
|
|
|
« Última modificação: Fevereiro 25, 2010, 05:47:33 por Mounter »
|
Registrado
|
|
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #11 : Fevereiro 25, 2010, 10:29:59 » |
|
#define PAGE_MAP_DEBUG 0
void page_map_phys(void *physaddr) { unsigned short pt_index, pd_index;
pagetab_t *pagetab;
#if PAGE_MAP_DEBUG printf("page_map_phys:\n"); #endif
pd_index = PAGE_GET_DIR(physaddr);
pt_index = PAGE_GET_TAB(physaddr);
#if PAGE_MAP_DEBUG printf("-- dir index %d\n", pd_index); printf("-- tab index %d\n", pt_index); #endif
if (!((*pagedir)[pd_index] & PAGE_PRESENT)) (*pagedir)[pd_index] = (frame_get() << 12) | PAGE_PRESENT_WRITE_USER;
#if PAGE_MAP_DEBUG printf("-- dir value 0x%08x\n", (*pagedir)[pd_index]); #endif
pagetab = PAGETAB(pd_index);
#if PAGE_MAP_DEBUG printf("-- phys 0x%08x\n", ((unsigned)physaddr)&0xfffff000); #endif
if (!((*pagetab)[pt_index] & PAGE_PRESENT)) (*pagetab)[pt_index] = (((unsigned)physaddr)&0xfffff000) | PAGE_GLOBAL | PAGE_PRESENT_WRITE_USER; }
Este código só mapeia uma página em 1:1, então você vai ter que calcular o número de páginas que o framebuffer e mapear uma por uma em seu devido endereço, coisa bem simples com um loop. Eu o fiz dá maneira abaixo: xres = vbemode.XResolution; yres = vbemode.YResolution; bpp = vbemode.BitsPerPixel;
buffersize = xres * yres * (bpp >> 3);
if (buffersize & 0xFFF) { buffersize &= ~0xFFF; buffersize += 0x1000; } pagesneed = buffersize / 4096;
printf("-- buffer size 0x%x\n", buffersize); printf("-- pages lfb %d\n", pagesneed); ptr = (unsigned short*)vbemode.PhysBasePtr; lfbptr = ptr; for (map = 0; map < pagesneed; map++) page_map_phys((unsigned*)(vbemode.PhysBasePtr + (map * 4096)));
Mais uma imagem: 
|
|
|
|
« Última modificação: Fevereiro 25, 2010, 10:55:00 por zMad »
|
Registrado
|
|
|
|
Bencz
OS Full Member
 
Karma: 0
Mensagens: 112
|
 |
« Responder #12 : Fevereiro 26, 2010, 06:46:43 » |
|
=o
Apelação suprema o.O =o
|
|
|
|
|
Registrado
|
|
|
|
|
gnomo
|
 |
« Responder #13 : Fevereiro 26, 2010, 03:02:53 » |
|
BGA Driver funcionando em modos com combinações de Width: 320, 400, 640, 800 e 1024; Height: 240, 300, 480, 600 e 768; e profundidades: 8, 16, 24 e 32 ! Todos nos modos banked com 64Kb ou no modo LFB (Linear Frame Buffer) com a memória requisitada pelo dispositivo PCI (no QEmu são requisitados 8MB para memoria de video que estou mapeando no endereço fisico entre 16MB e 24MB).
O driver funciona corretamente no QEmu e no Bochs, no VirtualBox.
zMad, obrigado pelo código da paginação. 
|
|
|
|
|
Registrado
|
|
|
|
zMad
OS Newbie
Karma: 1
Mensagens: 30
|
 |
« Responder #14 : Fevereiro 26, 2010, 03:50:14 » |
|
BGA Driver funcionando em modos com combinações de Width: 320, 400, 640, 800 e 1024; Height: 240, 300, 480, 600 e 768; e profundidades: 8, 16, 24 e 32 ! Todos nos modos banked com 64Kb ou no modo LFB (Linear Frame Buffer) com a memória requisitada pelo dispositivo PCI (no QEmu são requisitados 8MB para memoria de video que estou mapeando no endereço fisico entre 16MB e 24MB).
O driver funciona corretamente no QEmu e no Bochs, no VirtualBox.
zMad, obrigado pelo código da paginação. 
Agora seria legal criarmos uma estrutura do driver de video, e um console para framebuffer independente como no linux, aproveita e faz um teste ai com o mouse que você pos pra funcionar 
|
|
|
|
|
Registrado
|
|
|
|
|