难怪我看不懂,call_stub居然这么玄乎

2023-12-22 19:50

本文主要是介绍难怪我看不懂,call_stub居然这么玄乎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。

手撸过JVM、内存池、垃圾回收算法、synchronized、线程池、NIO…
在这里插入图片描述

最近正在写三色标记算法 _

这样的硬核男人,怎么才能认识他?关注:硬核子牙

聊点啥

这篇文章想跟大家聊聊Hotspot源码的call_stub,如图
在这里插入图片描述

这啥?这篇文章目前还不适合你,默默关掉吧,我理解的!

为什么要聊这个?我又看不懂!(白眼)给我硬看!

这个问题是卷Hotspot的小伙伴问得比较多的,每次回答就像顺藤摸瓜一样,小伙伴们顺着我的回答抛出一堆问题,我怕了,写篇文章把讲透吧,后面谁来问,这篇文章丢过去。看不懂?多看几遍!

坦白讲,就这么一段代码,涉及到的知识点还真不少:

  1. 函数指针
  2. 变量定义花招

铺垫知识

先说宏,比较简单,就两个知识点:

  1. 宏定义,通过#define定义
  2. 宏展开,预处理阶段直接替换

打个比方
在这里插入图片描述

这是比较简单的,有的宏定义就像函数一样,还传参,把人搞疯了!万变不离其宗,无脑替换就可以了。

接下来谈谈函数指针,这个一两句话讲不清,我就举个例子了
在这里插入图片描述

总结一下:函数指针的强大就在于它可以用来定义函数,这个函数你给它什么地址,它就把那块内存当成函数执行

如果这样说你还是不懂,百度一下吧

好,最后一个铺垫知识:花样定义变量
在这里插入图片描述

OK,万事具备,开始卷。

顺便提一嘴,我在做手写JVM小班,就是以手写JVM为契机教大家底层如:汇编、C、C++、操作系统…底层最重要的不是视频,而是老师本人在你遇到问题的时候能指点你。如果你想学习底层,想成为技术大牛,来找我。

开始卷

点开call_stub,是一个函数,长这样,函数体是一个宏
在这里插入图片描述

找到宏定义
在这里插入图片描述

手动展开
在这里插入图片描述

继续展开
在这里插入图片描述

还有一个碍事的CallStub,继续展开
在这里插入图片描述

最终结果
在这里插入图片描述

_call_stub_entry是什么?是JVM调用Java函数的那座桥。指向一段内存,这段内存代码在这生成的
在这里插入图片描述

这个函数,还有一个:entry_point,是看懂Hotspot运行时的关键。然,这两座大山将99%的人拒之门外。

当然,不包括我,我用内联汇编模拟写了一遍

在这里插入图片描述

OK,就到这里,清晰明了。

这篇关于难怪我看不懂,call_stub居然这么玄乎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525254

相关文章

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

Python __call__ 用法 作用

当一个对象为可被调用对象时,callable(object)返回为True,否则为False: Python中的对象有可被调用和不可被调用之分。 def func_test():print("func_test run")class class_test():def __init__(self):pass# func_test is callable return Trueprint("fu

ubuntu下qt编译显示Cannot connect creator comm socket /tmp/qt_temp.xxx/stub-socket的解决办法

Cannot connect creator comm socket /tmp/qt_temp.u14973/stub-socket: No such file or directory   于是查了一下,知道qt不能用gnome-terminal执行,需要使用x-team,于是想到了解决方法: 找到:工具(Tools)->环境(environment)->系统(Sy

Qt 错误qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

今天运行程序中有一个从网页下载文件到本地的功能运行输出下列错误         qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error     qt.network.ssl: QSslSocket: cannot call unresolved function TLSv1_client_method

js apply和call方法的使用说明和区别

在JavaScript中,apply和call都是函数对象的方法,它们允许你改变函数调用时的上下文(即this值),并且可以显式地传入参数。这两者的主要区别在于如何传递参数。 call 方法 call方法使用一系列的参数来传递给目标函数。 语法 func.call(thisArg, arg1, arg2, ...argN); thisArg:在函数被调用时,作为this值被传递给目标函

开机就能打?没那么玄乎!客观分析 “狂躁许可”漏洞(CVE-2024-38077)及其影响范围

一、事件背景 2024年7月9日,微软官方发布了一个针对“windows远程桌面授权服务远程代码执行漏洞”(CVE-2024-38077)的修复补丁包,起初并没有引起大家的警觉。今日在国外某网站上疑似漏洞的作者公开了该漏洞的“POC验证代码”。一时激起千层浪,该漏洞开始疯狂发酵并在安全圈里转发。 该文章的原文链接为: https://sites.google.com/site

Android破签:密钥native方法里了?不会C也看不懂IDA?用这个工具吧~

吉祥知识星球http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247485367&idx=1&sn=837891059c360ad60db7e9ac980a3321&chksm=c0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene

酸爽! Intellij IDEA 神器居然还藏着这些实用小技巧 !

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 来源:r6d.cn/ZA93 概述 Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intellij IDEA技巧分享给大家。本文是这个系列的第一篇,主要介

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Arathi Basin

PVP战场阿拉希盆地15人 /i 开局队伍分配:圣骑士飙车光环 /i [铁匠铺]坦克、治疗3个、输出6个(10人组) /i [伐木场]坦克、治疗、输出2(4个人组) /i [农场]留一个守(1个人组) /i  不要恋战,不要几个人打1个人,猎人假死脱战支援 /i  防守的人做个宏:NC请求支援,点几下就是几个人 /i 三点防守分配

【Python报错已解决】`SyntaxError: can‘t assign to function call`

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言:一、问题描述:1.1 报错示例:1.2 报错分析:1.3 解决思路: 二、解决方法:2.1 方法一:检查函数返回值2.2 步骤二:返回可变对象 三、其他解决方法四 总结 引言: 在Python编程中,你