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

更详细的讲解和代码调试演示过程,请参看视频

用java开发C语言编译器

如果你对机器学习感兴趣,请参看一下链接:

机器学习:神经网络导论

我们的操作系统通过增添内核接口导出机制后,已经可以作为平台,运行应用程序了,但目前应用程序的开发有一个不足就是,我们只能使用汇编语言开发应用程序,用汇编语言开发程序实在太累了,如果能使用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语言开发的应用程序。

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

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

7838cde3ea45

这里写图片描述

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

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

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

7838cde3ea45

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”(不要与吞咽或忽略异常的不良做法相混淆)。 …

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是,尽管也有一些有趣的考虑,但读取模型经常被忽略。 在本文中,我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说,随着我们项目的迭代以及业务的越来越复杂,项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时,我们就需要考虑是否需要对项目进行重构了,或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击,攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击,请按照下面这些通用步骤操作&…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中,我谈到了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行后续介绍。 你好,世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号,而你需要把它们传输到服务器,这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中,这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

ssh图片上传 java_ssh上传并显示图片

struts部分:attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

使用JUnit规则进行干净的集成测试

JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这些简化了灯具控制。 作为示例,我们将看看如何基于…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要互联网的支持,代码部分在用户电脑上执行 使用…

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…

OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中&#xff0c;我们使用了以下OpenMap类&#x…

java rx.observable_Rxjava2 Observable的条件操作符详解及实例

简要&#xff1a;需求了解&#xff1a;在使用 Rxjava 开发中&#xff0c;经常有一些各种条件的操作 &#xff0c;如比较两个 Observable 谁先发射了数据、跳过指定条件的 Observable 等一系列的条件操作需求&#xff0c;那么很幸运&#xff0c; Rxjava 中已经有了很多条件操作符…