作家
登录

Java开发操作系统内核:实现进程的优先级切换

作者: 来源: 2017-07-18 09:18:42 阅读 我要评论

    push ebx    push edx    push ecx    push eax    retf

履行完膳绫擎几条指令后,应用法度榜样就可以运行起来了,并且应用法度榜样是运行在优先级为3的前提下,此时应用法度榜样不运行履行任何权限跨越3的指令,例如存储段存放器相干的指令,如不雅应用法度榜样履行类似指令:move ds, ax时,CPU会产生OD异常,于是根据上一节内容,应用法度榜样会被杀掉落。

asm_cons_putchar:AsmConsPutCharHandler equ asm_cons_putchar - $$        push ds        push es        pushad        pusdad        ;把内存段切换到内核        mov  ax, SelectorVram        mov  ds, ax        mov  es, ax         call kernel_api        cmp eax, 0        jne end_app        popad        pop es        pop ds        iretdend_app:        mov esp, [eax]        popad        ret

比拟于上个版本,代码精简了很多,那是因为我们不消再推敲应用法度榜样切换到内核时客栈若何切换,因为CPU已经帮我们处理了。这里我们再看看kernel_api的实现:

int* kernel_api(int edi, int esi, int ebp, int esp,                int ebx, int edx, int ecx, int eax) {    struct TASK *task = task_now();    if (edx == 1) {        cons_putchar(eax & 0xff, 1);    }else if (edx == 2) {        cons_putstr((char*)(buffer.pBuffer + ebx));     }else if (edx == 4) {        return &(task->tss.esp0);    }    return 0;}

这里我们增长了一个标号为4的API调用,它只是简单的返回内核存储在TSS构造里的客栈指针,当调用完kernel_api后,它的返回值会被存储在存放器eax中,于是API中断发明eax不是0,那意味着eax存储的是内核在切换到应用法度榜样前的客栈指针,于是它把这个指针的值赋值给客栈指针存放器esp,于是语句popad是把客栈上存放的所有通用存放器的数值返回给对应通用存放器,这条指令对应的指令是start_app调用中的pushad指令,履行完popad指令后,客栈上存储的是大年夜start_app返回后的下一条指令的地址,因疵苡锫来履行ret指令时,CPU控制权会重现返还给内核。

最后我们再看看竽暌剐个应用法度榜样代码的修改,在api_call.asm中:

[SECTION .s32]BITS 32call mainmov  edx, 4  ;返回内核int  02Dhapi_putchar:  mov edx, 1  mov al, [esp + 4]  int 02Dh  ret%include "app.asm"

现代码调用完main函数后,也就是应用法度榜样履行完毕后,代码把4赋值给edx存放器,然后调用api中断,根据前面的分析,中断履行后CPU的┞菲握权就交还给了内核。别的因为应用法度榜样运行在优先级3,它要调用内核中断时,须要应用指令int 02Dh来触发中断,我们必须把02Dh号中断的优先级也设置成3,要不然应用法度榜样就没有资格调用02Dh号中断,于是在kernel.asm中做如下修改:

.2DH:    Gate SelectorCode32, AsmConsPutCharHandler,0, DA_386IGate+0x60

【编辑推荐】

  1. JAVA回调机制(CallBack)
  2. JavaScript 装逼指南
  3. 挨踢部落坐诊第四期:Java消息队列的应用处景和感化
  4. 若何应用JavaScript构建机械进修模型
  5. 遗传算法的根本概念和实现(附 Java 实现案例)
【义务编辑:张子龙 TEL:(010)68476606】

像前面说过的一样,加上0x60就是把该中断的优先级设置为3.

完成所有代码修改后,内核运行情况如下:

固然运行结不雅与往常一样

但应用法度榜样运行时的优先级已经改变为3,是以应用法度榜样没有了履行高等指令的权限,是以内核获得了进一步的保护。
著作权归作者所有。贸易转载请接洽作者获得授权,非贸易转载请注明出处。

在应用法度榜样运行过程中,如不雅它须要调用内核API,也就是须要运行内核代码时,CPU会主动大年夜TSS中攫取esp0和ss0两个变量的信息,然后主动把客栈段和客栈指针切换到内核本来的客栈段和客栈指针,如许可以省却我们大年夜量的麻烦,于是相干代码便可以获得极大年夜的精简,例如实现API调用的02Dh中断的实现如下:


  推荐阅读

  大咖头脑风暴:智能互联网时代会发生什么?

【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路!无论是生活在一线都会,照样栖身在偏远山村,今天中国的绝大年夜多半处所,互联网都已经如同水与电一样,渗入渗出进人们的>>>详细阅读


本文标题:Java开发操作系统内核:实现进程的优先级切换

地址:http://www.17bianji.com/lsqh/36255.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)