手写操作系统必掌握基础:函数调用约定

news2024/11/19 5:43:58

哈喽,我是子牙,一个很卷的硬核男人。深入研究Windows内核、Linux内核、Hotspot源码…聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写模拟器、手写编程语言…

目前我已经做了两个成熟的课程:手写JVM、手写OS,感兴趣的小伙伴可以关注我的公众号【硬核子牙】

今天想跟大家聊什么呢?如图

这是一位学员在学习完函数调用约定那部分内容问我的问题,因为他问的这个问题我想到大家在尝试写OS的时候肯定有诸多问题,而这些问题我遇到过,或者我帮我的学员们解惑过……

所以我准备写系列文章,把我写OS时遇到的,以及我的学员在写OS时遇到的问题,都分享出来。系列文章可关注公众号【硬核子牙】观看,相信你写OS时或者平时研究技术底层时遇到的问题,在这里都能找到答案!因为要做课程比较忙,不定期更新…

今天就函数调用约定与大家分享:

  1. 什么是函数调用约定

  2. 函数调用约定有哪些

  3. 函数调用约定受哪些因素影响

  4. Windows、Linux、Mac与调用约定的关系

正片开始,enjoy~

因为要照顾不同基础的小伙伴,对于有基础的小伙伴可以略显啰嗦。那你可以:一,可以不用看这篇文章;二,可以跳到末尾看结论

01

是什么

先做个普及:函数调用约定是什么。因为如果你没有接触过汇编、C语言、C++,你确实没听过这玩意,但是这玩意非常非常非常重要!

如果你想写OS或者研究OS、研究底层技术如虚拟机、搞破解、写游戏外挂……你就得先通过规律确定函数调用约定,才能保证你后续的行为都是正确的!

函数调用约定,见名知意,与函数相关,是一种约定。举例说明

int add(int a, int b, int c);

调用约定就是约束编译器在编译这段代码的时候,对于参数如何处理,对于参数的处理不同,又影响其他行为,什么意思呢?我展开了说

如果你写Java或者Python等高级语言的代码,你可能从来没有关心过这个问题:传递参数的时候,是从右向左传参,函数从左向右传参?是通过寄存器传参,还是通过栈传参,亦或是栈+寄存器传参?如果通过栈传参,就破坏了栈平衡,那如何平栈?

总结来说就是三个问题:

  1. 传递参数是用寄存器还是栈

  2. 传递参数是自右向左还是自左向右

  3. 堆栈平衡由调用方做还是被调用方做

接下来说说不同的调用约定是如何处理这三个问题的

02

有哪些

常见的调用约定有:cdecl、stdcall、fastcall、System V AMD64

先说下cdecl,c declaration,是c/c++在Linux平台下默认的调用约定,即gcc、g++默认的调用约定。其实Mac的默认编译器Clang,默认的调用约定也是这个!不借助寄存器传参,即基于栈传参。传参顺序是自右向左,由调用方平栈

为什么大家都喜欢用cdecl呢?老牌!兼容性好!可移植性好!我写的OS,不论是汇编代码还是C代码,都遵循这个调用约定

stdcall是Windows平台用的比较多的调用约定,跟cdecl的区别就是它是外平栈,即由被调用方平栈

fastcall就比较特别了,也比较复杂:如果参数个数少于两个,就通过寄存器ecx、edx传参,如果参数超过两个,就使用寄存器+栈组合传参,由被调用方平栈

最后一个System V AMD64,一看就是x64用的,可以把它看成fastcall plus,即借助寄存器传参。在x86下叫fastcall,因为x86通用寄存器只有6个,所以只能拿出来两个传参用。在x64下,又新增了r8-r15,所以可以有更多寄存器可以拿来传递参数

因为借助寄存器传参,免去了CPU读写内存的时间,所以快速调用的性能是高于cdecl、stdcall的

可不可以改呢?自然是可以的,语法如下

但是有例外,x64下,Windows、Linux,会忽略修改调用约定,即只支持System V AMD64

03

总结

