【发布时间】:2025-12-05 04:05:01
【问题描述】:
我想在用户模式下使用 kbdgetc()。 我需要用它在 xv6 中编写类似 vim 的软件。 我尝试使用内核模式,但我完全不知道该怎么做。
【问题讨论】:
-
为什么需要从用户空间调用中断处理程序?
kbdgetc()在需要时调用(当键盘产生中断时(IRQ_KBD)。如果需要为控制台读取,可以使用read(0,...)
标签: xv6
我想在用户模式下使用 kbdgetc()。 我需要用它在 xv6 中编写类似 vim 的软件。 我尝试使用内核模式,但我完全不知道该怎么做。
【问题讨论】:
kbdgetc()在需要时调用(当键盘产生中断时(IRQ_KBD)。如果需要为控制台读取,可以使用read(0,...)
标签: xv6
我猜你想在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 }
【讨论】: