elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Direccion Hrdware
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Direccion Hrdware  (Leído 3,249 veces)
Riki_89D


Desconectado Desconectado

Mensajes: 851


BCN CITY


Ver Perfil
Direccion Hrdware
« en: 28 Abril 2011, 12:38 pm »

Hola que tal,nose si esto va aqui,la pregunta es clara,como puedo saber la direcicon de memoria de cada periferico del PC para Escribir/Leer mediante programacion ?¿ (En este caso ASM)


En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Direccion Hrdware
« Respuesta #1 en: 29 Abril 2011, 14:32 pm »

puedes hacerlo de 2 maneras, preguntándole al SO o enumerando los dispositivos conectados al bus-PCI y USB

La primera depende del SO en el que estés, con la otra es cuestion de usar las instrucciones in out para comunicarte con el Hardware


En línea

Riki_89D


Desconectado Desconectado

Mensajes: 851


BCN CITY


Ver Perfil
Re: Direccion Hrdware
« Respuesta #2 en: 29 Abril 2011, 15:02 pm »

Hola mil gracias :) me decantare por la segunda,pero me porias explicar un poco mejor,que debo ir probando con IN y OUT?¿ :S,y por cierto hace un tiempo pregunte como acceder al Mouse cuano se esta booteando,pense que se aria desde el BIOS y efectivamente,encontre ayer la interrupcion 15h y la funcion c2h (creo),pero una persona me dijo,no se usan la int del BIOS,se accede al hardware directamente con IN y OUT,es eso cierto ?¿


saludos y mil gracias  :)
En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Direccion Hrdware
« Respuesta #3 en: 29 Abril 2011, 20:17 pm »

yo solo se lo del PCI, que te servira para la mayorria del hardware.

Al hardware se le suelen asignar unas direcciones de I/O o tambin de memria. pueden ser estáticas o variar.

Se enumeran asi:
Código
  1. #define outb(port,value) \
  2. __asm__ __volatile__("outb %%al,%%dx"::"a" (value),"d" (port))
  3.  
  4. #define inb(port) ({\
  5. unsigned char _v; \
  6. __asm__ __volatile__ ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
  7. _v; \
  8. })
  9. #define outw(port,value) \
  10. __asm__ __volatile__("outw %%ax,%%dx"::"a" (value),"d" (port))
  11.  
  12. #define inw(port) ({\
  13. unsigned short _v; \
  14. __asm__ __volatile__ ("inw %%dx,%%ax":"=a" (_v):"d" (port)); \
  15. _v; \
  16. })
  17. #define outd(port,value) \
  18. __asm__ __volatile__("outl %%eax,%%dx"::"a" (value),"d" (port))
  19.  
  20. #define ind(port) ({\
  21. unsigned long _v; \
  22. __asm__ __volatile__ ("inl %%dx,%%eax":"=a" (_v):"d" (port)); \
  23. _v; \
  24. })
  25.  
  26. #define PCI_CONFIG_ADDRESS 0xCF8
  27. #define PCI_CONFIG_DATA 0xCFC
  28. //Las direcciones del espacio PCI estan compuestas de esta manera
  29. typedef struct PCI_ADDRESS{
  30. union {
  31. struct {
  32. unsigned long zero:2;
  33. unsigned long Registro:6;//Numero de registro del espacio PCI de un dispositivo
  34. unsigned long Funtion:3;
  35. unsigned long Device:5;
  36. unsigned long Bus:8;
  37. unsigned long Reserved:7;
  38. unsigned long Enable:1;
  39. }flag;
  40. unsigned long ADDRESS;
  41. };
  42. }PCI_ADDRESS;
  43. typedef struct HARDWARE_ID{
  44. union{
  45. struct {
  46. unsigned long vendor;
  47. unsigned long device;
  48. };
  49. unsigned long id;
  50. };
  51. }HARDWARE_ID;
  52.  
  53.  
  54. void PCI_Enum(){
  55. PCI_ADDRESS Addr;
  56. HARDWARE_ID ID;
  57. Addr.ADDRESS = 0;
  58. ID.id = 0;
  59. Addr.flag.Enable = 1;
  60.  
  61. for(short bus = 0;bus<256;bus++){//Busca en un numero de bus los dispositivos, hay 256 posibles
  62. //Cada bus tiene al menos un dispositivo y 32 de maximo
  63. for(short dev = 0;dev<32;dev++){//Busca en un bus los dispositivos
  64. //Cada dispositivo puede tener una o hasta 8 funciones diferentes
  65. for(int fun = 0;fun<8;fun++){//La funcion 0 siempre estara disponible, sino el dispositivo no esta
  66. Addr.flag.Funtion = fun;
  67. Addr.flag.Device = dev;
  68. Addr.flag.Bus = bus;
  69.  
  70. outd(PCI_CONFIG_ADDRESS,Addr.ADDRESS);
  71. ID.id = ind(PCI_CONFIG_DATA);
  72. if(!(ID.vendor+1)){//Si el vendor es 0xFFFF significa que esa funcion no esta presente
  73. if(!fun)break;
  74. }else{
  75. printf("Detected: PCI\VEND_%X04&DEV_%X04\n",ID.vendor, ID.device);
  76. };
  77. }
  78. };
  79. }
  80.  
  81. };
  82.  
  83.  
busca en esta pagina lo que necesites: http://wiki.osdev.org/PCI#Configuration_Space
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines