sp0oks / sys_info

A general system information syscall project for the Linux Kernel

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Introdução

Para este projeto implementamos a syscall sys_info(), que dependendo da opção passada no argumento pode retornar:

  • OPT_UNAME(nome e versão do Kernel atual, nome do host, arquitetura do sistema)
  • OPT_PID(PID e PPID do processo atual)
  • OPT_UID(UID e EUID do processo atual)
  • OPT_RUSAGE(Informações do tempo total de execução do processo atual e dos processos filhos)
  • OPT_ALL(todas as opções acima)

Todas as informações pedidas são retornadas numa struct info_t, que pode ou não ter todos seus campos completos dependendo da opção pedida.

O protótipo da função é: long sys_info(int opt, info_t buffer) Onde opt é uma das opções listadas anteriormente, buffer é uma struct info_t onde os dados pedidos serão salvos, e o valor de retorno é o valor de erro que eventualmente pode ocorrer.

Para implementação do trabalho, utilizamos o Kernel Linux versão 3.17.2, e a imagem de sistema DC_SO.img fornecida em aula.

Execução dos exemplos

Pra montar os exemplos basta executar:

cd sys_info
make examples

Instruções de instalação e execução

Apesar de não ter sido informado no enunciado do trabalho, é necessário compilar o kernel com o compilador gcc-5, caso contrário não é possível compilar. Para isto, baixe o pacote gcc-5 ou similar na sua distribuição Linux e altere todos os termos gcc para gcc-5 em linux-3.17.2/Makefile.

Para testar a implementação da syscall, realizamos os seguintes passos:

  1. Descompactar o arquivo Projeto_01.zip, que contém o kernel e a imagem do sistema e colocar os arquivos test_info.c e sys_info.h na pasta gerada.

  2. Modificar o arquivo linux-3.17.2/arch/x86/syscalls/syscall_32.tlb, adicionando a seguinte linha ao final do arquivo:
    357 i386 info sys_info

  3. Adicionar a declaração da função sys_info e do struct info_t no arquivo linux-3.17.2/include/linux/syscalls.h:

    #include <linux/utsname.h>
    
    typedef struct {
    struct new_utsname unameData;
    pid_t pid, ppid;
    uid_t uid, euid;
    struct rusage rusageSelf, rusageChildren;
    } info_t;
    
    asmlinkage long sys_info(int opt, info_t *buf);
  4. Incluir o código info.c no diretório linux-3.17.2/arch/x86/kernel/.

  5. Modificar o Makefile da pasta linux-3.17.2/arch/x86/kernel/, para que o nosso arquivo info.c seja compilado com o kernel, incluindo a linha:
    obj-y += info.o

  6. Acessar a pasta linux-3.17.2/ e compilar o kernel, com o comando:
    $ make -j 5 ARCH=i386

  7. Após isso, compilar o código de teste test_info.c com o comando:

    $ cd sys_info
    $ make test
  8. Executar a máquina virtual para testar a implementação da syscall no kernel alvo, utilizando o comando:
    $ qemu-system-i386 -hda DC_SO.img -kernel linux-3.17.2/arch/i386/boot/bzImage -append "ro root=/dev/hda" -hdb test_info

  9. Logar no sistema com as credenciais:
    user:root
    password:root

  10. Executar os seguintes comandos para teste da syscall:

    $ cat /dev/hdb > test_info 
    $ chmod +x test_info
    $ ./test_info

Realizado pelos alunos:

  • Bianca Garcia Martins
  • Gabriel de Souza Alves
  • Giulia Mazzutti Teixeira

About

A general system information syscall project for the Linux Kernel

License:MIT License


Languages

Language:C 91.4%Language:Makefile 8.6%