从键盘中断产生消息到WndProc是怎样一个过程?

ooolinux 2015-12-26 02:41:26
我找了两段文字:

"用键盘当作输入设备,每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理。 KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到系统的消息队列中等候处理。"

这段话有没有问题?
我的问题是,按下一个键,键盘、南桥、I/O总线、CPU、内核、驱动程序、中断之间是一个怎样的作用过程?

“系统每次从队列中取得一条消息,并将消息从队列中删除,将消息发送到相应线程的消息队列中。”
“应用程序消息循环从消息队列中取得消息(GetMessage),通过TranslateMessage后,DispatchMessage将消息发送到对应的窗口过程WndProc处理。”


这段话有没有问题?
WndProc是回调函数,是Windows系统调用的,那从DispatchMessage到调用WndProc之间是怎样一个过程呢?
...全文
574 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-12-29
  • 打赏
  • 举报
回复 1
加电后从16Bits的地址 0xFFFF:0000H,即 0xFFFF0处启动,这个地址同时也是32Bit的 0xFFFF0000 BIOS 首先执行POST 然后是显卡Bios 会执行 硬盘的Bios应该也会执行 现在PCI.PCIE这一类卡电脑上不是很多了,如果有的话,他们的Bios也会执行。 一般都是些初始化工作 初始化后,执行BIOS自己的一些例行程序 然后就会就会读取磁盘上的操作系统启动代码,加载到0000:7C00 DOS下,只是接管部分中断,Bios中断还可以用,DOS本身,有0x21系统调用,以及20~2F等扩展中断 还有 0x33鼠标中断 MS 不完全是软件公司。它迄今为止,还在卖鼠标;键盘应该也在卖。 (windows 最初是建立在DOS上的,如今也还有个启动过程,这一阶段和DOS也差不多,就是所谓的Win PE ,但是已经不完全是控制台模式了) 保护模式,就是全部接管中断了。因为实模式没有描述符表 只有中断向量表 而且实模式只有16Bits ,没有32Bits模式. 中断向量是4Bytes , 32Bits保护模式 中断描述符表 是8Bytes 地址 分别只能存放一条 16Bits,32Bits 跳转指令 有时候,windows 也可以用一定手段,调用16Bits 实模式程序(包括 Bios中断,DOS中断) 不过32BIts Win32程序很少用了,也许底层还在用。这个就不清楚了。
赵4老师 2015-12-29
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察使用WinDbg远程调试另一台Windows。 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
这里有说DispatchMessage到底干了什么: http://www.xuebuyuan.com/1829252.html
这篇很详细
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 10 楼 lm_whales 的回复:
CPU只是在中断描述符表加载后,中断到了,根据中断号, 跳入对应的中断服务程序之中 操作系统,因为接管了中断,所以中断服务程序(目前是操作系统的一部分), 就会在适当的时候向,操作系统发出消息( Windows 是设置事件,Windows 消息是通过API和事件共同作用,实现消息机制的)
有点明白了 BIOS中断例程在操作系统启动初始化完毕就退出历史使命了吗(以后中断到来CPU跳转的都是内存中操作系统的中断服务程序对吗)?还是说操作系统的中断服务程序底层上再依赖于BIOS中断服务/接口服务? 开机的时候,CPU除了跳入主板BIOS的地址执行代码,其它哪些BIOS也会被执行?它们是在主板BIOS诊断外围的时候执行的吧?
lm_whales 2015-12-28
  • 打赏
  • 举报
回复
CPU只是在中断描述符表加载后,中断到了,根据中断号, 跳入对应的中断服务程序之中 操作系统,因为接管了中断,所以中断服务程序(目前是操作系统的一部分), 就会在适当的时候向,操作系统发出消息( Windows 是设置事件,Windows 消息是通过API和事件共同作用,实现消息机制的)
lm_whales 2015-12-28
  • 打赏
  • 举报
