我正在尝试跟踪阻止某个进程的高级函数调用。这样的一个例子是scanf,它阻塞终端直到它收到'\ n'。现在我将scanf跟踪到getc(scanf使用getc从stdin获取字符)。我的问题是,解释来自键盘的数据,一直到内核以及返回getc的过程是什么? scanf如何停止终端(计算机空闲,还是处理其他任务)? 谢谢
答案 0 :(得分:5)
每当进程发出系统调用(例如阻塞read(2)
)时,进程就开始以内核模式执行,即调用处理特定系统调用的内核代码。
之后,根据底层设备和驱动程序,可以暂停进程并将其置于等待队列中。当按下某个键时,将调用处理中断的内核代码,并从那里扣除按下哪个键。
然后内核恢复等待此输入的进程,并通过将数据从内核地址空间复制到特定进程的地址空间来传递数据。
答案 1 :(得分:1)
系统调用使用户程序能够以普遍模式执行。当用户程序进行系统调用时,它会生成中断0x80。当内核收到中断时,它将在中断描述符表(IDT)上查找0x80并执行相应的处理程序(syscall)。执行此处理程序后,在将信息从内核内存复制到用户内存后,控件将转移到用户程序。
在这种情况下,scanf映射到库函数“read”。 “读取”系统调用调用“sys_read”,然后使用getc从输入流STDIN读取。希望这有帮助!