Dark Sorcering in C: utilizando bit-fields

July 30th, 2009

Mais um post programador-geek-útil: bit-fields. Para quem não conhece, em C pode-se criar coisas “bizarras” do tipo estruturas com campos de tamanho 1, 2 ou n bits. Sim, eu não me enganei. É isso mesmo o que tu entendeu. Em C podemos criar estruturas com campos de apenas 1 bit, por exemplo. Aliás, por sinal, tu pode até mesmo criar uma estrutura com apenas 1 bit.

“Mas como isso?” tu te pergunta. É mais fácil do que parece. Basta declarar a estrutura e, para cada campo, dizer quantos bits tu quer. Simples assim:

struct byte_t {
    unsigned char high: 4;
    unsigned char low:  4;
};

Neste caso, estamos declarando uma estrutura com dois campos, cada um com 4 bits. Viram como é simples? Neste caso, nossa estrutura terá o tamanho de 8 bits, 1 byte no final das contas. Mas nada me impede de declará-la assim:

struct bit_t {
    unsigned char val: 1;
};

Agora temos uma estrutura de apenas 1 bit de tamanho! Faça o teste: tente colocar algo mais do que 0 ou 1 no campo val da estrutura para ver se o GCC não reclama com um warning!

Algo que preciso lembrar é que o comando sizeof() não irá funcionar para a estrutura bit_t. Porque? Ora, é óbvio. A função sizeof() retorna seus valores em bytes e não em bits. Já para a estrutura byte_t, nós conseguimos executar o sizeof(), já que seu tamanho é de exatamente 1 byte.

Update: como comentado pelo meu amigo Fabio Utzig, o tamanho das estruturas em si serão arredondadas para a representação. Por exemplo, caso eu adicione mais um campo na estrutura byte_t, mesmo que seja de um bit apenas, o tamanho total da estrutura será 2 bytes, pois ele arredonda o tamanho. Os campos em si que sempre terão o tamanho em bits especificado.

Minix 3 Adventures: fazendo funcionar a rede no VirtualBox

May 31st, 2009

Neste semestre, estou fazendo a cadeira de Projeto de Sistemas Operacionais na faculdade. Por opção, resolvi (em conjunto com alguns colegas) usar o Minix 3 como sistema operacional de estudos. Instalei ele, feliz da vida, numa máquina virtual do VirtualBox. O problema é que a rede não queria de jeito nenhum funcionar! A princípio deveria funcionar, escolhi o driver certo na instalação (AMD Lance, emulado pelo VMWare e pelo VirrtualBox), mas não funcionava. Depois de muito pesquisar, consegui fazer funcionar. Aqui vão as dicas!

Depois de completada a instalação do Minix 3, reinicie o sistema (não esqueça de botar no VirtualBox para ele não montar o cdrom do Minix3) e execute primeiramente estes passos:

  1. Com o sistema reiniciado, coloque a imagem do CD do Minix 3 de volta.
  2. Como root, execute “packman”.
  3. Procura o número do vim, para instalá-lo do CD… ;-P
  4. Cuidado para não deixar ele tentar atualizar a lista de arquivos da internet (o que tu não tem ainda… hehehehe…)

Estes foram somente os passos para instalar o vim… hehehehe… Os passos que segui para fazer a rede funcionar no Minix 3 foram estes:

  1. Edite o arquivo “/usr/etc/rc” (com o vim).
  2. Vá para a linha 82; ela diz “Starting services:”.  Vá para a  próxima linha;  ela começa com “up random”.
  3. Aperte “v” (para entrar em modo visual) e vá selecionando até o primeiro “fi” que tu encontrar.
  4. Recorte estas linhas.
  5. Agora, vá até a linha que diz “up inet”.
  6. Cole as linhas que tu copiaste logo em cima desta linha.
  7. Vá para baixo, até onde diz “intr -t 20 hostaddr -h” (use o “/” do vim).
  8. Mude o “20″ para “30″

