首页 > 编程语言 >java开发系统内核:使用C语言开发系统应用程序

java开发系统内核:使用C语言开发系统应用程序

时间:2023-06-14 11:04:59浏览次数:38  
标签:java app 应用程序 C语言 api 开发 asm


更详细的讲解和代码调试演示过程,请参看视频
用java开发C语言编译器

更详细的讲解和代码调试演示过程,请参看视频
如何进入google,算法面试技能全面提升指南

如果你对机器学习感兴趣,请参看一下链接:
机器学习:神经网络导论

更详细的讲解和代码调试演示过程,请参看视频
Linux kernel Hacker, 从零构建自己的内核

我们的操作系统通过增添内核接口导出机制后,已经可以作为平台,运行应用程序了,但目前应用程序的开发有一个不足就是,我们只能使用汇编语言开发应用程序,用汇编语言开发程序实在太累了,如果能使用C语言就好了,例如当我们想要开发一个在控制台上输出一个字符的应用程序,如果代码能用C语言这么写就好了(app.c):

void api_putchar(int c);

void main() {
    api_putchar('C');
    return;
}

如果上面的代码能编译成二进制文件,并能通过系统加载执行,那么在我们的操作系统上开发应用程序就不必要像以前那么痛苦。我们这一节要做的是,研究如何使用C语言开发运行在我们系统之上的应用程序。

实际上,我们用C语言开发内核的步骤,可以平移到开发应用程序上。我们开发内核时,实际上遵循着的基本逻辑是这样的:用汇编开发底层接口,然后用C语言调用汇编语言导出的接口,实现业务逻辑。然后把C代码编译成二进制文件,接着使用objconv 工具把C语言反编译成汇编语言,下一步就是把原来的用汇编开发的代码跟反编译后得到的汇编代码合二为一,最后用汇编编译器把整合起来的汇编代码编译成一个统一的二进制可执行文件。

我们用C语言开发应用程序也遵循上面的逻辑。首先我们用汇编语言导出内核API接口,用C语言调用汇编语言导出的接口完成业务逻辑的编写,接着把C语言代码编译成二进制,再使用objconv反汇编,最后把两个汇编语言代码合二为一,统一编译成一个可执行的二进制文件。

基于上面的逻辑步骤,我们第一步要做的就是用汇编语言导出api_putchar函数调用的接口,实现代码如下(api_call.asm):

[SECTION .s32]
BITS 32
call main
retf

api_putchar:
  mov edx, 1
  mov al, [esp + 4]
  int 02Dh
  ret

%include "app.asm"

我们先看api_putchar部分,前面我们讲过,内核所有api都对应一个编号,向控制台输出一个字符的api编号就是1,要调用对应api时,只要把对应编号放入寄存器edx, 同时把参数提交给指定寄存器,最后调用2D号中断就可以了。

在代码的前面,我们首先执行语句call main, 也就直接调用main函数,这意味着用C语言开发程序时,主入口函数必须是main, 所有C语言开发的程序代码编译成二进制文件后,然后反汇编成汇编程序,反汇编后的程序文件就是app.asm,通过include指令把app.asm的代码整合到api_call.asm中来,最后使用汇编编译器nasm 编译 api_call.asm 所得到的二进制文件就是用C语言开发的应用程序。

因此我们通过以下步骤就可以使用C语言来开发应用程序了:
1, 完成api_call.asm 在里面导出C语言程序所需要使用的接口
2, 使用C语言,通过接口调用完成业务逻辑的开发,例如完成前面所述的app.c
3, 使用命令gcc -m32 -fno-asynchronous-unwind-tables -s -c -o app.o app.c 来编译C语言代码,
4, 使用objconv 反汇编步骤3所得到的二进制文件, ./objconv -fnasm app.o app_u.asm
5,使用我们早先开发的java工具对反汇编得到的app_u.asm进行预处理,去掉app_u.asm 里面一些无用的指令
6,使用nasm编译api_call.asm , nasm -o hlt.bat api_call.asm 得到二进制可执行文件hlt.bat
7, 把hlt.bat的二进制数据加载到系统中执行便是执行了用C语言开发的应用程序。

具体的操作步骤请参看视频,上面的步骤是一系列步骤精简后的过程,更详实的讲解和代码运行调试过程,请参看视频。

经过上述步骤后,把得到的二进制文件加载到系统进行执行后,所得结果如下:

java开发系统内核:使用C语言开发系统应用程序_java

可见运行hlt命令后,C语言开发的程序逻辑被执行,字符C正确的显示到了控制台窗口里,由此可见,经过上述步骤,我们是可以使用C语言在我们的系统内核基础上开发应用程序的。

更详细的讲解还请参看视频。

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

java开发系统内核:使用C语言开发系统应用程序_操作系统_02


标签:java,app,应用程序,C语言,api,开发,asm
From: https://blog.51cto.com/u_16160261/6476224

相关文章

  • 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的一些要素,例如避免全局变量,使......
  • Java_memcached-release 安装 原理 实例
     Java_memcached-release安装原理实例  一、了解和使用使用安装memcached在这一块已经有车了,就不再造了。一个日本君写的:长野雅广memcached-全面剖析.pdfheiyeluren(黑夜路人) Memcached-原理和使用详解.pdf  二、javamemcached客启端的调用   2.1下载客户端jar包......