问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux内核0.11 获取第一个空闲物理内存页的函数 get_free_page函数 问题

发布网友 发布时间:2022-04-27 03:43

我来回答

2个回答

热心网友 时间:2023-11-18 18:05

问题关键在于理解以下指令:
"std ; repne ; scasb\n\t"
1、std:方向位DF置位,即DI进行自减操作。
2、repne; scasb
这两条组合指令实现循环比较。ecx初值为15*1024,al=0,di初值为&mem_map[15*1024-1],即从数组mem_map的最后一项开始,依次与al(=0)进行比较。假设数组第i项mem_map[i]==0,则结束循环,此时ecx=i, edi=&mem_map[i-1](因为ecx初值为15*1024,di初值为数组最后一项15*1024-1的地址)。找到空闲页面后,将该数组项置1,即*(edi+1)=mem_map[i]=1,即语句“movb $1,1(%%edi)”实现的功能。此时,ecx即为空闲页面索引。
几点说明:
1、rep循环结束条件:
Repeat Prefix Termination Condition 1 Termination Condition 2
REP RCX or (E)CX = 0 None
REPE/REPZ RCX or (E)CX = 0 ZF = 0
REPNE/REPNZ RCX or (E)CX = 0 ZF = 1

2、rep循环执行顺序:
WHILE CountReg ≠ 0
DO
Service pending interrupts (if any);
Execute associated string instruction; // 1、执行相关指令。例如scansb指令,除了执行al与*di的比较外,di也会被影响,即di自减1(当DF==1时)或自加1(当DF==0时)
CountReg ← (CountReg – 1); // 2、ECX自减
IF CountReg = 0 // 3、判断ECX是否已减到0
THEN exit WHILE loop; FI;
IF (Repeat prefix is REPZ or REPE) and (ZF = 0) // 4、最后才判断其他相关标志。
or (Repeat prefix is REPNZ or REPNE) and (ZF = 1)
THEN exit WHILE loop; FI;
OD;
3、scasb指令对di的影响:
After the comparison, the (E)DI register is incremented or decremented automatically according to the setting of
the DF flag in the EFLAGS register. If the DF flag is 0, the (E)DI register is incremented; if the DF flag is 1, the (E)DI
register is decremented. The register is incremented or decremented by 1 for byte operations, by 2 for word operations, and by 4 for doubleword operations.

以上指令请参考《Intel 64 and IA-32 Architectures Software Developer's Manual》。

热心网友 时间:2023-11-18 18:05

198 unsigned long get_free_page(void)
199{
200 unsigned long result;
201
202repeat:
203 __asm__("std ; repne ; scasb\n\t"
204 "jne 1f\n\t"
205 "movb $1,1(%%edi)\n\t"
206 "sall $12,%%ecx\n\t"
207 ...
215 :"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
216 "D" (mem_map+PAGING_PAGES-1)
217 :"di","cx","dx");
...
223 }
224 if (!result && swap_out())
225 goto repeat;
226 return result;
227}

在这段代码中, 没有存在中断屏蔽cli , 而在fork系统调用中直接使用这个函数, 如果在执行到204的时候被中断, 并且其他进程也调用fork系统调用执行完这个函数, 这样就会导致同一页被引用两次, 而mark数值 1 而造成数据重复的错误. 不知道会不会造成这样子的错误.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 四十来天的松鼠可以只喂瓜子吗 小松鼠挣眼后几天会吃瓜子,水果 魔王松鼠能吃熟瓜子吗 松鼠可不可以吃生葵花子 成年松鼠一餐吃多少瓜子? 宠物松鼠可以吃瓜子吗 葵花瓜子松鼠吃可以吗 松鼠- - 。 松鼠吃红瓜子吗 松鼠会不会很怕冷 如果没有适量的运动会怎么样 是不是冬天都会冬眠? 为什么厦门大学嘉庚学院08年分数线非常高 厦门大学嘉庚学院的分数线 厦门大学嘉庚学院三年来福建文科录取分 厦大嘉庚学院分数线 厦门大学嘉庚学院 录取分数线 福建2011年的 厦门大学嘉庚学院分数线 为什么厦门大学嘉庚学院的分数比二本线还高 在山西说是几本文科生最低多少分才会有希望报呢 厦门大学嘉庚学院是二本吗?如果是二本,录取分数线大概要多少呢? 厦门大学嘉庚学院2010年在福建录取的最高分是多少啊?在什么专业? 350分能不能上厦门大学嘉庚学院三本 厦门大学嘉庚学院和闽江学院哪个分数收得高? 日本旅游 十二单衣 清理D盘按照http://www.yizhongtianxia.com/free/page/1-0-1-0-1-1-1-1-1.html操作弹出来下面的提示? linux 中 cached 内存很大 free内存很小会引起内存泄漏吗 运鸿肽家园产品是传销吗 boy ln luv--防弹少年团 翻译音译 flicker-free是什么意思 中国运鸿预付卡怎么用 boywithluv为什么叫颂小宝 如何打开newpagefree.rar 求防弹少年团 boy in luv (男子汉)的中文歌词! linux命令free显示的cached和buffers有什么区别 求防弹少年团 的boy in luv 罗马音歌词!!注意是罗马音!不是谐音!拜托了! 防弹少年团boy in luv的中文歌词 请问“free woman”准确译为中文,应该是什么? 谁有Boy With Luv的MP3网盘资源啊 boy in luv日文版歌词翻译 中国运鸿肽家园预付卡 老外同学总说的free chat是什么意思 boywithluv这首歌在抖音火吗? after school因为你音译歌词,标明谁唱的