Guest User

Untitled

a guest
May 26th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. sergey@COMPUTER:~/Рабочий стол/myOS_8.0T$ make mykernel.bin
  2. make: Предупреждение: время изменения файла «interruptstubs.s» находится в будущем (10131)
  3. as --32 -o interruptstubs.o interruptstubs.s
  4. interruptstubs.s: Assembler messages:
  5. interruptstubs.s: Warning: конец файла не в конце строки; вставлен символ новой строки
  6. ld -melf_i386 -T linker.ld -o mykernel.bin loader.o gdt.o port.o interruptstubs.o interrupts.o kernel.o
  7. interrupts.o: In function `InterruptManager::InterruptManager(GlobalDescriptorTable*)':
  8. interrupts.cpp:(.text+0xc1): undefined reference to `InterruptManager::IgnoreInterruptRequest()'
  9. Makefile:15: ошибка выполнения рецепта для цели «mykernel.bin»
  10. make: *** [mykernel.bin] Ошибка 1
  11. sergey@COMPUTER:~/Рабочий стол/myOS_8.0T$
  12.  
  13. #include "interrupts.h"
  14.  
  15.  
  16. void printf(char* str);
  17.  
  18.  
  19. InterruptManager::GateDescriptor InterruptManager::InterruptDescriptorTable[256];
  20.  
  21. void InterruptManager::SetInterruptDescriptorTableEntry(
  22. uint8_t interruptNumber,
  23. uint16_t codeSegmentSelectorOffset,
  24. void (*handler)(),
  25. uint8_t DescriptorPrivilegeLevel,
  26. uint8_t DescriptorType)
  27. {
  28.  
  29. const uint8_t IDT_DESC_PRESENT = 0x80;
  30.  
  31. InterruptDescriptorTable[interruptNumber].handlerAddressLowBits = ((uint32_t)handler) & 0xFFFF;
  32. InterruptDescriptorTable[interruptNumber].handlerAddressHighBits = (((uint32_t)handler) >> 16) & 0xFFFF;
  33. InterruptDescriptorTable[interruptNumber].gdt_codeSegmentSelector = codeSegmentSelectorOffset;
  34. InterruptDescriptorTable[interruptNumber].access = IDT_DESC_PRESENT | DescriptorType | ((DescriptorPrivilegeLevel&3) << 5);
  35. InterruptDescriptorTable[interruptNumber].reserved = 0;
  36.  
  37. }
  38.  
  39. InterruptManager::InterruptManager(GlobalDescriptorTable* gdt)
  40. {
  41. uint16_t CodeSegment = gdt->CodeSegmentSelector();
  42. const uint8_t IDT_INTERRUPT_GATE = 0xE;
  43.  
  44. for(uint16_t i = 0; i < 256; i++)
  45. SetInterruptDescriptorTableEntry(i, CodeSegment, &IgnoreInterruptRequest, 0, IDT_INTERRUPT_GATE);
  46.  
  47. SetInterruptDescriptorTableEntry(0x20, CodeSegment, &HandleInterruptRequest0x00, 0, IDT_INTERRUPT_GATE);
  48. SetInterruptDescriptorTableEntry(0x21, CodeSegment, &HandleInterruptRequest0x01, 0, IDT_INTERRUPT_GATE);
  49.  
  50. InterruptDescriptorTablePointer idt;
  51. idt.size = 256 * sizeof(GateDescriptor) - 1;
  52. idt.base = (uint32_t)InterruptDescriptorTable;
  53. asm volatile("lidt %0" : : "m" (idt));
  54.  
  55. }
  56.  
  57. InterruptManager::~InterruptManager()
  58. {
  59. }
  60.  
  61. void InterruptManager::Activate()
  62. {
  63. asm("sti");
  64. }
  65.  
  66.  
  67.  
  68. uint32_t InterruptManager::handleInterrupt(uint8_t interruptNumber, uint32_t esp)
  69. {
  70.  
  71. printf(" INTERRUPT");
  72.  
  73. return esp;
  74. }
Add Comment
Please, Sign In to add comment