Esta é a primeira parte da solução… hehehehe… Agora vamos para o kernel…

  1. Dá um cd /usr/src/drivers/lance
  2. vim lance.c
  3. A partir da linha 632, edite da forma como segue.
  4. Comente as seguintes linhas:
  5. if (ec->ec_linmem != 0)
    {
        assert( 0 );
        /*phys2seg(&ec->ec_memseg, &ec->ec_memoff, ec->ec_linmem);*/
    }
     
    /* XXX */ if (ec->ec_linmem == 0) ec->ec_linmem= 0xFFFF0000;
  6. E adicione a seguinte linha:
  7. ec->ec_linmem= 0xFFFF0000;
  8. Salve o arquivo e saia do vim.
  9. Vá até a pasta /usr/src/ e execute o seguinte comando:
  10. # make world

  11. Vai demorar uns 15 ou 20 minutos, aproveite para tomar um cafézinho…
  12. Reinicie o Minix 3 (não esqueça de desmontar a imagem do cdrom do VirtualBox…).
  13. Depois de reiniciado, dê um ps ax | grep lance.
  14. Com o PID do driver de rede (provavelmente, será 55), nós vamos nos aproveitar do Reincarnation Server do Minix 3 e matar o processo do driver de rede. Sim, isso mesmo:
  15. # kill -9 55

  16. O RS vai verificar a morte do processo driver e reiniciá-lo, agora sim a rede vai estar funcionando 100%.

O único problema é que toda a vez que reiniciarmos o sistema teremos que executar o comando kill. Mas, por mim, tá tudo bem. ;-)

Tibia on Wine – finalmente algo que funciona…

May 17th, 2009

É… Quero dizer… Hmmm… Digamos meia boca… Como prometi há algum tempo atrás (bota tempo atrás), estou disponibilizando aqui um meio fácil de “botar para funcionar” o Tibia com o Wine. Só os resultados deixaram a desejar um tanto… =/ O melhor DirectX que ele conseguiu compatibilidade foi o 5, portanto os gráficos ficaram bem ruinzinhos e sem opções de “sombra”. O que deve ser feito para o Tibia funcionar com o Wine é alterar os registros dele. Como se fosse um Windows mesmo, o Wine tem seu regedit. Para acessá-lo, basta executar o seguinte comando no terminal:

$ regedit

Isto irá abrir, com o Wine, uma janela como a qual já devemos conhecer do Windows (pelo menos aqueles que gostam de brincar com o editor de registros… =P). Com a janela aberta, expandimos o HKEY_CURRENT_USER->Software->Wine->Direct3D. Dentro desta pasta devemos modificar o seguinte registro: DirectDrawRenderer. O valor dela deverá ser alterado para “gdi” (sem as aspas, é claro). Para alterar o valor do registro, basta clicar com o botão direito em cima do registro, clicar em modificar e alterar o campo “Dados do valor”. Caso não exista nenhum registro dentro de Direct3D, basta adicioná-lo, clicando no botão “Editar”, na barra de menu, selecionar “Novo->Valor Texto”. Altere o nome do registro para DirectDrawRenderer e, após isso clique com o botão direito em cima do registro recém criado, clique em Modificar e altere o valor do campo para “gdi”. Pronto. Na próxima vez que o Tibia for aberto com o Wine, tudo deverá funcionar corretamente. ;-)

Pelo Wine, conseguimos até apenas o DX5, o que faz percebermos grande perda de qualidade.

Pelo Wine, conseguimos até apenas o DX5, o que faz percebermos grande perda de qualidade.

Debian irá suportar kernel FreeBSD

May 8th, 2009

Esses dias atrás (na real, já faz umas semanas), eu descobri que o Debian irá suportar o kernel FreeBSD. Achei muito bom, já que torna o Debian cada vez mais num SO realmente universal. Mas isso não implica que o Debian deixará de possuir o kernel Linux: apenas o usuário poderá escolher entre os dois kernels qual o melhor para o seu caso. Eu confesso que estou ansioso para testar esta nova opção do Debian. Para mais informações, dêem uma olhada no link abaixo.

http://lists.debian.org/debian-devel-announce/2009/04/msg00001.html

Neste mail da lista do Debian é dito que o kernel está disponível na versão instável do Debian, mas, dando um aptitude search kfreebsd no Squeeze (atual versão testing), percebe-se que os fontes já se encontram lá para serem baixados e compilados.

Primeiro post de utilidade pública: sobre USB 1.1 e Linux

March 28th, 2009

Há muito tempo atrás, eu vinha comentando que existia um problema com o kernel do Linux e minhas entradas USB. Pois bem, depois de algumas atualizações o problema voltou a ocorrer, mesmo para a versão 2.6.24. Não sei mais o que fazer. Minha expectativa é que algum dia isso seja corrigido, mas não sei quando. Enquanto isso, aquela máquina fica com o Windão rodando (bleh), mas que pelo menos não apresenta crises existencias com o USB. Claro, mantenho o Linux instalado lá e, periódicamente, tenho atualizado com a esperança de que o bug seja corrigido. Ainda tenho planos de corrigir por mim mesmo o bug, mas anda meio complicado, com todos os trabalhos da faculdade e o fato de que, depois de cai o USB, cai a rede…. Mas vamos ver. ;-) Quem sabe, eu instale o Debian Sarge nele que, se não me engano, tem kernel 2.4, que funciona tranqüilo.

