나는 학교용 보조 장치의 일부로 작은 OS를 작성하고 있지만 키보드 입력을 얻으려면 오히려 막혔다. osdev.org (gcc 크로스 컴파일러, GRUB 부트 로더, ld 링커)에서 Bare Bones 자습서를 사용하고 있습니다. 보호 모드이기 때문에 BIOS 인터럽트를 입력에 사용할 수 없기 때문에 자체 인터럽트 핸들러를 작성해야합니다. ?)하지만 osdev 기사 및 포럼 토론을 읽은 후에도이를 수행하는 방법을 모르겠습니다. 매우 유사한 문제 (http://forum.osdev.org/viewtopic.php?f=1&t=9746)를 제외하고 나는 "인터럽트를 설정하는"방법을 모른다.자신의 커널을위한 키보드 인터럽트 처리기 (C)
#if !defined(__cplusplus)
#include <stdbool.h> /* C doesn't have booleans by default. */
#endif
#include <stddef.h>
#include <stdint.h>
#define INT_DISABLE 0
#define INT_ENABLE 0x200
#define PIC1 0x20
#define PIC2 0xA0
#define ICW1 0x11
#define ICW4 0x01
void outb(unsigned short port, unsigned char val)
{
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
}
static __inline unsigned char inb (unsigned short int port)
{
unsigned char _v;
__asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port));
return _v;
}
void init_pics(int pic1, int pic2)
{
/* send ICW1 */
outb(PIC1, ICW1);
outb(PIC2, ICW1);
/* send ICW2 */
outb(PIC1 + 1, pic1);
outb(PIC2 + 1, pic2);
/* send ICW3 */
outb(PIC1 + 1, 4);
outb(PIC2 + 1, 2);
/* send ICW4 */
outb(PIC1 + 1, ICW4);
outb(PIC2 + 1, ICW4);
/* disable all IRQs */
outb(PIC1 + 1, 0xFF);
}
/*irrelevant code*/
#if defined(__cplusplus)
extern "C" /* Use C linkage for kernel_main. */
#endif
void kernel_main()
{
terminal_initialize();
char c;
init_pics(0x20, 0x28);
c = inb(0x60);
terminal_putchar(c);
}
흰색 상자가 인쇄됩니다. 포트 0x64를 들으려고하면 다른 문자가 표시됩니다. 나는 인터럽트가 없기 때문에 이것이 효과가 있다고 기대하지 않습니다. 나는 그것이 같아야한다고 생각한다.
void _interrupt button_pressed()
{
/*code*/
}
if(button_pressed)
{
c = inb(0x60);
//code to translate the char to ASCII
terminal_putchar(asciiChar);
}
어떤 도움을 주셔서 감사합니다. 감사합니다
+1, 내가 내부에 무엇이 –
의 유일한 유권자이야 슬프다'terminal_putinput을 '? –