linux源代码阅读笔记 get_free_page()代码分析
/*
34 * Get physical address of first (actually last :-) free page, and mark it
35 * used. If no free pages left, return 0.
36 */
unsigned long get_free_page(void)
{
register unsigned long __res asm("ax"); __asm__("std ; repne ; scasw\n\t"
"jne 1f\n\t"
"movw $1,2(%%edi)\n\t" //将对应页面的内存映像置1(使用)
"sall $12,%%ecx\n\t" //页面数*4kb=相对LOW_MEMORY的页面起始地址
"movl %%ecx,%%edx\n\t" //加上LOW_MEMORY形成物理起始地址
"addl %2,%%edx\n\t" //页面实际地址给edx
"movl $1024,%%ecx\n\t"
"leal 4092(%%edx),%%edi\n\t" //将该页面的末端地址给edi
"rep ; stosl\n\t" //将edi所指内存请0
"movl %%edx,%%eax\n"
"1:"
:"=a" (__res)
:"" (),"i" (LOW_MEM),"c" (PAGING_PAGES),
"D" (mem_map+PAGING_PAGES-)
:"di","cx","dx");
return __res;
}
这段代码的作用是获取一个空闲的内存页,并且返回它的地址。
首先分析,std ; repne ;scasw 这三句的作用。首先,我们参考一下下面这这篇文章:http://blog.163.com/b____d/blog/static/7491166020099115207391/
那么,我们来分析一下这个函数里含义。首先,在这三句代码执行以前,asm已经将参数装入寄存器。即:
%1(ax=0) %2(LOW_MEM) %3(cx=PAGING_PAGES) %4(edi=mem_map+PAGING_PAGES-1) 。这里注意的是,参数%1 "0" (0),”0“表示使用和输出相同的寄存器。即eax。
这样,这三句话的含义就很清楚了,它的作用是从edi指代的地址搜索,如果找到0位,则返回。直到检索了PAGING_PAGES长度。
也就是说,这三句指令在mem_map[ ]数组中寻找0位,并且该0位的index存储在edx中。
疑问:系统页面长度为4096bit,为何将页面内容清0时,赋予计数器ecx的值是1024而不是4096?
答:关注这里的清零指令,rep;stosl
STOSL指令相当于将EAX中的值保存到ES:EDI指向的地址中,若设置了EFLAGS中的方向位置位(即在STOSL指令前使用STD指令)则EDI自减4,否则(使用CLD指令)EDI自增4。
由此可见,stosl每次将4个bit清零。因此计数器赋值1024。同理,这样是为什么edi的初始值被赋予4092而不是4095
linux源代码阅读笔记 get_free_page()代码分析的更多相关文章
- linux源代码阅读笔记 find_entry分析
78 static struct buffer_head * find_entry(struct m_inode * dir, 79 const char * name, int namelen, s ...
- linux源代码阅读笔记 free_page_tables()分析
/* 77 * This function frees a continuos block of page tables, as needed 78 * by 'exit()'. As does co ...
- linux源代码阅读笔记 linux文件系统(转)
linux文件系统: 操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者.群组.时间参数等). 文件系统通常将这两部分数据存放在不同的块.权限属性放 ...
- linux源代码阅读笔记 高速缓冲区管理
高速缓冲区是文件系统访问块设备中数据的必经要道,为了访问文件系统等块设备上的数据,内核可以每次都访问块设备,进行读写操作. 为了提高系统性能,内核在内存中开辟一个高速数据缓冲区.在Linux内核中,高 ...
- linux源代码阅读笔记 linux文件系统(二)
上一篇文章说到linux文件系统中分为超级块,inode块,block块.inode块给出文件的权限,修改时间,大小等信息. 但是实际上,文件的数据是存储在block块中的.而inode块中给出了存储 ...
- linux源代码阅读笔记 fork和execve的区别
1. man exec就可以知到: The exec() family of functions replaces the current process image with a new proce ...
- linux源代码阅读笔记 linux文件系统(三)
当系统申请一个新的inode时.系统并不会对磁盘进行读写.它会在存储在内存的inode表(inode_table)中寻找一个空闲的位置. 如果找到了,直接返回该inode.否则要等待一个空闲的位置. ...
- linux源代码阅读笔记 八进制
c语言中,众所周知,以0x开头的数是16进制数.例如 0x8FFF 然而较少使用的是八进制数.它以0开头.例如 01234
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
随机推荐
- (转)集成架构:对比 Web API 与面向服务的架构和企业应用程序集成
摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API ...
- eclipse如何创建web项目
1. 打开eclipse,在File上New,然后选择Dynamic Web Project 2. 弹出的页面中如下图,在Project name中输入项目名称JavaWeb01,点击Next ...
- struts2指定集合元素的泛型
public class LoginAction implements Action{ private List users; public void setUsers(List users){ th ...
- GVIM:在WINDOWS下清爽写代码
上大学后,你是不是也开始学习C语言了?特别是计算机学院的孩子,应当有更高的追求.C语言开课一段时间了,你是不是开始嫌弃IDE恶心的界面了?是不是跟我一样,嫌弃IDE打开速度太慢?VS2010需要12秒 ...
- 麦子学院Android开发Java教程ClassCastException 错误解析
现在Java编程中经常碰到ClassCastException 错误,ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常.此类错误通常会终止用户请求.本 ...
- mysql快速上手3
上一章给大家说的是数据库的视图,存储过程等等操作,这章主要讲索引,以及索引注意事项,如果想看前面的文章,url如下: mysql快速上手1 mysql快速上手2 索引简介 索引是对数据库表中一个或多个 ...
- Android BroadcasetReceiver
ci@clinux:~/mp_mtk$ adb -s QGAEFYAAOFN7PNOB logcat PhoneReceiver:e *:S --------- beginning of system ...
- jquery 1.6发布后,增加prop()方法部分取代attr()方法
以前的jq中,全部使用attr来访问对象的属性,比如取一个图片的alt属性,就可以这样做$('#img').attr('alt'); 但是在某些时候,比如访问checkbox的disabled属性 ...
- Windows Server 2003 IIS支持ASP
1.ASP支持是很简单的 这里简单的说一下 2.安装IIS服务 这里就不多演示了 很简单的 3.安装完成后打开IIS的扩展功能 ASP代码测试页为: <% response.write( ...
- IOS_修改项目模板
1. /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Source/Cocoa\ ...