gpt4 book ai didi

gcc - 自己内核的键盘中断处理程序 (C)

转载 作者:行者123 更新时间:2023-12-01 23:18:00 26 4
gpt4 key购买 nike

我正在编写一个微型操作系统作为学校作业的一部分,但是在获取键盘输入(按一个键 -> 在屏幕上显示)时我卡住了。我正在使用 osdev.org 的 Bare Bones 教程(gcc 交叉编译器、GRUB 引导加载程序、ld 链接器),由于我处于保护模式,我无法使用 BIOS 中断进行输入,这就是为什么我必须编写自己的中断处理程序( ?) 但即使我阅读了一些 osdev 文章和论坛讨论,我也不知道该怎么做。非常相似的问题( http://forum.osdev.org/viewtopic.php?f=1&t=9746 ),只是我不知道如何“设置中断”。

#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);
}

任何帮助表示赞赏。谢谢

最佳答案

如果有人对我如何解决问题感兴趣,这里是解决方案

char c = 0;
init_pics(0x20, 0x28);
do
{

if(inb(0x60)!=c) //PORT FROM WHICH WE READ
{
c = inb(0x60);
if(c>0)
{

terminal_putinput(c); //print on screen

}
}


}
while(c!=1); // 1= ESCAPE
c变量包含按下按钮的代码。通过关联到每个代码,相应的 ASCII 代码来创建一个翻译数组,我可以打印写在按钮上的字母/数字。

按钮代码可以在这里找到: http://www.nondot.org/sabre/os/files/HCI/keyboard.txt

这里的 ASCII: http://www.ascii-code.com/

关于gcc - 自己内核的键盘中断处理程序 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com