Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

27.10.2011, 18:36

DMA - BIOS - /dev/mem

Tag Experten.

Eigentlich keine gentoo Thema, deshalb stelle ich es im Laberecke.

Kann man beim laufendem Betrieb etwas mir BIOS machen (aendern) ?
An BIOS daten ich komme z b so ran , leider nur im lese-Modus.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8
...
Memory parity
ECC memory error
 Type (S)hut off NMI,
Entering Setup    
Phoenix ROM BIOS PLUS Version 1.10 A01
www.dell.com
...
OptiPlex GX520
OptiPlex GX520Dell System GX520Dell System 
BIOS version 
...
cDELL  GX520  
DELL  GX520  
DELL  GX520  
... 

oder auch mit dmidecode , der auch geht an /dev/mem
http://download.savannah.gnu.org/releases/dmidecode/

Sagen wir, ich weiss ganz genau was ich tue mit BIOS [oder auch nicht] ;)

Hat jm idee wie kann man(n) mit C userspace program [wenn ueberhaupt]
an BIOS direkt zugreifen, lesen und auch etwas im BIOS veraendern ?
Oder muss man fuer solches Zugriff ein Module schreiben ?

Jede Idee wilkommen und vielen dank @ alle im voraus .

2

02.11.2011, 13:39

Nun es geht doch im Userspace, man braucht kein Module.
Man kann auch Datum Zeit und einges mehr direkt auslesen, ohne irgend welche /dev/mem dev/rtc ...
Wenn jm hat interesse hier ist kleines Prograam fuer BIOS NumLock einstellungen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* gcc  cmos-write-numlock.c  -o cmos-write-numlock  -Wall */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//#include <asm/io.h> // ?? fuckin ubuntu 11.10 ??
#include <sys/io.h>
#define CMOS_PORT_ADDRESS 0x70
#define CMOS_PORT_DATA    0x71

char * char2bin(unsigned char c2bs);

// outb(val, prt)
int main(int argc, char *argv[])
{
unsigned char port0x71val, portsetval/*, bitmask=0xFF*/;
int turn_nl_on = 0;

   printf( "\nSET NUM LOCK IN DA BIOS\n-----------------------\n" );

   if (ioperm(CMOS_PORT_ADDRESS, 2, 1))  //  Port permission set 1    for ports 0x70 and 0x71
   {   perror("ioperm");  exit (1);
   } //outb(val, port)

    outb( 0x11,CMOS_PORT_ADDRESS );     port0x71val = inb( CMOS_PORT_DATA );
    printf( "offset 0x11 -%s- = 0x%02x\n" ,char2bin(port0x71val) , port0x71val );
    if( (port0x71val & (unsigned char)0x01) == (unsigned char)0x01 ) {  printf( "Numlock bios ON\n"  );  }
    if( (port0x71val & (unsigned char)0x01) == (unsigned char)0x00 ) {  printf( "Numlock bios OFF\n"  );  }


   if( (argv[1][0]=='o') && (argv[1][1]=='n') ){  printf("set ON\n");  turn_nl_on = 1;  }
   else{ if( (argv[1][0]=='o')&&(argv[1][1]=='f')&&(argv[1][2]=='f') ){  printf("set OFF\n");  turn_nl_on = 0;  }
         else{  printf("Usage :\n%s  on|off|testonly\n\n",argv[0]);  goto permission0;  }
   }    

   if(turn_nl_on == 1){   portsetval = port0x71val | 0x01; }  // set bit 0 to 1
   else{                  portsetval = port0x71val & 0xFE; }  // clr bit 0 to 0
       printf( "offset 0x11 -%s- = 0x%02x\n" ,char2bin(portsetval) , portsetval );
// NUMLOCK byte offset 11  bit 0
// value (bitmask) [*][*][*][*] [*][*][*][*][1|0]  =  AND 0xff 0xfe
  unsigned char porttmp =  inb(CMOS_PORT_ADDRESS);
//  printf( "inb[%x] = %02x\n" , CMOS_PORT_ADDRESS , porttmp );
  outb( (porttmp & 0x80) | (0x11 & 0x7F) , CMOS_PORT_ADDRESS ) ;
  outb( /*0x15*/portsetval, CMOS_PORT_DATA );
  printf( "inb[%x] = %02x\n" , CMOS_PORT_ADDRESS , porttmp );


permission0:
  if (ioperm(CMOS_PORT_ADDRESS, 2, 0))  // Port permission set 0
  {  perror("ioperm");  exit(1);  }
        //exit (0);
    return 0;
}  // main()



char * char2bin(unsigned char c2bs)
{  static char buffa[9];  int i;
   for(i=0;i<8;i++) {  if( ((c2bs>>(7-i))&1) == 1){ buffa[i]='1'; }else{ buffa[i]='0'; }   }
  return & buffa[0];
}

3

02.11.2011, 18:50

Interessting ... ioperm und outX.

Hast du einen Link was man so auf Port 0x70 und 0x71 alles so anstellen kann?
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>