首页 > 系统相关 >java开发系统内核:像Linux一样使用中断实现内核API

java开发系统内核:像Linux一样使用中断实现内核API

时间:2023-06-14 11:05:23浏览次数:57  
标签:调用 java 中断 代码 应用程序 API 内核


我们当前提供的内核API有个问题,就是每次使用时,需要计算API函数在内核中的位置,一旦内核代码改变,API接口的位置也会改变,同时调用API的应用程序也必须跟着改变,显然这种限制是不可接受的。

为了突破当前缺陷,我们必须想出新的API提供办法。常用的做法是,仿照Linux 将API当做一个中断调用,由此应用程序在使用API时,只需要记住API对应的中断号,然后使用指令int 即可,这样无论API接口位置如何变动,应用程序的代码都不需要重新更改。

由此在系统内核的汇编代码部分做如下修改:

LABEL_IDT:
...
.2DH:
    Gate SelectorCode32, AsmConsPutCharHandler,0, DA_386IGate

我们在中断向量表中增加了一个.2D号中断,该中断对应的相应函数地址为AsmConsPutCharHandler。

在原来的API接口AsmConsPutChar处增加如下代码:

asm_cons_putchar:
AsmConsPutCharHandler equ asm_cons_putchar - $$
        pushad

        push 1 
        and  eax, 0xff
        push eax
        call  cons_putchar
        add  esp, 8

        popad

        iretd

首先我们通过把函数入口地址减去段的起始地址,得到函数相对于代码段的偏移,这个偏移的值就是AsmConsPutCharHandler, 其次asmConsPutChar一旦调用是,先执行指令pushad, 该指令的作用是把所有通用寄存器压入堆栈,寄存器跟代码运行的上下文密切相关,如果在调用中断时不包含好通用寄存器,那么从中断返回后,由于寄存器的改变,可能会导致代码逻辑出现错误。在APIZ执行完毕后,执行指令popad,把原先保持起来的寄存器数据重新恢复到对应的寄存器中。

使用中断提供内核接口调用,应用程序在开发逻辑上可以得到极大的简化,以下代码显示了应用程序如何调用内核API在控制台上显示字符:

[map symbols hlt.map]
[SECTION .s32]
BITS 32
mov  ax, 'L'
int 02DH
mov  ax,  'G'
int 02DH

retf

应用程序只需要把要显示的字符赋值给寄存器ax, 然后出发2d号中断就可以利用内核导出的API,实现在控制台上输出字符的功能。同时应用程序无需估计内核代码修改后,结构API地址会改变的问题,代码只需兼顾自身逻辑,于是相比于前一版本的内核调用,逻辑上得到了很大的简化。

把上面代码编译后,在控制台运行hls命令后,效果如下:

java开发系统内核:像Linux一样使用中断实现内核API_Linux

更详实的讲解和代码调试流程,请参看视频。

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:

java开发系统内核:像Linux一样使用中断实现内核API_操作系统_02


标签:调用,java,中断,代码,应用程序,API,内核
From: https://blog.51cto.com/u_16160261/6476221

相关文章

  • java开发系统内核:使用C语言开发系统应用程序
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,......
  • java开发C语言编译器:JVM 的基本操作指令介绍及其程序运行原理
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,......
  • 编译原理动手实操,用java实现一个简易编译器-语法解析
    语法和解析树:举个例子看看,语法解析的过程。句子:“我看到刘德华唱歌”。在计算机里,怎么用程序解析它呢。从语法上看,句子的组成是由主语,动词,和谓语从句组成,主语是“我”,动词是“看见”,谓语从句是”刘德华唱歌“。因此一个句子可以分解成主语+动词+谓语从句:句子-->主语+动词+谓语......
  • java开发系统内核:进程的挂起和恢复
    有了进程的自动调度后,接下来的任务在于,如何将空闲进程挂起,空闲进程往往是那些没有具体任务需要处理的进程,因此,如果继续让其运行的话,那么必然会耗费宝贵的CPU资源,如果能让它先挂起,等到它需要执行具体任务时,再把它调度到前台,那才是一种合理的进程管理机制。我们实现的进程调度,是依赖......
  • java开发C语言编译器: return 语句的解释和执行
    在C语言程序中,很多函数并不是执行全部语句后,才从最底部返回的,大多数情况下,当某些条件成立时就可以通过return语句立即返回,而无需执行接下来的代码,本节,我们继续增强java开发的C语言解释器功能,使其能够处理return语句,完成本节代码后,我们的C语言解释器能够正常解析和执行下面的代码:in......
  • java开发系统内核:自动化进程切换
    我们已经通过时钟中断完成了两个进程间的相互切换。但当前实现有很大的缺陷,例如我们只能在两个指定的进程间切换,如果要想增添新的进程,那么,没增加一个进程,按照当前模式,我们只能再增加相应代码,这显然是不可接受的。因此,这节,我们希望完成进程的切换机制,使得有新进程时,我们无需改动代码......
  • java开发系统内核:实现进程自动切换,再现Linus当年辉煌一刻
    Linux操作系统内核于1991年10月5日被LinusBenedictTorvalds所开发,从此后,世界软件史揭开了新的帷幕,我们现在很多伟大的软件项目,都构建在Linux的基础之上,不说用于支撑谷歌,阿里,百度等巨头业务的后台大型服务器,现在风靡世界的安卓操作系统,也是构建在Linux之上的,可以说,没有当年Linux......
  • java实现C语言编译器:实现有参数的函数调用
    上一节,我们实现了没有参数传递的函数调用,本节,我们看看如何实现有参数传递的函数调用。有参数的函数调用要比无参数的函数调用复杂的多,一个难题在于,我们需要确定参数变量的作用域,例如下面的代码:inta;voidf(inta,intb){intc;c=a+b;}在代码里,有两个同名变量都......
  • 拼多多接口|api接口数据采集获取商品详情数据源代码Java演示
    ​拼多多提供了商品API,可以通过该API获取拼多多所有商品的详细信息,具体步骤如下: 申请开放平台接入。注册获取apikey和apisecret,调用API时需提供。调用拼多多API,获取商品详情。请求参数:参数说明通用参数说明version:API版本key:调用key,测试key:test_api_......
  • 书写高质量JavaScript代码的要义(The Essentials of Writing High Quality JavaScript)
    原文:TheEssentialsofWritingHighQualityJavaScript才华横溢的StoyanStefanov,在他写的由O’Reilly初版的新书《JavaScriptPatterns》(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情。具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使......