Novo blog!

March 28th, 2009

Agora, com este novo blog, tenho os planos de postar mais. Em breve, colocarei aqui curiosidades, informações, dicas e bizarrices do mundo da computação. Ou do que “der na telha” mesmo… XD

Aguardem!

Modificando a versão de append local de um kernel já compilado no linux

July 15th, 2008

Bem, ando meio desaparecido do blog, mas aqui volto com uma dica. É algo que agora a pouco passei e tive que me virar para resolver. No Debian, existe uma maneira fácil e rápida de se compilar o kernel: é o comando make-kpkg. A utilização dele é simples. Primeiro, executa-se o seguinte comando, na pasta onde se encontra o kernel:

# make menuconfig

Este comando abrirá uma interface colorida para configuração do kernel a ser compilado. Altere a seu gosto, mas com cuidado. Não vou entrar em detalhes sobre como configurar o kernel para sua máquina aqui pois não é este o objetivo do artigo, mas recomendo executar alguns lspci, e buscar informações na internet (leia-se Google :-) ) caso tenha que configurar algo em especial. Em geral, o kernel já vem com uma configuração por padrão que atende a maioria dos casos. Sempre existe a possibilidade de se copiar o arquivo de configuração do kernel (na pasta /boot) atual para o arquivo .config dentro da pasta onde está o kernel, e se executar um make oldconfig, mas cuidado, pois alguns módulos podem mudar de nome de uma versão para outra e isso pode trazer problemas. Enfim, voltando ao contexto original, na tela de configuração do kernel, entre em “General Setup”, na opção “Local Version”, digite um nome para ser adicionado à versão do kernel. Saia da tela e execute o seguinte comando:

# make-kpkg –initrd linux-image

Este comando gerará na pasta /usr/src um arquivo .deb que pode ser instalado através do comando:

# dpkg -i <arquivo>.deb

Eu já tinha seguido esses passos a um tempo atrás para compilar o kernel 2.6.24 no meu Debian, mas hoje me deparei com um problema: eu queria modificar o valor que é adicionado à versão do kernel. Este problema pode ser resolvido apenas movendo a pasta debian de dentro da pasta do kernel que tu estás compilando para um outro nome ou outro lugar. Após isso, basta executar o make-kpkg e o dpkg -i normalmente que tudo deverá transcorrer tranqüilamente.

Teclados USB, entradas USB 1.1 e Linux: a saga chega a seu fim!!

March 30th, 2008

Depois de uns tempos sem postar nada no blog, hoje eu venho com uma ótima notícia para aqueles que tiveram problemas como o meu. Num artigo que publiquei aqui no blog e no VOL (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6607), eu apresentei uma solução ao problema de IRQ #11 Disabled do kernel, para as entradas USB 1.1. Por algum motivo misterioso, o kernel desbilitava as interrupções de USB e meu teclado não funcionava corretamente. Enfim, não vou expor a história inteira aqui, já que pode ser lida no artigo.

A boa notícia é que a nova versão do kernel, a versão 2.6.24, corrige este problema! Nesta versão, os caras que mantém o kernel jogaram bastante coisa antiga fora e reescreveram boa parte do código. Agora, as portas USB 1.1 funcionam corretamente e o kernel não desbilita as interrupções, mantendo o teclado funcionando perfeitamente! Sinceramente, fizeram um ótimo trabalho no kernel 2.6.24, até o desempenho da máquina ficou melhor com relação às versões anteriores.

Instalando Debian usando interface gráfica

November 7th, 2007

Não é padrão do instalador netinst (CD reduzido com o sistema básico, baixa e instala o restante do software da internet) do Debian, mas existe a possibilidade de usar uma interface gráfica em GTK para fazer a instalação.

No momento do boot do CD netinst, o Debian pergunta sobre a forma de boot (podendo simplesmente apertar enter e entrar no instalador padrão), digita-se o texto installgui, pressiona-se enter e o instalador irá carregar uma interface gráfica bonitinha e até de certa forma intuitiva para a instalação.

Para se obter uma lista mais completa sobre as formas de boot do netinst, pressiona-se <F1> e, na lista de opções, escolha algo como “formas de boot do instalador” ou algo parecido.

Achei massa, apesar de preferir a interface de instalação padrão. Acredito que funcione também para o businesscard.

Geek

October 26th, 2007

Orgulhoso de ser geek…. ^^

63% Geek

JustSayHi – Dating