• neohope
    置顶
    2021-08-16
    一、数据结构 1、全局数据结构,保存系统时间,通过硬件中断更新时间 KRL_DEFGLOB_VARIABLE(ktime_t,osktime); 2、中断向量表,绑定中断编号32和hxi_hwint00,特权级别设置为PRIVILEGE_KRNL set_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate, hxi_hwint00, PRIVILEGE_KRNL); 3、中断向量表,绑定中断编号255和exi_sys_call,特权级别设置为PRIVILEGE_USER set_idt_desc(INT_VECTOR_SYSCALL, DA_386IGate, exi_sys_call, PRIVILEGE_USER); 4、全局变量osservicetab,保存了全部系统调用入口 KRL_DEFGLOB_VARIABLE(syscall_t, osservicetab) 5、全局变量osdrvetytabl,保存了全部驱动入口函数 驱动初始化时,设置了处理函数 osdrvetytabl->systick_entry krlnew_devhandle(devp, systick_handle, 0x20) 二、8254产生硬件 1、8254产生硬件中断0x20 2、CPU收到中断,通过中断处理表IDT,通过中断门门检查后,会找到中断处理入口hxi_hwint00,实际触发了HARWINT 然后调用了hal_hwint_allocator 调用硬件中断处理函数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->krlupdate_times_from_cmos 从CMOS读取时间信息,放到全局osktime中 三、时间API调用 1、用户态 time->api_time->API_ENTRY_PARE1(INR_TIME, rets, ttime) ->功能编号为INR_TIME ->设置返回值 ->设置参数 ->触发 int 255 2、产生255中断 3、内核态 CPU收到中断,通过中断处理表IDT,通过中断门门检查后,会找到中断处理入口exi_sys_call,实际触发了EXI_SCALL 调用了hal_syscl_allocator 第一个参数为功能编号rax,在rdi 第二个参数为中断发生时的栈指针rsp,在rsi,指向内核栈 通过强制类型转换,将内核栈地址,转换为stkparame_t,这样就可以获得参数了 然后找到系统调用处理函数krlservice ->osservicetab[inr](inr, (stkparame_t*)sframe),也就是调用了krlsvetabl_time ->->krlsve_time,把系统的时间数据读取出来,写入应用程序传入缓冲区中【用户内存】 4、在中断处理到最后,内核代码会执行RESTOREALL,返回到用户空间继续运行应用程序。 5、用户态 应用程序就可以在用户态,读取到返回结果了
    展开

    作者回复: 对的 大佬 666

    
    6
  • springXu
    2021-08-11
    在第五课中找到 产生中断后,CPU 首先会检查中断号是否大于最后一个中断门描述符,x86 CPU 最大支持 256 个中断源(即中断号:0~255) 在第十三课中找到 在 x86 CPU 上,最多支持 256 个中断,还记得前面所说的中断表和中断门描述符吗,这意味着我们要准备 256 个中断门描述符和 256 个中断处理程序的入口。 所以本课的答案就一目了然了。

    作者回复: 哈哈 阅读加理解 正确

    
    5
  • pedro
    2021-08-11
    每个中断向量都是一个4字节的值,中断向量表最多可以存放256个中断向量,所以int指令后面的常数不能大于255,因为目前压根就不支持257号中断。

    作者回复: 是的 是的

    
    3
  • 苏流郁宓
    2021-08-12
    那arm架构呢?基于linux内核进行二次开发的安卓系统,它的int指令后面的常数也是不能大于255吗?

    作者回复: 这是x86 的情况

    
    1
  • 罗 乾 林
    2021-08-11
    不能,INT imm8 ,机器码为2字节【CD ib】最大255

    作者回复: 哈哈

    
    1
  • tony
    2022-12-01 来自湖北
    系统是如何保证socket的recv接口buffer参数从内核态到用户态拷贝数据时的安全性的?如果buffer参数在传入时已经是被释放的内存块,内核为什么不崩溃?谢谢。

    作者回复: 内核只会认为该进程 非法访问内存 从而终止进程

    
    
  • UJoy
    2022-07-19
    申请内存: 用户态->int 255[参数1]->krlservice-> krlsvetabl_mallocblk->krlsve_mallocblk->....-> kmsob_new[内存对象] 这个返回的内核态的虚拟地址吧 【应该要返回用户态的虚拟地址吧】?

    作者回复: 这是什么代码

    
    
  • kocgockohgoh王裒
    2022-01-13
    请问hal_syscl_allocator 的参数在栈上还是在寄存器啊 mov rdi,rax mov rsi,rsp 是把参数放到寄存器 可是怎么控制hal_syscl_allocator 到寄存器取参啊

    作者回复: 取参数 c编译器自动处理的

    
    
  • 日就月将
    2021-11-03
    老师,自己制作的app文件怎么在Cosmos中使用啊,已经编译成了.app文件。但是输入xxx.app之后没有反应。

    作者回复: 用41.1的代码

    
    
  • 苏流郁宓
    2021-08-12
    认为不能大于255

    作者回复: 是的

    
    