回复
开机的时候,没有任何中断可用,接着CPU跳到 各个Bios中,执行代码, 这些开机代码执行完毕,引导操作系统, 操作系统先接管实模式中断,完成各种初始化,跳入保护模式代码,从此启动保护模式。 这些初始化中,包括保护模式的中断描述符表,等数据结构的初始化 ---这个地方才是保护模式中断,初始化的地方 保护模式到中断描述符表初始化后,完成了基本初始化。 然后,继续加载一些必要的驱动程序,各种服务,以及配置。 除非操作系统非常简单,否则,是一步一步完成初始化的
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
当然要产生中断号了,然后t跳入中断描述符表中的,中断服务程序地址处,执行中断服务。 他会通知Windows 有一个键盘中断产生了 针对这个消息,Widows 内部会有一一列处理。 然后,Widows 会把这个消息通知到应用程序。
“中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。” 是不是可以这样理解,开机的时候BIOS把终端服务程序映射到内存某些地址,CPU处理中断执行的便是中断描述表里的某个内存地址入口,然后CPU通知内核,内核再调用Windows的中断服务程序? 这样理解对不对?还有一个问题,CPU是怎么通知Windows中断产生了?
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
中断产生后,也是产生一个中断号吗?内核的什么模块最先获得中断号,然后调用中断服务呢?中断服务程序从哪里获得按键信息?
中断服务是内核调用的,还是CPU层面直接执行的?
lm_whales 2015-12-28
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
[quote=引用 2 楼 lm_whales 的回复:] 硬件部分: 键盘本身有控制器,能够产生扫描码 用户击键盘 键盘产生扫描码和(键盘中断,键盘有键按下弹起的消息) 传递给南桥芯片中的键盘控制器, 键盘控制器产生中断传递给南桥内部的中断控制器 中断控制器传递给CPU引脚,CPU也可以读写中断控制器的寄存器。 从而产生键盘中断。 各种信息数据通过 总线 ,或者专线连接。 键盘中断产生后,有Bios 服务程序,和操作系统的中断服务程序联合完成中断服务 操作系统中断服务程序把键盘中断以及其他消息,转换程Windows内核消息(事件) Windows 内核,以及三大DLL等模块给应用程序发送系统消息,以及windows MSG消息。 应用程序通过消息循环,获取并处理MSG消息。 处理过程中,会调用程序窗口类注册的窗口过程。 窗口过程,具体处理应用程序感兴趣的消息。
中断产生后,也是产生一个中断号吗?内核的什么模块最先获得中断号,然后调用中断服务呢?中断服务程序从哪里获得按键信息?[/quote] 当然要产生中断号了,然后t跳入中断描述符表中的,中断服务程序地址处,执行中断服务。 他会通知Windows 有一个键盘中断产生了 针对这个消息,Widows 内部会有一一列处理。 然后,Widows 会把这个消息通知到应用程序。
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
硬件部分: 键盘本身有控制器,能够产生扫描码 用户击键盘 键盘产生扫描码和(键盘中断,键盘有键按下弹起的消息) 传递给南桥芯片中的键盘控制器, 键盘控制器产生中断传递给南桥内部的中断控制器 中断控制器传递给CPU引脚,CPU也可以读写中断控制器的寄存器。 从而产生键盘中断。 各种信息数据通过 总线 ,或者专线连接。 键盘中断产生后,有Bios 服务程序,和操作系统的中断服务程序联合完成中断服务 操作系统中断服务程序把键盘中断以及其他消息,转换程Windows内核消息(事件) Windows 内核,以及三大DLL等模块给应用程序发送系统消息,以及windows MSG消息。 应用程序通过消息循环,获取并处理MSG消息。 处理过程中,会调用程序窗口类注册的窗口过程。 窗口过程,具体处理应用程序感兴趣的消息。
中断产生后,也是产生一个中断号吗?内核的什么模块最先获得中断号,然后调用中断服务呢?中断服务程序从哪里获得按键信息?
paschen 2015-12-28
  • 打赏
  • 举报
回复
这里有说DispatchMessage到底干了什么: http://www.xuebuyuan.com/1829252.html
ooolinux 2015-12-28
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
1、这段话没问题,你要彻底理解的话要看汇编,键盘有键按下会向CPU请求中断,CPU保护现场、转到中断处理、恢复现场继续运行 2、DispatchMessage 让WndProc处理这个消息,你也可以理解成该函数内部会调用WndProc,该函数要等WndProc执行完才返回,返回值也是WndProc的返回值
如果是DispatchMessage 内部会调用WndProc,那相当于是用户调用、还是系统调用WndProc呢?DispatchMessage 会不会把消息发回系统,然后系统以这个消息为参数调用WndProc呢?
lm_whales 2015-12-26
  • 打赏
  • 举报
回复
硬件部分: 键盘本身有控制器,能够产生扫描码 用户击键盘 键盘产生扫描码和(键盘中断,键盘有键按下弹起的消息) 传递给南桥芯片中的键盘控制器, 键盘控制器产生中断传递给南桥内部的中断控制器 中断控制器传递给CPU引脚,CPU也可以读写中断控制器的寄存器。 从而产生键盘中断。 各种信息数据通过 总线 ,或者专线连接。 键盘中断产生后,有Bios 服务程序,和操作系统的中断服务程序联合完成中断服务 操作系统中断服务程序把键盘中断以及其他消息,转换程Windows内核消息(事件) Windows 内核,以及三大DLL等模块给应用程序发送系统消息,以及windows MSG消息。 应用程序通过消息循环,获取并处理MSG消息。 处理过程中,会调用程序窗口类注册的窗口过程。 窗口过程,具体处理应用程序感兴趣的消息。
paschen 2015-12-26
  • 打赏
  • 举报
回复
1、这段话没问题,你要彻底理解的话要看汇编,键盘有键按下会向CPU请求中断,CPU保护现场、转到中断处理、恢复现场继续运行 2、DispatchMessage 让WndProc处理这个消息,你也可以理解成该函数内部会调用WndProc,该函数要等WndProc执行完才返回,返回值也是WndProc的返回值

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