Comunidade OSDevBrasil.net
Maio 20, 2012, 03:37:03 *
Bem-vindo, Visitante. Por favor faça o Login ou Registro.

Login com nome de usuário, senha e duração da sessão
Notícias: Anuncie a nossa comunidade a amigos, fóruns...
 
   Home   Ajuda Pesquisa Login Registrar  
Páginas: [1]
  Imprimir  
Autor Tópico: Executar um código binario pelo kernel?  (Lida 441 vezes)
cianos
OS Newbie
*

Karma: 0
Mensagens: 8


Projetando o Futuro

ciano@ymail.com
Ver Perfil WWW Email
« : Dezembro 12, 2011, 04:07:49 »

 Sorridente Estou desenvolvendo um S.O. Baseando no Tutorial de James Molloy  http://www.jamesmolloy.co.uk/tutorial_html/index.html

Consegui implementar recurso de localizar arquivos em uma unidade de CD (usando Driver ISO 9660) e assim localizar meus arquivos executaveis, porém gostaria de saber como faço para executar estes arquivos que foram compilados em formato binarios igual a kernel.
Já tem o recurso de paginação e está preparado para o escalonamento, mas ainda não sei como executa-lo, uma vez que enviu ele para memoria corretamente.

Se alguém puder me ajudar, agradeço.

Estou ajustando algumas coisas, assim que o código estiver mais legível, irei postar as minhas soluções para enúmeros problemas.
Alias!
Pessoal Acordem!  O projeto SOMBRA, não pode parar. Por mais que a linha do meu S.O. está bastante diferente, é uma boa iniciativa que serve de base para novos conhecimentos e quem sabe um SuperS.O. que venha inovar uma nova filosofia de todos os paradigmas existentes. "Ops! Impolguei, rs!, gosto muito do Sombra e de toda ideiai!"



Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #1 : Dezembro 12, 2011, 09:07:38 »

Boa noite!

Respondendo a questão, você deve jogar o programa na memoria, interpretando os segmentos do seu executável e então saltar para a entrada dele, somente isso... Claro, parece simples, mas se quiser posso ajudar em algumas coisas. No SOmBRA está função se localiza em ELF.C, na pasta src/arch/x86

Off-topic: Só porque o site está um pouco parado não quer dizer que paramos, tem surpresas por vir, só ainda não tive tempo, e imagino que o resto do pessoal também... Mas férias chegando, terei tempo para fazer muita coisa!

Abraço
 Mounter
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

cianos
OS Newbie
*

Karma: 0
Mensagens: 8


Projetando o Futuro

ciano@ymail.com
Ver Perfil WWW Email
« Responder #2 : Dezembro 13, 2011, 09:52:44 »

Citar

>> #define Sub void
>> #define Function void*
>> #define Integer int

Código que carrega os dados do arquivo
pPos é a posição do setor onde está o arquivo

Sub iso9660_LoadFile(Integer pPos, char * MemoryLocal)
{

   int edi;
   char * buf   = (char *)malloc(2048);

   Integer conta=0,setores = 0,setor=0;
   Integer end_of_file_Sector = pPos +  ((Integer)(temp_Size_Lenght / 2048));

   //!printf("\n [%d -- %d] \n",Pos,end_of_file_Sector);
   setor = pPos; //obterSetDsc(setor);
   do{

        ide_read_sectors((CurrentUND-1),1,setor++,edi);
      buf = (char *)edi;

        for (conta = 0; conta < 2048; conta++)
        {
            MemoryLocal[(setores * 2048) + conta] = buf[conta];
        }
        setores++;
        if (setor >= end_of_file_Sector)  break;
    } while(1);
   //!free((unsigned)buf);
}

Aqui o problema!
Citar
Integer   iso9660_TESTE_RunnFile(PathDescritor *FileName)
{
   Integer Pos = iso9660_FindSector(FileName);
   if(Pos==0)
   {
      printf("Aplicacao nao Encontrada\n");
      return 0;
   }

   char * buffMemory =(char *)2000;

   iso9660_LoadFile(Pos,buffMemory);
   disableSIS();

   uint32_t eip=2000;

   asm volatile("         \
      mov %0, %%ecx;       \
      sti;                 \
      jmp *%%ecx           "
         : : "r"(eip));
   enableSIS();

   return 1;
}

o buffMemory consegue carregar o arquivo, o eip recebe uma determinada posição de memoria, nos meus testes o buffMemory consegue abrir um arquivo do tipo texto normal, exibindo os bytes e convertendo em string, mas no caso de um aquivo binario executavel eu tentei enviar executar desta posilção "2000" mas não vai. Já tentei paginação mas não funcionou.

No SOmBras vi que usam arquivos no formato ELF, para o meu problema seria mais fácil de resolver?


Registrado
Mounter
Administrador
OS Sr. Member
*****

Karma: 12
Mensagens: 432


mrjostz@hotmail.com
Ver Perfil WWW Email
« Responder #3 : Dezembro 13, 2011, 01:47:11 »

Posso te dar algumas dicas, mas pelo código não tem como determinar muito bem qual o problema...

Não é necessário fazer o mov de um registrador para outro, use ao invés de "r", se não me engano use "c" que o GCC faz mov para o ECX... te aconselho não usar o jmp sem antes remover da pilha o endereço de retorno da sua função iso9660_TESTE_RunnFile. Mas se for só de teste pode deixar... Antes do antes do jmp puxe para a pilha o endereço push $2000 e depois use um ret e vê se da certo.

asm("pushd $2000; ret;");

Tem várias questões que podem influenciar o código não funcionar. Verifique também se você já não está usando  o endereço 2000 para alguma outra coisa.

Abraço,
 Mounter
Registrado

╔╗╔╦══╦╗╔╦══╦╗
║╚╝║╔╗║╚╝║╔╗║║
║╔╗║╠╣║╔╗║╠╣╠╣
╚╝╚╩╝╚╩╝╚╩╝╚╩╝

Projeto SOmBRA - http://code.google.com/p/projeto-sombra

S.O.: Ubuntu 10.04
Browser: Google Chrome 10

Páginas: [1]
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006-2009, Simple Machines XHTML 1.0 Válido! CSS Válido!