- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux盘符绑定实现原理
Linux盘符绑定实现原理
正一
2016.7.25
目 录
Linux盘符的分配
Linux内核IDR机制
Linux盘符绑定
Linux盘符的分配
sd_probe ()函数
系统中有新的SCSI磁盘(包括USB硬盘)插入,就会调用sd_probe ()函数。
哪里决定盘符?
01438: spin_lock(sd_index_lock );
01439: error = idr_get_new(sd_index_idr, NULL, index);
01440: spin_unlock(sd_index_lock );
01441:
index的值决定了盘符。
若index=0 ,则分配给此块SCSI硬盘的盘符为sda ;
若index=1 ,则分配给此块SCSI硬盘的盘符为sdb ;
……
若index=25 ,则分配给此块SCSI硬盘的盘符为sdz ;
Linux盘符的分配
01408: static int sd_probe(struct device *dev)
01409: {
... ...
01435: if (! idr_pre_get(sd_index_idr, GFP_KERNEL))
01436: goto ↓out_put;
01437:
01438: spin_lock(sd_index_lock );
01439: error = idr_get_new(sd_index_idr, NULL, index);
01440: spin_unlock(sd_index_lock );
01441:
01442: if (index = SD_MAX_DISKS)
01443: error = - EBUSY;
01444: if (error)
01445: goto ↓out_put;
... ...
01465: if (index 26) {
01466: sprintf(gd- disk_name, sd%c, a + index % 26);
01467: } else if (index (26 + 1) * 26) {
01468: sprintf(gd- disk_name, sd%c%c,
01469: ‘a + index / 26 - 1,a + index % 26);
01470: } else {
01471: const unsigned int m1 = (index / 26 - 1) / 26 - 1;
01472: const unsigned int m2 = (index / 26 - 1) % 26;
01473: const unsigned int m3 = index % 26;
01474: sprintf(gd- disk_name, sd%c%c%c,
01475: a + m1, a + m2, a + m3);
01476: }
... ...
01506: } ? end sd_probe ?
Linux盘符的分配
index值的由来
01435: if (! idr_pre_get(sd_index_idr, GFP_KERNEL))
01436: goto ↓out_put;
01437:
01438: spin_lock(sd_i
文档评论(0)