linux 内核asmlinkage关键字总结
1,看一下asmlinkage的定义
CPP_ASMLINKAGE __attribute__((regparm(0)))
GCC中使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。
补充:C语言调用函数参数使用栈传递,有的说使用寄存器传递,上面的asmlinkage关键字主要用于这个作用,那么linux下有几个是使用栈传递,几个使用寄存器传递的呢。
#include <stdio.h>int fun(int a, int b, int c, int d, int e, int f, int g,int h)
{return a+b+c+d+e+f+g;
}int main() {int a = fun(1,2,3,4,5,6,7,8);return 0;
}
汇编查看
lark@ubuntu:~/test$ sudo gcc example.c -o example -g
lark@ubuntu:~/test$ objdump -d example
0000000000001129 <fun>:
1129: f3 0f 1e fa endbr64
112d: 55 push %rbp
112e: 48 89 e5 mov %rsp,%rbp
1131: 89 7d fc mov %edi,-0x4(%rbp)
1134: 89 75 f8 mov %esi,-0x8(%rbp)
1137: 89 55 f4 mov %edx,-0xc(%rbp)
113a: 89 4d f0 mov %ecx,-0x10(%rbp)
113d: 44 89 45 ec mov %r8d,-0x14(%rbp)
1141: 44 89 4d e8 mov %r9d,-0x18(%rbp)
1145: 8b 55 fc mov -0x4(%rbp),%edx
1148: 8b 45 f8 mov -0x8(%rbp),%eax
114b: 01 c2 add %eax,%edx
114d: 8b 45 f4 mov -0xc(%rbp),%eax
1150: 01 c2 add %eax,%edx
1152: 8b 45 f0 mov -0x10(%rbp),%eax
1155: 01 c2 add %eax,%edx
1157: 8b 45 ec mov -0x14(%rbp),%eax
115a: 01 c2 add %eax,%edx
115c: 8b 45 e8 mov -0x18(%rbp),%eax
115f: 01 c2 add %eax,%edx
1161: 8b 45 10 mov 0x10(%rbp),%eax
1164: 01 d0 add %edx,%eax
1166: 5d pop %rbp
1167: c3 retq0000000000001168 <main>:
1168: f3 0f 1e fa endbr64
116c: 55 push %rbp
116d: 48 89 e5 mov %rsp,%rbp
1170: 48 83 ec 10 sub $0x10,%rsp
1174: 6a 08 pushq $0x8
1176: 6a 07 pushq $0x7
1178: 41 b9 06 00 00 00 mov $0x6,%r9d
117e: 41 b8 05 00 00 00 mov $0x5,%r8d
1184: b9 04 00 00 00 mov $0x4,%ecx
1189: ba 03 00 00 00 mov $0x3,%edx
118e: be 02 00 00 00 mov $0x2,%esi
1193: bf 01 00 00 00 mov $0x1,%edi
1198: e8 8c ff ff ff callq 1129 <fun>
119d: 48 83 c4 10 add $0x10,%rsp
11a1: 89 45 fc mov %eax,-0x4(%rbp)
11a4: b8 00 00 00 00 mov $0x0,%eax
11a9: c9 leaveq
11aa: c3 retq
11ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
我们可以看到edi,esi,edx,ecx,r8d,r9d这几个寄存器 访问,另外的两个为pushq(栈访问)。
2,asmlinkage举例
相关文章:
linux 内核asmlinkage关键字总结
1,看一下asmlinkage的定义 CPP_ASMLINKAGE __attribute__((regparm(0))) GCC中使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(…...
⚡️如何在 React 和 Next.js 项目里优雅的使用 Zustand
前言 你是否曾感觉在 React 中管理状态简直是一场噩梦?如果你已经厌倦了不停地处理 props、context 和 hooks,那么现在是时候认识 Zustand 了。Zustand 是一个轻量级的状态管理库,它简化了你处理应用状态的方式。在这篇文章中,我…...
Pinpoint(APM)进阶--Pinot指标采集(System Metric/Inspector)
接上文 Pinpoint使用Pinot进行指标数据存储,Pinot流摄入需要Kafka 本文详解Kafka和Pinot的安装部署,以及Pinpoint的指标采集 Pinot 简介 Apache Pinot是一个实时分布式OLAP数据存储,专为低延迟、高吞吐量分析而构建,非常适合面…...
Mysql:使用binlog的一些常用技巧
1、如何查看binlog的存放路径 show variables like log% 执行结果: 2、如何清除binlog (1)按时间清除 purge binary logs before ‘2023-06-5 10:12:00’ (2)按文件文件名清除 purge binary logs to ‘mybinlog.0000…...
Electron 项目启动外部可执行文件的几种方式
Electron 项目启动外部可执行文件的几种方式 序言 在开发 Electron 应用程序时,有时需要启动外部的可执行文件(如 .exe 文件)。这可能是为了调用系统工具、运行第三方软件或者集成现有的应用程序。 Electron 提供了多种方式来启动外部可执行…...
前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)
文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…...
Linux入门:环境变量与进程地址空间
一. 环境变量 1. 概念 1️⃣基本概念: 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里&#x…...
【Jenkins实战】Windows安装服务启动失败
写此篇短文,望告诫后人。 如果你之前装过Jenkins,出于换域账号/本地帐号的原因想重新安装,你大概率会遇上一次Jenkins服务启动失败提示: Jenkins failed to start - Verify that you have sufficient privileges to start system…...
web实操5——http数据详解,request对象功能
http请求数据 现在我们浏览器f12的那些是浏览器给http格式数据整理之后便于我们阅读的。 原始的http格式信息: 就是按照一定格式和符号的字符串: 请求行:格式如下图 请求头:一个个key,value数据,用,分割…...
C# 如何动态加载程序集
程序集的加载,默认是从当前目录下查找,如果当前目录查找不到,然后再去系统目录中查找,依然查找不到就会从环境变量中查找,如果依然找不到,则会抛出一个异常 FileNotFoundException。 托管代码中࿰…...
前端基础的讲解-JS(10)
作用域链 通过上节作用域我们知道,当我们声明一个函数时,程序会生成一个独立的作用域,如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据 内部函数可以访问外部函数变量 的这种机制,用链…...
JNI整理总结
JNI JNI基础 JNI基础 JNI,java native interface,即java本地接口,是java调用本地化方法的接口,是为java编写本地方法,为jvm嵌入本地应用程序的标准化接口。首要目标是在给定的平台上采用java通过JNI调用本地化方法&am…...
aws中AcmClient.describeCertificate返回值中没有ResourceRecord
我有一个需求,就是让用户自己把自己的域名绑定我们的提供的AWS服务器。 AWS需要验证证书 上一篇文章中我用php的AcmClient中的requestCertificate方法申请到了证书。 $acmClient new AcmClient([region > us-east-1,version > 2015-12-08,credentials>[/…...
Spring Task详细讲解
✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景: 信用卡每月还款提醒银行贷款每月还款提醒…...
C++初阶 --- 类和对象(1)
类和对象(1) 一、类的相关内容1.访问限定符2.class关键字与struct关键字的区别3.类域 二、this指针三、成员函数存放在哪里?1. 函数的存放位置2. 练习题 一、类的相关内容 1.访问限定符 (1)C⼀种实现封装的⽅式&…...
《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接
《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭?基于半关闭…...
Anaconda 和 conda 是什么关系?就像 pip 和 python 一样吗
Anaconda 和 conda是 Anaconda Distribution 还是 Miniconda Anaconda 和 conda Anaconda 和 conda 之间的关系有点类似于 pip 和 Python,但又有所不同。 Anaconda 是一个数据科学和机器学习的发行版,它包含了 Python、conda 以及许多预装的库和工具&am…...
「数据治理」核心专业术语解释!
数据治理就是指在一定的组织范围内,依托制度法规、标准规范、应用实践和支撑技术对数据进行全生命周期的数据确权、质量管理、安全控制、隐私保护、开放共享、交易流通和分析处理。数据治理的目标是为了提高数据的可用性、安全性、流通性,激活数据资源…...
Mac Nginx 前端打包部署
安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装Nginx brew install nginx nginx相关命令 nginx启动命令:nginx nginx -s reload #重新加载配置 nginx -s reopen #重启 nginx -s stop #…...
乳腺癌诊断分析——基于聚类分析实现
一、研究背景 乳腺癌属于恶性肿瘤,在早期发现后需要及早将病变组织切除,而且术后还要化疗和放射等辅助治疗,能够抑制癌细胞的扩散和增长。 二、研究目的 研究乳腺癌病人的患病特征通过聚类分析方法对特征进行分类通过上述聚类结果对乳腺诊…...
从能算到秒杀:单词拆分与「能否拼出来」的判定艺术
如果说 完全平方数 是在算「最少几个数」,零钱兑换 是在算「最少几枚硬币」,那 139. 单词拆分 就是在考你:一个字符串,到底能不能被“拼”出来?这也是我第一次意识到:很多 DP 题,其实是在…...
为什么你的Windows快捷键突然失效?Hotkey Detective一键定位占用程序终极指南
为什么你的Windows快捷键突然失效?Hotkey Detective一键定位占用程序终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-d…...
7 年评测经验博主发布扫地机器人挑选指南,邀你探讨机器人革命!
评测多款扫地机器人,Matic 脱颖而出博主发布了关于挑选最佳扫地机器人的指南,近期评测了戴森的 Spot & Scrub、鲨客的 Power Detect 以及 Matic。在其 7 年的扫地机器人评测生涯中,Matic 是最有意思的新型扫地机器人。拨开营销迷雾&#…...
Bazzite:专为游戏玩家打造的Linux操作系统深度解析
Bazzite:专为游戏玩家打造的Linux操作系统深度解析 【免费下载链接】bazzite Bazzite makes gaming and everyday use smoother and simpler across desktop PCs, handhelds, tablets, and home theater PCs. 项目地址: https://gitcode.com/gh_mirrors/ba/bazzit…...
C++ 左右值引用 完全详解(从入门到精通)
左右值引用是 C11 引入的最核心、影响最深远的特性,它直接催生了移动语义、完美转发、智能指针优化等现代 C 的基石。本文从最基础的定义开始,逐层深入到所有高级特性和常见陷阱,看完就能解决 99% 的面试和开发问题。一、先彻底搞懂ÿ…...
Taotoken助力企业级AI应用开发,统一管理多个Agent的API成本与用量
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken助力企业级AI应用开发,统一管理多个Agent的API成本与用量 当团队同时运行多个基于不同大模型的智能体应用时&a…...
RabbitMQ 入门与安装
RabbitMQ 入门与安装:从 MQ 概念到环境搭建 一、开篇:学习 RabbitMQ 前需要准备什么 RabbitMQ 属于消息中间件,是 Java 后端开发中非常常见的一类基础组件。学习它之前,最好已经具备以下基础: 具备一定 Java 基础&…...
Codeforces Round 1056
憧憬成为 Master 第 27 集 —— 罚时上天 (Codeforces Round 1056 (Div. 2)) https://www.bilibili.com/video/BV18QxuzfEXx/ 【赛时5/6题】Codeforces Round 1056 (Div.2) https://www.bilibili.com/video/BV1Q9xuztEAo/ Codeforces Round 1056 拼好饭题解 https://www.bilibi…...
邮件安全联防预警平台“网哨M01”:全面联防对抗社工钓鱼攻击
数字化时代,电子邮件是办公协同、政企协作的重要通信手段,但也是网络攻击的常见突破口。结合社会工程学(简称“社工”)的钓鱼邮件,以隐蔽、迷惑性强的特点,严重威胁个人财产与企业信息安全,防御…...
同样做App开发,两种技术栈到底适合谁?看完直接选不纠结
原生开发栈的适配人群前端苹果安卓原生开发后端Java,是互联网行业里沿用多年的经典组合。很多从计算机相关专业科班毕业的开发者,最早接触的就是这套路线。大学课程里会教Java基础,会分方向讲Android和iOS的原生开发知识,毕业之后…...
