【问题标题】:How can I use kbgetc in xv6如何在 xv6 中使用 kbgetc
【发布时间】:2025-12-05 04:05:01
【问题描述】:

我想在用户模式下使用 kbdgetc()。 我需要用它在 xv6 中编写类似 vim 的软件。 我尝试使用内核模式,但我完全不知道该怎么做。

【问题讨论】:

  • 为什么需要从用户空间调用中断处理程序? kbdgetc()在需要时调用(当键盘产生中断时(IRQ_KBD)。如果需要为控制台读取,可以使用read(0,...)

标签: xv6


【解决方案1】:

我猜你想在fd 0 上进行一些非缓冲读取?

要实现此行为,您可以修改负责它的consoleintr 函数。

首先在内核内部添加一些变量来禁用或不缓冲。

我们称它为non_buffering 并将其默认值设置为0

然后添加一个系统调用来更改这个值(或根据需要修改现有的值)

这样改consoleintr(修改为221行):

191 void
192 consoleintr(int (*getc)(void))
193 {
194   int c, doprocdump = 0;
195
196   acquire(&cons.lock);
197   while((c = getc()) >= 0){
198     switch(c){
   ....
216     default:
217       if(c != 0 && input.e-input.r < INPUT_BUF){
218         c = (c == '\r') ? '\n' : c;
219         input.buf[input.e++ % INPUT_BUF] = c;
220         consputc(c);

       /* NON_BUFFERING added here */
221         if(non_buffering || c == '\n' || c == C('D') || input.e == input.r+INPUT_BUF){
222           input.w = input.e;
223           wakeup(&input.r);
224         }
225       }
226       break;
227     }
228   }
229   release(&cons.lock);
230   if(doprocdump) {
231     procdump();  // now call procdump() wo. cons.lock held
232   }
233 }

【讨论】: