Uso de inb, inl, inw para acessar o espaço do kernel a partir do espaço do usuário

1

Você poderia, por favor, me dar alguns exemplos de espaço de usuário usando inb, inl, inw para acessar o espaço do kernel no Ubuntu?

/ kanu

    
por Renjith G 18.01.2011 / 11:51

2 respostas

1

Essas funções (ou macros) são definidas em <asm/io.h> . Você precisa dizer ao gcc para -O otimizar o código para que eles fiquem inline (eu acho).

Para seu uso, digite

man inw

O Makelinux.net também tem um guia sobre como usá-los.

Não posso dar um exemplo, pois depende do hardware que você está usando, mas isso deve começar.

Se alguém estiver interessado, há também um módulo Python, portio , para fornecer a mesma funcionalidade.

    
por Stefano Palazzo 18.01.2011 / 13:41
1

Para usar comandos de porta IO (entrada / saída), você precisa executar como root e ter acesso reservado através da chamada ioperm (): link

Se isso for beep.c :

/* Copyright 2011, Kees Cook <[email protected]>, License: GPLv2 */
#include <unistd.h>
#include <stdio.h>
#include <sys/io.h>

int main()
{
   unsigned char orig, bits;

   /* gain access to speaker control port */
   if (ioperm(0x61, 0x61, 1) < 0) {
       perror("0x61");
       return 1;
   }
   /* gain access to speaker frequency port */
   if (ioperm(0x42, 0x42, 1) < 0) {
       perror("0x42");
       return 2;
   }

   /* turn on speaker */
   orig = bits = inb(0x61);
   bits |= 3;
   outb(bits, 0x61);

   /* set 1000 Hz frequency */
   bits = 0xA9;
   outb(bits, 0x42);
   bits = 0x04;
   outb(bits, 0x42);

   /* listen to the beep */
   sleep(1);

   /* restore speaker bits to turn off speaker */
   outb(orig, 0x61);

   return 0;
}

$ faça um sinal sonoro

$ sudo ./beep

    
por Kees Cook 24.07.2011 / 20:23