Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Владимир Мешков
В данной статье на примере решения простой задачи – определения MAC-адреса сетевой карты – рассмотрена реализация низкоуровневой поддержки (low-level support) шины PCI в ядре операционной системы Linux.
Постановка задачи и исходные данные
Исходные данные – имеется компьютер, функционирующий под управлением ОС Linux, версия ядра 2.4.24. В PCI-слот установлен сетевой адаптер на чипсете RTL8139C (далее – адаптер RTL8139C).
Задача – определить MAC-адрес этого адаптера.
Путей решения этой задачи несколько. Можно воспользоваться командами dmesg или ifconfig:
root@bob~/# dmesg | grep eth0
eth0: RealTek RTL8139 at 0xc000, 00:02:44:72:5e:4e, IRQ 11
eth0: Identified 8139 chip type 'RTL-8100B/8139D'
root@bob~/# ifconfig | grep eth0
eth0 Link encap:Ethernet HWaddr 00:02:44:72:5E:4E
Можно написать небольшое приложение следующего вида:
/* get_mac.c */
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
int main() {
int fd;
struct ifreq ifr;
unsigned char mac[6];
fd=socket(AF_INET,SOCK_DGRAM,0);
memset(&ifr,0,sizeof(struct ifreq));
memcpy(ifr.ifr_name,"eth0",4);
ioctl(fd,SIOCGIFHWADDR,&ifr);
memcpy(mac,(char *)&(ifr.ifr_hwaddr.sa_data),sizeof(struct sockaddr));
printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x ",
mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
return 0;
}
Можно извлечь MAC-адрес из самого адаптера RTL8139C. Рассмотрим, как это делается.
Согласно спецификации на сетевой адаптер RTL8139C, MAC-адрес занимает первые 6 байт в пространстве портов ввода/вывода (I/O), отведенного адаптеру. Задавая смещение относительно базового порта I/O, можно прочитать все 6 байт MAC-адреса.
Пример функции, выполняющей процедуру чтения MAC-адреса, приведен ниже: