PhoneMe Advanced 浅度探索六----C特性和CVM

C 与汇编混合编程:符号链接、调用约定与参数传递 本文详解汇编与C语言混合编程的实现原理,涵盖PUBLIC与EXTERN指令的使用、32位调用约定(参数从右往左压栈、调用者清栈)、栈帧布局及寄存器保护规则。通过实例展示C调用汇编函数与汇编调用C库(如printf)的写法,并对比32位与64位(Windows x64)在参数传递、返回值和栈对齐上的差异。强调边界清晰的重要性,确保跨模块调用稳定可靠,适用于性能优化、硬件操作及学习底层机制场景。 阅读详情

 

Mark Lam has been a virtual machine engineer in the JavaME CDC team at Sun Microsystems for over 6 years. Before joining Sun, he was a real-time embedded systems developer for 6+ years, working on application frameworks, graphics systems, networking protocols, game development, and fault tolerant systems amongst other things, on devices ranging from 64KB 8bit uControllers to 32-bit RISC machines.

原文URL:http://weblogs.java.net/blog/mlam/archive/2006/11/c_further_with.html#more

 

         我已经谈论过一些关于CVM的深奥的知识,并且我想是时候说一些真正的技术了。因此,我花了昨天大部分的时间来制作了一个关于CVM的结构图来向你展示它的结构,但它比我想象的要长。结果,昨天没有放上blog。今天有希望能把它完成,并在周一补写到blog。它看来像放在坚果里的CVM。

       另外,我使用 InkScape 来存放我的CVM结构图,我不知道这是不是最好的,但它适合做这个工作。因此,我想我在这给一个说明万一其它人也在找这样的工具。我使用 InkScape 是因为我在SVG里渲染CVM结构图,因此我需要缩放它来匹配任意你需要的解决方案而不用考虑细节。但我也发现我的浏览器不能快速的显示SVG格式的图片(可能我没有导出正确的格式),如果有人发现你的浏览器不支持SVG格式,请告诉我,我会把它转成PDF格式。

       顺带说一下,我想感谢留言的2位朋友,这让我知道我没有对牛弹琴。

为什么用C来写CVM

       这是C和C++之间的选择?像我在前面文章里指出的一样,CVM的体系非常匹配对象类。使用C++已经是一个选择。我们选择C的原因是因为C编译器比C++编译器在嵌入式领域有良好的实用性。我提醒你可移植性是CVM的一个主要目标,也是为什么它在嵌入式领域能够生存的原因。有代表性的,当硬件更新,它总是和C编译器一起的,而C++编译器可能会或者可能不会更新。我们希望Java平台能够在任何平台运行,事实上这和选择C是一样的。

       第二个要注意的地方, 我们发现一些C++编译器总是生成非常低效的代码在一个周期(2到3个周期),这对任何嵌入式软件都是不好的。现在,在你跳到结束前,我不认为C++原因本身是低效的。私下的,我是一个C++的爱好者,我知道它怎样让你写出真正一流和高效的代码(像计算编译器协作)。或者臃肿的代码。我的建议是在这个时候,一般的人们不要过多的关心C++在给了你多少的工具链(和C比)。不要说任何C++比其它好很多的话。事实上,C++有一个坏名字,我想这非常不幸。

       照顾好自己,7年前,CVM就决心做些什么。低效的代码生成在3,4年前被察觉,或许这些关于实用性和效率的问题已经被修复了。

       其它我想要说的关于便携性和性能的在下面

便携性的一个注解

       我在前面提过,CVM的代码是由在shared目录里最高的代码密度组织成的(相对于特殊平台)。给你一个特别的概念,在2003年,我们在shared目录和platform目录为动态适应编译(JIT)测量代码线作对比。在这种情况下,shared部分包括 RISC层在 portlibs 目录,开始共享代码的比率是80-90%,保留CPU和OS的特别代码。大多数由汇编代码组成的非共享代码生成的特定CPU体系的常规程序。如果我们考虑VM空闲因素,这个对共享代码的比率会更高。我们没有实际测量这个,但如果我乱猜的话,我说他会上升到95%。

       一个汇编程序非常小的子集作为编译器代码和VM休眠之间的过渡是非常必要的。保持所有的焦点在特殊CPU体系的优化上。一个好消息是,除了少量的粘合代码外,CPU特殊的优化代码都是可选的。这意味着你不需要为JIT执行所有的命令来保证操作的正确。代码的共享部分(小范围汇编代码)对性能的提升仍然有重大的意义(50~70%的提升)。附加的优化根据需要或VM开发者的时间

       另一个要注意的问题是关于CVM体系的。一个 VM开发者必须能够完成一个CVM的完全最小效果的移植,但仍然会得到许多性能上的原因。那么,如果时间允许,尽可能的调整和优化以得到附加性能的提升。这就是为什么我们大多数的更新和提升在用C写的共享代码中。

       提升仅仅是一个CVM build的解释(比如禁止JIT),它会带来少许的成就。这儿只有一个常规汇编程序需要编写。这个程序通常被称为“本地调用(invokeNative)”,它的责任是成为本地代码和解释器的粘合器。它的全名是“(CVMjniInvokeNative)”。在这儿有例子。如果你做linux移植(或其他系统),那么你会有个很好的开始。如果不是,你将执行HPI,但你可以使用其他已经存在移植的相关代码。

       总的说来,CVM容易移植不仅仅依靠减少必须进行的移植工作量。(共享代码对平台特殊代码的高比例),它的目标总是允许移植成就相对于现阶段。对开发者来说,为了适合开始时间它是很容易分离的。它总是增加系统的易测性。

性能的一个注解

       我的职业教育背景是硬件。因此,随时我听到的关于某些软件的创新都会让我开始提高系统的性能。怎样的软件能使硬件超过它现在的性能运行的更快?答案是未知的。

       任何软件能取得的最快速度是作为运行在硬件上的命令或限制。无论如何,硬件靠自己来提升性能不是那么容易的。他让软件指挥(direct)硬件来有效的工作。“指挥(direct)”翻译成管理成本(management cost),我们通常不喜欢为不必要的东西买单。因此,用软件来提升性能相对更好的硬件是一个很好的主意。这让我们花费较少的代价来取得更多的性能。

       管理成本(management cost)是影响代码的移植性和可维护性。代码的可维护性、易移植性这个话题不需要太多的解释对于那些每年有很多维护经费的开发者。

       象CVM代码的可移植性、可维护性总是非常重要的。现在phoneMe开源了,每个人都能够贡献bug 修改(fixes)和增加(enhancement)。我想提醒大家代码需要坚持维护,这对每个人都非常重要。如果开源的一段代码没一个人能读懂是怎么一回事??这可能用密匙来加密。我说丢弃因为代码恢复往往是恢复甚至是有时作者已经通过。(完全翻不通:After all, how open-source is a piece of code if no one can understand it? It might as well have been encrypted with the secret key thrown away. I say thrown away because unmaintainable code also tend to be unmaintainable even to its creators once some time has passed.)

       关键点是我们不需要牺牲可维护性在性能上。这是一个谬论,当我们不能在同一时间拥有高性能和可维护的代码。非常难得的是有异常在我们可维护的代码中。无论怎样,我们应该包含损害不至于通过基础代码影响本地化。(The point is that we shouldn't sacrifice maintainability in the name of performance. It is a fallacy to think that we can't have both high performance and maintainable code at the same time. Very rarely will there be an exception where we might have to sacrifice some maintainability. Even then, we should try to contain the damage so that it is localized and not wide spread across the code base.)

       这是CVM的解释程序循环用C写而不是汇编的一个原因。这的确可以用汇编来写,但代价是巨大的,在你移植和维护的时候。在实践中,我们发现CVM用C写的解释程序循环的效率和优化的汇编循环差别不大,但移植性和可维护性很好。

结束

谢谢大家听我讲了这么多,下次将介绍CVM的世界,子系统,数据结构,还有一张大图片

祝有美好的一天!

【近源攻击】badusb制作 BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。 阅读详情

相关推荐

蓄热式加热炉燃烧技术

蓄热式加热炉燃烧技术

weixin_37928884的博客 2735

invokeNative_i386.S的分析小记

    这个函数将Java的Native函数调用转换为C函数调用,Java虚拟机将所有的参数传递到    Java堆栈中,并且期望返回的结果放置在同样的地方。因此,就必须把Java堆栈中的    参数拷贝到C堆栈中(或者寄存器),并且将函数的返回值在拷贝回Java堆栈中。        这样的过程产生的性能损失很小,但是这样的处理方式却避免了为每一个Native函数来    生称一个存根。   

lyreee的专栏 1280

MIL-STD-1553B协议解析与工程实践指南

MIL-STD-1553B作为军用航空电子系统的核心通信协议,采用命令/响应式串行总线架构,通过双冗余设计实现高可靠性数据传输。该协议定义了三类终端设备(总线控制器、远程终端、总线监视器)和六种标准消息格式,典型应用包括飞行控制系统、导航设备等关键航电组件的实时数据交互。深入解析模式代码机制和状态字位域定义,其中传输向量字(10000)和同步命令(00001)等关键指令在分布式系统时间对齐、故障诊断等场景发挥重要作用。工程实践中需特别注意78Ω终端阻抗匹配、4-12μs响应时间窗口等硬性指标,结合变压器耦合

weixin_33431149的博客 436

CVM栈和代码的执行

原文链接:http://weblogs.java.net/blog/2006/11/30/cvm-stacks-and-code-execution CVM栈和代码的执行欢迎来继续讨论phoneME Advanced VM(CVM)的内部结构。如果你错误过了我们之前的讨论,就先从

文山的专栏 1360

Ubuntu24.04下Librenms的完整安装与配置指南

本文提供了在Ubuntu 24.04 LTS系统上完整安装与配置LibreNMS网络监控系统的详细指南。内容涵盖系统环境准备、依赖安装、源码获取、PHP/数据库/Nginx配置、Composer安装、网页向导设置以及设备添加与日常使用,帮助用户快速部署一套功能强大的开源网络监控解决方案。

tgb3456789的博客 1140

基于 Qt C++ 的智能工厂数字孪生系统

你想要实现一个基于 Qt C++ 的智能工厂数字孪生系统,核心是 **Qt 3D** 场景搭建 + **实时数据驱动** 设备模型。下面我将为你提供一个完整的解决方案,包含 **核心思路、实现步骤、完整代码示例** 和 **注意事项**。| **渲染层** | 3D 场景搭建、设备模型加载、实时动画渲染、用户交互。| **业务逻辑层** | 数据处理(滤波、转换)、设备状态管理、动画逻辑控制。| **数据层** | 实时采集设备数据(如传感器、PLC、MES 系统),提供数据接口。

寒寒豆豆软件公司的博客 195

PhoneMe 浅度探索 一 (PhoneME Advanced 目录结构)

The article translate from Darryl Moceks blog. Darryl Mocek is a staff engineer for sun microsystems,Inc. currently working on J2ME CDC and related techonlogies. the URL is : http://weblogs.java.net/

vrix的专栏 1153

STM32 使用IQmath实现SVPWM

文章目录SVPWMIQMATHIQmathLib测试部分程序附件 SVPWM SVPWM是空间矢量脉宽调制(Space Vector Pulse Width Modulation)的简称,通常由三相逆变器的六个功率开关管组成,经过特定的时序和换相所所产生的脉冲宽度调制波,最终输出的波形可能会十分接近理想的正弦波形。 具体如下图所示;左侧为复平面,即空间矢量,右侧为时域的正弦波形; 关于SVPWM原理的文章非常多,这里可以推荐一下网上一个非常不错的教程《SVPWM的原理及法则推导和控制算法详解第五修改版》,

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 2万+

10个完整汇编实例:排序、字符串与递归算法

本文提供10个16位实模式下可运行的汇编程序,涵盖冒泡排序、字符串反转、进制转换、阶乘与斐波那契计算等经典算法,附逐行解析。重点讲解寄存器使用、循环控制、栈操作、除法清零、符号比较、字符处理等核心技巧,揭示如PUSH/POP CX保全计数器、DIV前清DX、ASCII转换、溢出处理等关键细节。通过实践掌握底层逻辑,提升汇编编程能力。

软件工程师文艺 245

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2657

汇编调试实战:DEBUG、Turbo Debugger、GDB 与 IDA

本文系统讲解汇编调试技巧,涵盖 DEBUG.exe 基础使用(寄存器查看、单步执行、内存操作)、Turbo Debugger 图形化调试,以及 GDB(32位Linux)和逆向工具(IDA/Ghidra)的高级应用。重点解析寄存器管理、断点设置、栈平衡检查与常见错误排查,如死循环、内存越界、栈崩溃等,强调静态分析识别函数边界、动态分析验证逻辑流程。掌握这些方法可高效定位底层缺陷,提升汇编开发能力。

软件工程师文艺 249

三维空间刚体运动4-3:四元数线性插值方法:Squad

摘要:四元数插值三个方法Slerp、Squad和Spring既复杂又很重要,为了详细阐述,故每个方法独立成一篇博文讲解,没有插值的四元数是没有灵魂的,插值的重要性不言而喻。Slerp是经典的两点间一阶连续可导插值方法,Squad方法在Slerp的基础上实现多点间的一阶连续可导,而Spring则可以实现多点间的二阶连续可导,更适合复杂的曲线,此系列博文也是国内首篇介绍Spring的中文资料。

shao918516的博客 9217

ARM 汇编调试入门:MOV、LDR 和 STR

掌握,最重要的是看清数据移动的方向。

ccddvvv的博客 206

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ARM 汇编入门(八):NEON 与 Advanced SIMD 全解析

本文系统讲解ARM NEON/AdvancedSIMD核心机制,涵盖寄存器视图、通道记法、算术运算、掩码选择、置换、查表、饱和处理、归约、点积及结构化访存。通过LD1/ST1等指令实现16倍吞吐提升,适用于图像、音频、DSP与量化推理。重点解析SDOT/UDOT加速INT8推理、FMLA融合乘加、BSL/BIF无分支控制、TBL/TBX查表及尾部处理策略。强调从编译器自动向量化到intrinsics再到手写汇编的工程优化路径,实现性能极致压榨。

m0_58087444的博客 342

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ARM 汇编入门(十):标量浮点与 VFP 指令全解析

前九篇从架构、ARM32、AArch64 寄存器/寻址、算术位操作、分支、调用约定、内存模型、NEON、SVE/SVE2 一路走到这里。这一篇回到标量浮点子系统:AArch64 用统一的 V0–V31 寄存器文件同时服务标量 FP、NEON 和 SVE;FPCR 控舍入/非规格化/异常陷阱,FPSR 记粘性异常标志;FMADD 单次舍入、FMAXNM 跳过 NaN、FRECPE/FRSQRTE 做快速倒数/平方根估计;最后落到 FP16/BF16 这些机器学习降精度扩展。

m0_58087444的博客 221

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ARM 汇编入门(十一):异常等级、中断与向量表全解析

本文系统讲解AArch64架构下的系统级编程核心机制:四级特权模型(EL0–EL3)与TrustZone安全世界正交设计,异常分类(同步/异步)、硬件自动异常入口流程、VBAR_EL1向量表布局、ESR_EL1解码、GIC中断路由、SVC/HVC/SMC调用约定、DAIF屏蔽、ERET降级返回等。强调内核、Hypervisor、TF-A及裸机启动链开发必备知识,涵盖寄存器状态保存、异常处理框架与世界切换逻辑,是深入底层系统开发的关键一章。

m0_58087444的博客 167

C 语言:编译 → 汇编 → 链接 → 加载运行

C程序从源码到执行经历预处理、编译、汇编、链接四阶段,生成ELF可执行文件,由操作系统加载至内存并由CPU执行。关键点包括:交叉编译生成ARM指令;链接分静态与动态;入口为_start而非main;动态库需-fPIC保证位置无关性;嵌入式环境下可能跳过OS直接运行。

嵌入式开发,ARM Linux开发 459

ARM 汇编入门(十二):MMU、页表与虚拟内存全解析