前面分析得差不多了,这里做下总结:

1、函数调用约定受OS架构、编译器影响

2、Linux平台,默认的编译器,c语言是gcc,c++是g++。x86架构,默认调用约定都是cdecl。x64架构,默认的调用约定是System V AMD64 ABI,约定详情如上所述

3、Windows默认使用的编译器是VC。x86环境下,提供的API默认使用stdcall,程序员编程默认使用cdecl。x64环境下,默认的调用约定是x64调用约定,4个寄存器+栈传参,约定详情如上所述

4、顺便提下Mac,默认编译器是clang,其他跟Linux一样

往期好文推荐

手写操作系统+文件系统开源啦

开发操作系统内核环境搭建

圆梦,手写了一个操作系统

手写操作系统三期

手写OS三期还在招生,三个月时间,八大专题。课程会在合适的节点穿插讲汇编、C语言、操作系统内核、硬件、gcc、elf、Makefile等关联知识,直播教学+课上手敲代码+录播永久观看权限+课后答疑+课后练习+阶段练习,助你真正学会操作系统,对操作系统课程感兴趣,可以关注我的公账号【硬核子牙】咨询了解

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

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

相关文章

RTX4060 系 2399 元起,NVIDIA 又赢麻了

就在上周,NVIDIA 正式官宣了 RTX40 系显卡家族中更加主流的三款新品。 分别是 RTX 4060、RTX 4060 Ti 8G 以及 RTX 4060 Ti 16G。 其中 RTX 4060 Ti 8G 解禁时间为本月 23 日晚,24 日上架开售。 而 RTX 4060、RTX 4060 Ti 16G 要等到七月份。 价格部分…

2023年湖北建筑架子工报名流程?报名需要什么资料?考试一次过?

2023年湖北建筑架子工报名流程?报名需要什么资料?考试一次过? 建筑架子工证是建筑行业必备的证书之一,它是证明持有人可以在建筑工地上从事搭建脚手架、模板等施工工作的重要证明。启程别告诉你架子工的报名流程和资料。 百度搜一…

测试提效1-电商一键创单的实现

