GCC Inline Assembler & Bios Interrupts

Тема в разделе "WASM.OS.DEVEL", создана пользователем Robotex, 20 окт 2008.

  1. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    Есть код, помогите до ума довести. Нужна функция для чтения сектора диска в LBA режиме с помощью прерываний. Вот наклепал немного, но знаний пока не хватает, чтобы самому доделать... А функция нужна срочно...

    Код (Text):
    1. #include <stdio.h>
    2.  
    3. #define FP_SEG(fptr) ((unsigned)((unsigned long)(fptr) >> 16))
    4. #define FP_OFF(fptr)    ((unsigned)(fptr))
    5.  
    6. #define BYTE unsigned char
    7. #define WORD unsigned short
    8. #define DWORD unsigned int
    9.  
    10. #define SECTOR_SIZE 512
    11.  
    12. struct disk_packet //needed for int13 42h
    13. {
    14. BYTE size_pack; //size of packet must be 16 or 16+
    15. BYTE reserved1; //reserved
    16. BYTE no_of_blocks; //nof blocks for transfer
    17. BYTE reserved2; //reserved
    18. WORD offset; //offset address
    19. WORD segment; //segment address
    20. DWORD lba1;
    21. DWORD lba2;
    22. } disk_pack;
    23.  
    24. void LBASectorRead(void *buffer/*, unsigned long lba */)
    25. {
    26. unsigned char bError = 0;
    27. disk_pack.size_pack=16; //set size to 16
    28. disk_pack.no_of_blocks=1; //1 block ie read one sector
    29. disk_pack.reserved1=0; //reserved word
    30. disk_pack.reserved2=0; //reserved word
    31. disk_pack.segment=FP_SEG(buffer); //segment of buffer
    32. disk_pack.offset=FP_OFF(buffer); //offset of buffer
    33. disk_pack.lba1=0; //lba first 32 bits
    34. disk_pack.lba2=0; //last 32 bit address
    35.  
    36. asm(".intel_syntax noprefix \n\t"
    37.     "mov dl, 0x80 \n\t"
    38.     "mov %1, ds \n\t"
    39.     "mov si, %3 \n\t"
    40.     "mov ah, 0x42 \n\t"
    41.     "int 0x13 \n\t"
    42.     ".att_syntax noprefix \n\t");
    43.  
    44. /*_asm
    45. {
    46. mov dl, 80h;
    47. mov [disk_pack.segment], ds;
    48. mov si, disk_pack;
    49. mov ah, 42h;
    50. int 13h
    51. jc NoError ; //No error, ignore error code
    52. mov bError, ah ; // Error, get the error code
    53. NoError:
    54. }
    55.  
    56. printf( "%d", bError);*/
    57.  
    58. }
    59.  
    60. void PrintSector(char * buffer)
    61. {
    62.   int i;
    63.   for(i = 0; i < SECTOR_SIZE; i++)
    64.   {
    65.     printf("%d ", *(buffer+i));
    66.     if((i+1)%12==0) printf("\n");
    67.   }
    68.   printf("\n");
    69. }
    70.  
    71. int main(void)
    72. {
    73. static unsigned char currentMBR[SECTOR_SIZE] = {0};
    74. printf("\n\n");
    75. LBASectorRead(&currentMBR );
    76. PrintSector(currentMBR); //function to print buffer in hex
    77. }
     
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    http://xskernel.svn.sourceforge.net/viewvc/xskernel/xskernel/include/io/ata/
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Если нужны прерывания bios, то код здесь:
    http://xskernel.svn.sourceforge.net/viewvc/xskernel/xload/include/io/
     
  4. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Правда, это не GCC, но может поможет :).
     
  5. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    USB Flash оно тоже читает?
     
  6. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Читает. Flash эмулируется как HDD.
     
  7. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    Оки, сейчас посмотрю ;) Спасибо, большое...
    Будем молится Богу чтоб получилось разобраться )
     
  8. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    Вроде бы понятно... Вот только что находится в файле <types.hpp>? Определение типов size_t и wsize_t?

    Модуль работает в защищенном режиме?
     
  9. Aerarh

    Aerarh New Member

    Публикаций:
    0
    Регистрация:
    9 мар 2008
    Сообщения:
    24
    А мануалы есть по hdd IO?
     
  10. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Всё находится в пределах этого каталога:
    http://xskernel.svn.sourceforge.net/viewvc/xskernel/xload/
    Это загрузчик, работает в реальном режиме и использует Unreal mode для загрузки ядра в память.
    Конкретно - types.hpp:
    http://xskernel.svn.sourceforge.net/viewvc/xskernel/xload/include/types.hpp?view=log
     
  11. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    Блин ((( А меня интересует, как реализовать чтение сектора в защищенном режиме. Чтобы работать с диском уже после загрузки ОС...
     
  12. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    А если переключать в реальный режим, читать с помощью этого модуля, а потом обратно в защищенный? Будет это дело работать? Как это осуществляется? Нет ли последствий для запущенных процессов ОС?
     
  13. Aerarh

    Aerarh New Member

    Публикаций:
    0
    Регистрация:
    9 мар 2008
    Сообщения:
    24
    Скажу коротко. Если не знаешь как это делать сразу не получится. (И никто не научит). Так что мануал в зубы и побитово трасить свой алгоритм.

    Великое не одним днем создано. ИДАЛЫ же противоречат эволюции: при них сама жизнь не нужна.
     
  14. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    это тоже под реальный режим?
     
  15. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Нет, это под защищённый, но через порты.
    А переход в реальный режим и вызов прерывания BIOS можно здесь посмотреть:
    http://xskernel.svn.sourceforge.net/viewvc/xskernel/xskernel/include/arch/i386/system/realmode/
     
  16. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    И оно тоже может читать с флешки?
     
  17. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Нет, для этого надо драйвер USB писать, которого пока в ядре нет.
    Но можно, например, перейти в реальный режим и обратиться к сервису BIOS.
    Так у меня VESA сделана.
     
  18. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    А как воспользоваться виртуальным режимом?
     
  19. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Robotex
    Переключиться, выполнить код, вернуться. Во время выполнения про контроллировать работу всей машины.
    Учесть что вызовы int нужно перехватить. Порты в/в разрешить. Проконтроллировать обработчики аппоратных прерываний или запретить.
     
  20. Robotex

    Robotex New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    17
    Где про это почитать?