本文详解AArch64 MMU核心机制:通过TTBR0/1_EL1实现用户/内核地址空间分离,TCR_EL1定义地址空间大小与页粒度,MAIR_EL1配置内存属性,四级页表实现虚拟地址到物理地址翻译。结合TLB维护、Break-Before-Make、AccessFlag惰性提交、KPTI及大页优化,构建安全高效的内存管理基础,是Linux/裸机启动中关键且易出错的环节。

m0_58087444的博客 277

ARM 汇编入门(六):栈、子程序与 AAPCS64 调用约定

AArch64汇编中,函数调用依赖AAPCS64 ABI协议,确保跨语言、跨编译器的二进制兼容。核心规则包括:寄存器分工明确(caller-saved可覆盖,callee-saved需保存)、栈指针SP必须16字节对齐、栈帧大小为16字节倍数;参数通过X0~X7(整数)和V0~V7(浮点/SIMD)传递,超出则压栈;大结构体传指针,小结构体拆入寄存器;非叶子函数须保存LR(X30),否则返回错误;标准prologue/epilogue维护调用链与栈安全。掌握这些规则,方能实现手写汇编与高级语言的无缝协作,避

m0_58087444的博客 284

汇编子程序设计:PROC/ENDP、栈帧与参数传递

本文系统讲解汇编语言中子程序的模块化设计,涵盖PROC/ENDP伪指令、栈帧管理(PUSH BP/MOV BP, SP)、参数传递(寄存器传参与栈传参)及调用约定(C、Pascal、fastcall)。重点解析栈帧布局、局部变量存储、返回地址偏移与栈清理机制,强调调用双方需遵循统一协议,实现可复用、可递归的高效汇编函数。

软件工程师文艺 303

直接操作 VGA 显存:用汇编控制文本显示

本文详解VGA文本模式下直接操作显存的原理与实践:通过段寄存器B800h访问显存,每字符占2字节(ASCII+属性),利用偏移公式(n×80+m)×2定位输出。属性字节控制颜色与闪烁,如1Ch为蓝底亮红字。使用MOV ES:[DI], AX结合REP STOSW可高效清屏,配合INT 10h实现光标重置与滚动窗口。深入理解显存映射,是掌握图形底层逻辑的关键。

软件工程师文艺 217

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 525

[学习笔记]超越超级大循环与原生RTOS:事件驱动架构如何改变嵌入式固件的可扩展性

RTC:事件处理器一旦开始,全部状态迁移、进出动作、输出事件必须全部执行完毕才返回;同一个组件,当前处理没结束,不会开始下一条事件。这不是架构给状态机额外施加的限制,这是UML状态图等全部状态机形式化本身固有的语义要求。如果迁移中途可以被打断,状态机会停留在未定义的中间状态。RTC保证两次事件之间,状态机永远处于明确定义的合法状态,便于分析与测试。

MiKiJT的博客 236

DPU安全组与ACL性能测试:从规则爆炸到线速卸载的实战指南

本文深入剖析DPU安全组与网络ACL的底层卸载架构,通过两个完整实战测试矩阵,量化评估规则复杂度、有状态连接跟踪(Conntrack)及OVS Offload协同对RoCEv2性能的影响。结合真实故障排查案例与工具输出矩阵,揭示大规模云环境中安全组性能跌落的根因,并给出基于规则聚合与硬件表项优化的最优配置指南。

专注分享DPU、RDMA智能网卡/SSD(固态硬盘)产品测试与优化 339

嵌入式:2.STM32底层基础(存储、寄存器、时钟、总线、GPIO、寄存器点灯)

存储系统用来存放程序、数据、设备状态,核心三大作用:存放程序代码、保存运行时数据(全局、局部、栈、堆)、数据持久化(比如W25Q64 Flash,可以搭配文件系统)。

2401_86731574的博客 379
上一篇: arm体系结构的版本及命名方法
下一篇: PhoneMe Advanced 浅度探索五----JavaSE or JavaME
普通网友
普通网友 领域专家: 编程技术技术领域 领域专家: 编程技术技术领域
博客等级 码龄25年 2837粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值