SSDsim simulation function:get_ppn()

此函数是在所给的channel,chip,die,plane里面找到一个active_block然后再在这个block里面找到一个页,再利用find_ppn()函数找到ppn。(可能产生擦除节点挂载plane上,可能产生GC节点挂载channel上)。

当要写入的页没有相应的映射关系时,直接为该写子请求利用find_ppn()函数找到一个空闲页获得ppn,并更新映射表。当要写入的页有相应的映射关系时,首先会将该映射关系所对应的ppn置为失效页,并设置好相关属性,然后会判断该ppn所在的block是否都是失效页,如果都是失效页的话则说明该block需要进行擦除之后才能再利用了,所以此时会产生一个可擦除节点(会开辟内存空间),该可擦除节点会挂载在此时所在的plane上,最后再利用find_ppn()函数找到一个新的ppn并更新映射表。然后修改该写子请求的ppn以及location相关变量属性以及修改ssd因一次写操作而产生的相关属性变化。最后如果没有主动策略,只采用gc_hard_threshold,并且无法中断GC过程,如果plane中的free_page的数目少于gc_hard_threshold所设定的阈值就产生gc操作,此时会产生一个gc_node(会开辟内存空间),设置该gc_node相关属性(next_node、chip、die、plane、block、page、state、priority),最后将该gc_node挂载到该gc_node所在的channel的gc_command上。gc_node属性只会精确到plane,然后从plane寻找可擦除节点,因为由失效页过多而产生的必须擦除才可用的现象发生在plane内部的block上,所以可擦除节点挂载到了plane上,故gc_node只需要精确到plane号就行,然后从plane寻找擦除节点,而该gc_noed挂载在响应的channel上。

struct ssd_info *get_ppn(struct ssd_info *ssd,unsigned int channel,unsigned int chip,unsigned int die,unsigned int plane,struct sub_request *sub)
{
	unsigned int ppn,lpn,full_page,active_block,block,page;
	struct local *location;
	struct direct_erase *direct_erase_node,*new_direct_erase;
	struct gc_operation *gc_node;
#ifdef DEBUG
	printf("enter get_ppn,channel:%d, chip:%d, die:%d, plane:%d\n",channel,chip,die,plane);
#endif
	full_page=~(0xffffffff<<(ssd->parameter->subpage_page));
	lpn=sub->lpn;
	/*************************************************************************************
	*利用函数find_active_block在channel,chip,die,p
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值