18.5 Linux’de Portlara Erişim
18.5 Linux’de Portlara Erişim
Linux işletim sisteminde portlara erişmek için birkaç yol vardır. Burada, gcc derleyicisinin içine gömülebilen assemble dili kullanılarak oluşturulan port fonksiyonları gösterilecektir.
Linux’de ana kullanıcı (root) olmadıkça veya ana kullanıcı izin vermedikçe portlara erişmeniz mümkün değildir. Bu yüzden, önce programın portlara erişim izni verip vermediği sınanmalıdır. Bunun için, /usr/include/sys/io.h dosyası içinde tanımlı ioperm() fonksiyonu kullanılabilir.
Program 18.7 de basit bir port erişim programı verilmiştir. Kullanıcıların, programın başına ilave edebileceği başlık dosyaları için ayrıca bkz. Bölüm 20.
Program 18.7: Linux’de port erişimi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* 18prg07.c Linux işletim sisteminde portlara erişim */ #include <stdio.h> #include <stdlib.h> #include <sys/io.h> #include "linuxPort.h" int main() { int deger = 25; /* porta erişim izni var mı? sadece root ve onun izin verdiği kullanıcılar erişebilir ) */ if( port_erisim() ) exit(1); outportb(DATA, deger); printf("\n%X nolu adrese %d degeri yazildi.", DATA, deger); return 0; } |
17. satırdaki port_erisim() fonksiyonu ioperm() fonksiyonunu çağırıp erişim iznini denetler. port_erisim(), aşağıda verilen linuxPort.h dosyası içinde tanımlanmıştır.linuxPort.h bütün Linux tabanlı işletim sistemlerinde bulunan gcc derleyici ile kullanılabilir.
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/********************************************************************* ** ** ** linuxPort.h ** ** ** ** Linux işletim sisteminde kullanılabilecek port fonksiyonları ** ** ** ** Oluşturma tarihi: Haziran 2006 ** ** Enson güncelleme: Kasım 2008 ** ** ** *********************************************************************/ // // Standart PC için Port adresleri ------------------------------------ // #define DATA 0x378 #define STATUS 0x379 #define CONTROL 0x37A #define COM1 0x3F8 #define COM2 0x2F8 #define MCR 0x3FC // Modem Control Register (8 bit) #define MSR 0x3FE // Modem Status Register (8 bit) #define KEYB1 0x060 #define KEYB2 0x064 // // port erişim fonksiyonları ------------------------------------------ // Bu fonksiyonlar, gcc derleyicisinde <sys/io.h> dosyasında mevcuttur // void outportb(unsigned short port, unsigned char data) { __asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data)); } void outport(unsigned short port, unsigned short data) { __asm__ __volatile__ ("outw %1, %0" : : "dN" (port), "a" (data)); } unsigned char inportb(unsigned short port) { unsigned char rv; __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (port)); return rv; } unsigned short inport(unsigned short port) { unsigned short rv; __asm__ __volatile__ ("inw %1, %0" : "=a" (rv) : "dN" (port)); return rv; } // // erisim izinlerini kontrol et ------------------------------------- // int port_erisim(void) { int i, erisim = 0; /* paralel porta erisim izni var mi? */ for(i=0; i<=2; i++){ if (ioperm(DATA+i,1,1) ) { fprintf(stderr, "0x%X adresindeki porta erisim engellenmistir.\n", DATA+i); erisim++; } } /* seri porta erisim izni var mi? */ for(i=0; i<=6; i++){ if (ioperm(COM1+i,1,1) ) { fprintf(stderr, "0x%X adresindeki porta erisim engellenmistir.\n", COM1+i); erisim++; } } /* klavye portuna erisim izni var mi? */ if (ioperm(KEYB1,1,1) ) { fprintf(stderr, "0x%X adresindeki porta erisim engellenmistir.\n", KEYB1); erisim++; } if (ioperm(KEYB2,1,1) ) { fprintf(stderr, "0x%X adresindeki porta erisim engellenmistir.\n", KEYB2); erisim++; } if(erisim) printf("erisim # = %d\n",erisim); return erisim; } // // Seri port Haberleşme Ayarları ------------------------------------ // void com_ayarlari() { outportb(COM1 + 1 , 0x00); // Kesmeleri kapat - COM1 outportb(COM1 + 3 , 0x80); // DLAB açık outportb(COM1 + 0 , 0x03); // Aktarım hızı - Divisor Latch Low Byte outportb(COM1 + 1 , 0x00); // Aktarım hızı - Divisor Latch High Byte outportb(COM1 + 3 , 0x03); // 8 bit, parity yok, 1 dur biti outportb(COM1 + 2 , 0xC0); // FIFO Kontrol saklayıcısı } |