关闭

曹娥做系统是如何感知事件的???

437人阅读 评论(0) 收藏 举报
分类:

我们知道,java中提供了事件机制,即:每一个动作,都产生一个事件。

那么,操作系统是如何感知事件的呢???

针对于一些问题:


问题:

1.“一般我们在开发窗体程序时,只需对按钮等绑定相应的操作事件监听,之后按钮就可以相应鼠标操作
但我想知道的是,操作系统底层又是如何知道按钮被鼠标点击了呢?

难道是操作系统对窗口中的任何元素都在毫秒级的监控着,比如监控按钮A,当发现按钮A上方有鼠标指针
这时就相当于监控到onmouseover,而当鼠标点击时,系统知道操作的对象是鼠标下方的按钮A,而不是其它按钮

不知正确否,请指点!谢谢 


2.如何看待java中的这一机制:即:  :::   动作-------》触发事件---->监听器:注册和处理事件???

现在理解这句话:点击该按钮是,JButton 对象触发一个ActionEvent,然后将它作为参数传递以调用监听器的actionPerformed()方法来处理这个事件。

其实,这是java自己的抽象。


要是深入的理解:

要点:只有从操作系统和汇编的角度,才能看透一些底层问题:

                    只有从操作系统的角度才能理解:

                 从汇编的角度: 那即是:     发出中断--------中断处理程序



()中断->鼠标驱动->raw input thread->应用程序的线程

()++这个是中断芯片控制的 打个比方你键盘 按下一个键 中断芯片就会发送一个中断信号给CPU 然后在发送一个中断量给CPU 然后CPU根据操作系统底层根据中断量跳转到预先设置的对应的中断任务( 至于怎么跳转这个涉及到段寄存器方面的知识 请自己去查了 三言两语说不清楚 ) 然后中断任务会去调用键盘或者鼠标驱动 ,然后形成一个事件 压入操作系统的事件队列 然后操作系统在分派给相应的应用程序线程


()CSRSS进程的线程RawInputThread 中 调用CreateFile() 

CreateFile 是个系统调用 

通过 sysenter 或者int 2e 进入内核模式  kiFastSystemCall 或(通过IDT) KisystemService 在ssdt索引

找到并调用NtCreateFile …  打开鼠标类驱动的设备\Device\PointerClass0

RawInputThread 执行ReadFile()  同样是个系统调用 …  进入内核模式的NtReadFile 

产生一个IRP_MJ_READ  然后WaitForSingleObject等在这里

IRP进入鼠标端口驱动i8042prt.sys 被挂入未完成队列

按下鼠标 ->设备中断  

进入IDT    中断号x4 获得获得中断门描述符地址

根据中断门里的段选择子 -> 在GDT中索引 ->得到段描述符->得到段地址 + 中断门里的 偏移

进入 KiInterruptTemplate  -> INT_PROLOG   … -> jmp KiInterruptDispatch@0

->call ServiceRoutine (由鼠标小端口驱动提供的中断服务例程)  调用鼠标类驱动提供的函数上交数据
  
鼠标类驱动完成IRP

NtReadFile继续执行 返回用户模式

RawInputThread得到鼠标位信息


按钮是个窗口

窗口的数据结构是 typedef struct _window_object {…}

里面有个MessageQueue  指向所属线程的报文队列结构 USER_MESSAGE_QUEUE  里面有七种用途的七个报文队列

报文队列结构 每线程一个  一个线程可以有多个视窗     一个线程中所有的窗口的窗口结构都 指向同一个报文队列

………………

按下按钮会触发postmessage 或 sendmessage(强制调用目标窗口的处理函数) 

postmessage把报文挂入 目标窗口的线程的报文队列  目标窗口通过getmessage得到  …………





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:234752次
    • 积分:7574
    • 等级:
    • 排名:第2808名
    • 原创:490篇
    • 转载:337篇
    • 译文:2篇
    • 评论:1条
    最新评论