• neohope
    置顶
    2021-07-21
    一、数据结构 objnode_t表示一个IO包,包括了各种操作所需的各种参数 二、 向设备发送 I/O 包 krldev_io->krldev_call_driver->通过函数指针,调用设备驱动指定功能编号的功能函数 所有驱动功能函数,都会传入objnode_t参数 三、 8254初始化 在上一节中,完成了8254设备的初始化及驱动的初始化,并启用了8254硬件中断 其中,在初始化驱动时: systick_entry->krlnew_devhandle->krladd_irqhandle->hal_add_ihandle 将intserdsc_t结构【包括驱动回调函数】,挂载到了intfltdsc_t.i_serlist中 四、8254中断调用链 1、8254产生硬件中断 2、CPU收到中断,通过中断处理表IDT,找到中断门,通过门检查后,会找到中断处理入口,然后找到硬件中断分发函数hal_hwint_allocator 【第一个参数为中断编号,在rdi;第二个参数为中断发生时的栈指针,在rsi】 调用硬件中断处理函数hal_do_hwint 3、hal_do_hwint 如有必要,结束硬件中断 调用中断回调函数hal_do_hwint->hal_run_intflthandle 4、hal_run_intflthandle 先获取intfltdsc_t中断异常表 然后调用intfltdsc_t中,i_serlist上所有挂载intserdsc_t 结构中的中断处理的回调函数s_handle 5、8254回调函数为systick_handle 6、systick_handle 更新进程的tick,如果超出20毫秒,让出CPU使用权限,进行进程调度
    展开

    作者回复: 对的,老哥总结到位

    
    7
  • springXu
    2021-07-16
    因为内核的调度器也要被激活。如果没定时器中断,调度器的激活貌似只能靠其他中断,比如用户结束进程,或者进程抢占了其他被锁资源,才能激活进程调度器。

    作者回复: 正确 正确

    
    10
  • 罗 乾 林
    2021-07-16
    进程调度发生在用户态和内核态切换,如果一个应用程序只在用户态做计算不进行系统调用,系统将没有机会完成进程调度。定时器的出现就能打破这一问题,使系统进入中断处理程序,进而完成进程调度

    作者回复: 正确 老铁

    
    3
  • 青玉白露
    2021-08-27
    因为进程根本不知道自己执行了多久的CPU,所以需要时钟来提醒他,并且在超时的时候强制进行进程调度。

    作者回复: 是的 是的

    
    1
  • LDxy
    2021-07-16
    I/O 包这个概念第一次听说

    作者回复: 我搞 很多 新名词概念 哈哈

    共 2 条评论
    1
  • 艾恩凝
    2022-05-08
    打卡,看简单,调程序 又花了点时间

    作者回复: 哈哈

    
    
  • Entropy
    2021-08-25
    如果产生时钟中断,那么此时cpu不是要切换上下文来执行中断回调函数systick_handle吗? 如果是,那么调用krlsched_retn_currthread()是不是返回的是中断处理函数所在的进程,所以之前被切换的进程计时不会加1?

    作者回复: 只有进程上下文

    共 3 条评论
    
  • pedro
    2021-07-16
    因为之前实现的调度主要看优先级和运行时间,如果没有 systick 中断来记录运行时间,那么调度器就无法根据运行时间来强制休眠高优先级进程,高优先级进程将会霸占CPU。

    作者回复: 是的 铁汁

    
    