Linux内核源码分析—Linux内核中的嵌入式汇编
转载请注明出处:
http://blog.csdn.net/weifenghai/article/details/52794872
概述:
内核中分配文件描述符时找第一个0的位置的一个底层函数,了解Linux内核嵌入式汇编知识参见《LINUX内核源代码情景分析(上)》中的1.5节《1.5Linux内核源代码中的汇编语言代码》,内核汇编指令参见《汇编语言程序设计(美)布鲁姆_着,马朝晖_等译》,代码摘自2.6.11.1内核。
函数代码:
/**
*find_first_zero_bit - find the first zero bit in a memory region
*@addr: The address to start the search at
*@size: The maximum size to search
*
*Returns the bit-number of the first zero bit, not the number of the byte
*containing a bit.
*/
static inline int find_first_zero_bit(constunsigned long *addr, unsigned size)
{
intd0, d1, d2;
intres;
if(!size)
return0;
/*This looks at memory. Mark it volatile to tell gcc not to move it around */
__asm__ __volatile__(
"movl$-1,%%eax\n\t"
"xorl%%edx,%%edx\n\t"
"repe;scasl\n\t"
"je1f\n\t"
"xorl-4(%%edi),%%eax\n\t"
"subl$4,%%edi\n\t"
"bsfl%%eax,%%edx\n"
"1:\tsubl%%ebx,%%edi\n\t"
"shll$3,%%edi\n\t"
"addl%%edi,%%edx"
:"=d"(res), "=&c" (d0), "=&D" (d1), "=&a"(d2)
:"1"((size + 31) >> 5), "2" (addr), "b" (addr) :"memory");
returnres;
}
代码分析:
输出部:
代码::"=d" (res), "=&c" (d0), "=&D"(d1), "=&a" (d2)
解释:
%0: res放入edx
%1: d0放入ecx
%2:d1放入edi
%3:d2放入eax
输入部:
代码::"1" ((size + 31) >> 5), "2" (addr),"b" (addr)
%4:与$1相同,(size + 31) >>5放入ecx
%5:与$2相同,addr放入edi
%6:addr 放入ebx
损坏部:: "memory"
指令部:
"movl$-1,%%eax\n\t":把eax的所有位都置成1
"xorl%%edx,%%edx\n\t":把edx置0
"repe;scasl\n\t":在edi(即addr)中搜索与eax不匹配的(即不全为1的)
"je1f\n\t" 没有找到
"xorl-4(%%edi),%%eax\n\t" 把eax中edi为0的位置1,其它位置0
"subl$4,%%edi\n\t" edi存当前找到的位置
"bsfl%%eax,%%edx\n" edx存放eax中从右边第一个为1的位的索引,从0开始,edx存放目标字节内的偏移
"1:\tsubl%%ebx,%%edi\n\t" 现在edi中存放字节偏移位置
"shll$3,%%edi\n\t" edi左移3位,存偏整体移位数
"addl%%edi,%%edx" 计算偏移位数
转载请注明出处:
http://blog.csdn.net/weifenghai/article/details/52794872
Linux内核源码分析—Linux内核中的嵌入式汇编相关推荐
- v06.03 鸿蒙内核源码分析(调度队列) | 内核调度也需要排队 | 百篇博客分析HarmonyOS源码
子曰:"君子食无求饱,居无求安,敏于事而慎于言,就有道而正焉,可谓好学也已."<论语>:学而篇 百篇博客系列篇.本篇为: v06.xx 鸿蒙内核源码分析(调度队列篇) ...
- linux ptrace 内核源码分析,Linux ptrace详细分析系列(一)
原标题:Linux ptrace详细分析系列(一) 本文为看雪论坛优秀文章 看雪论坛作者ID:有毒 备注:文章中使用的Linux内核源码版本为Linux 5.9,使用的Linux版本为Linux ub ...
- linux nat源码分析,Linux下NAT/NAPT规则源码分析
前面有一篇文章分析了为什么在PREROUTING做DNAT对本地连接不起作用?本文再紧接着上文,深入分析一下NAT/NAPT的规则. 事情的起因要从上的那篇的文章说起,因为我的本科生毕业设计也是做P2 ...
- linux ptrace 内核源码分析,linux 3.5.4 ptrace源码分析分析(系列一)
ptrace是linux系统中为了调试专门设立的一种系统调用.要想调试调试一个进程,有两种方式: PTRACE_TRACEME和PTRACE_ATTACH.这两种方式的主要区别可以概括为: PTRAC ...
- linux操作系统源码分析,linux操作系统源代码详细分析.doc
linux操作系统源代码详细分析.doc LINUX操作系统源代码详细分析内容简介LINUX拥有现代操作系统所有的功能,如真正的抢先式多任务处理.支持多用户,内存保护,虚拟内存,支持SMP.UP,符合 ...
- linux 进程调度源码分析,Linux调度器源码分析
代码分析根据3.10版本 通过对前面的学习我们知道Linux的调度分为两种 周期调度 完成周期性算法参数的更新和系统其它实际的检查 主调的 真正的调度过程 我们现在来看下主调的的代码框架. 入口 根& ...
- linux权限源码分析,Linux基础之文件权限详解
Linux中对于权限的制定虽然没有Windows的那么精细,但是如果你了解并掌握Linux中文件的权限知识,也可以像Windows那样对权限做到精确配置. Linux中的文件权限是什么? 如何查看Li ...
- linux lsof 源码分析,linux lsof详解
lsof全名list openedfiles,也就是列举系统中已经被打开的文件.我们都知道,linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件.所以,用好lsof命 ...
- v35.03 鸿蒙内核源码分析(时间管理) | 内核基本时间单位是谁 | 百篇博客分析HarmonyOS源码
子曰:"譬如为山,未成一篑,止,吾止也:譬如平地,虽覆一篑,进,吾往也." <论语>:子罕篇 百篇博客系列篇.本篇为: v35.xx 鸿蒙内核源码分析(时间管理篇) | ...
最新文章
- C# richtextbox 自动下拉到最后 方法 RichTextBox读取txt中文后出现乱码
- TortoiseSVN使用方法
- x3250m6系列服务器,IBM服务器X3250 M6 E3-1230v6 8GB 4x3.5 C110 300W 无驱
- oracle 两表两列数据对比_Oracle、PostgreSQL与Mysql数据写入性能对比
- 分布式光伏贷款欲破冰 多家银行推出相关业务
- C# DataTable怎么合计字段
- vue比php的优势,vue.js的优势是什么
- 树(2)-----leetcode(层、深度、节点)
- 中文文本分析工具总结
- python写病毒代码_十行 Python 代码写一个USB病毒
- 例如微博表情添加到textView中
- c语言中 输出操作是由库函数,【判断题】在 C语言中,输入操作是由库函数scanf完成,输出操作是由库函数printf完成 。...
- 【生产调度】基于Harmony Search (HSPMS) 和 Shuffled Complex Evolution (SCEPMS) 实现并行机器调度附matlab代码
- 唯芸星童鞋的第一个博客。
- 谈谈keep-alive的理解
- 虚拟机可以做成存储服务器吗,利用win10自带虚拟机功能轻松打造家用nas
- 专题教程——选队长游戏
- short与Short类型转换其它数据类型
- layui-vertify不生效
- 聊聊去年最火的前端库zx
热门文章
- Python调用有道翻译API
- 软件测试入职1年多薪资正常应该有多少?
- windows10系统删除本地git记录的账号密码
- FFmpeg学习全家桶合集---致敬雷神
- 车载网络 - Autosar网络管理 - 基本概念
- 呆滞物料都是泪,企业该如何避免难题?
- 请领导过目文件怎么说_出差在外,领导的同学请吃饭,问你“去不去”,会来事说3个话术...
- Ant Warning :***** moify in furture 解决方案
- Mac数据图表软件,画出漂亮的论文插图
- 【maya】metaHuman导入maya报错的问题