因电商项目不同场景下单特别多,而走前端流程特别慢。所以在某些测试场景需要特定配送方式 和 特定配送状态数据,本次实现快速创建。 1、前端页面 前端页面采用vue ,页面需要的属性或字段,打算包括 环境env、店铺(准备了3种不同模…

一种新的爬虫网络解锁器

事出原由 遇到一个需要采集境外电商的需求,相比国内各种层出不穷的反爬手段,境外产品更注重于用户行为和指纹上。 所以笔者在想是否有类似于指纹浏览器的环境可以提供给爬虫采集器使用。 经过检索,找到了一种名为爬虫网络解锁器的新兴产品…

SAP: 建立HTTPS 连接时,报错 ICM_HTTP_SSL_PEER_CERT_UNTRUSTED

报错1: SSL handshake with tpm-uat.jlbry.cn:443 failed: SSSLERR_PEER_CERT_UNTRUSTED (-102)#The peers X.509 Certificate (chain) is untrusted##SapSSLSessionStartNB()SSSLERR_PEER_CERT_UNTRUSTED# SSL:SSL_read() failed (536872221/0x2000051d)# >…

【正点原子STM32连载】第十四章 蜂鸣器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十四…

【无标题】ELISA-3(加装跟踪装置)—让群体协作更智能!

群体智能是近年来发展迅速的一个人工智能学科领域,通过对蚂蚁、蜜蜂等为代表的社会性昆虫群体行为的研究,实现分布式等智能行为。作为新一代人工智能的重要方向,群体智能通常用于无人机、机器人集群的协同作业。目前,群体智能在基…

零操作难度,轻松进行应用测试,App专项测试之Monkey测试完全指南!

目录 前言: 一、 Monkey测试的基础参数 1.1 事件类型参数: 1.2 覆盖包 1.3 事件数量 二、 Monkey测试的高级参数 2.1 稳定性级别 2.2 策略参数 2.3 包含选项参数 三、 附加代码 四、 总结 前言: 在移动应用的开发过程中&#xff0…

数据结构(C语言):有序顺序表的设计及相关操作函数

一、题目 有序顺序表的设计 实验要求: 有序顺序表的操作,包括初始化,求数据元素个数,插入,删除和取数据元素。放在头文件中(建议尝试用动态数组实现有序顺序表);注意有序顺序表的…

【正点原子STM32连载】 第十七章 串口通信实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十七…

2023年25个Java8面试问题和答案

Java是一种非常流行的编程语言,从Android应用程序到物联网(IoT)无处不在。事实上,根据Codeplatoon的数据,Java在1年的招聘信息中排名#2022。考虑到它的普遍存在,对精通Java的专业人员的需求仍然很高也就不足…

【vlan高级特性——super vlan概述】

今天给大家分享Windows常用cmd网络命令,希望对大家能有所帮助! 1、arp [option] [address] 显示/修改ARP缓存 执行命令:arp -a 参数说明: 显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表。 ARP -s inet_addr eth…

那些30多岁的测试工程师都是怎么走过来的?

最近工作真的不好找了,感觉身边的朋友明显变得焦虑了,一个个都在抱怨生活的迷茫和疑惑。 30岁测试员该何去何从? 如今我们往往能够看到网上的各种新闻,什么“30岁是程序员的一道坎“ “非诚勿扰:32岁 程序员登台,遭美…

【Java-Crawler】爬取动态页面(WebMagic、Selenium、ChromeDriver)

WebMagicSeleniumChromeDriverMaven 爬取动态页面 一、需要下载的资源和引入的依赖资源依赖 二、实战代码测试效果 在上一篇说WebMagic框架的时候( 一文学会WebMagic爬虫框架),提到了WebMagic仅能解析静态页面,满足不了小编的爬虫…

chatgpt赋能Python-python_numpy转置

Python中的Numpy转置:使用transpose()函数 在Python中,Numpy是非常常用的一个科学计算库,它提供了大量的数学函数、矩阵计算等功能。其中,矩阵的转置是一个非常基本的运算,在Numpy中,我们可以使用transpos…

SSRS rdlc报表 六 报表分组和总计

报表分组和总计在报表中是一个很常用的功能,比如我们需要按部门进行分组,统计每个部门的费用支出,或者在进一步分组,每个部门每个月的费用支出,通过rdlc报表,很容易实现这个需求。 我们下面要讲解的案例&a…

Thinkphp漏洞详解合集

文章目录 Thinkphp6.0.12LTS反序列化漏洞环境漏洞分析 thinkphp lang命令执行环境影响版本漏洞分析漏洞复现 CNVD-2018-24942(t5RCE)环境影响版本漏洞分析漏洞复现 Thinkphp3.2.x命令执行环境漏洞分析漏洞复现 thinkphp-2x-rce漏洞环境影响版本漏洞分析 Thinkphp5.0.23变量覆盖…

人机交互软件工程视角 第3-11章部分课后习题答案

4. 对于用于帮助儿童之间进行交流和合作的移动设备, 核心可用性目标: 简单易用性:移动设备应该具备简单直观的界面和操作方式,以便儿童能够轻松理解和使用。 可靠性:设备应该稳定运行,并且提供可靠的通…

什么是智能制造?制造企业该如何发展?

智能制造是落实我国制造强国战略的重要举措,加快推进智能制造,是加速我国工业化和信息化深度融合、推动制造业供给侧结构性改革的重要着力点,对重塑我国制造业竞争新优势具有重要意义。 ——摘自《中国制造 2025》 概念的提出 德勤公司(Delo…

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

背景 上一篇中,我们使用了 PAI-Blade 优化了 diffusers 中 Stable Diffusion 模型。本篇,我们继续介绍使用 PAI-Blade 优化 LoRA 和 Controlnet 的推理流程。相关优化已经同样在 registry.cn-beijing.aliyuncs.com/blade_demo/blade_diffusion镜像中可以…