使用dev_get_by_name的注意事项

dev_hold()和dev_put()用于设备的引用计数器加1和设备的引用计数器减1,内核中会经常用到。

 

linux可以使用dev_get_by_name函数取得设备指针,但是使用是需要注意,使用过dev_get_by_name函数后一定要使用dev_put(pDev)函数取消设备引用,不然可能导致GET的设备无法正常卸载。

一般在将设备指针赋值给SKB->dev后就可以dev_put(pDev)

QUOTE:
pDev = dev_get_by_name("sap1");
struct sk_buff *pIGMP_Query_skb_clone = NULL;
pIGMP_Query_skb_clone=skb_clone(pIGMP_Query_skb, GFP_ATOMIC);
pIGMP_Query_skb_clone->dev=pDev;
dev_put(pIGMP_Query_skb_clone->dev);
dev_queue_xmit(pIGMP_Query_skb_clone);


但使用__dev_get_by_name就不需要调用dev_put(pDev)

附dev_get_by_name函数原型:

 

 

struct net_device *dev_get_by_name(const char *name)
{
 struct net_device *dev;

 read_lock(&dev_base_lock);
 dev = __dev_get_by_name(name);
 if (dev)
  dev_hold(dev);
 read_unlock(&dev_base_lock);
 return dev;
}

<think>嗯,用户遇到了一个错误:无法打开ECC源分区/dev/block/by-name/preloader_a,提示无效参数。我需要帮他解决这个问题。首先,我应该理解这个错误的原因。根据引用[1]中的信息,类似的错误可能与命令写入失败有关,可能涉及到权限问题或者设备节点不存在。 然后,用户提到的preloader_a分区,通常在Android设备中属于bootloader部分,而根据引用[3],LK作为bootloader可能涉及对分区的访问限制。引用[2]中的策略可能阻止应用域访问块设备,所以权限问题可能是一个关键因素。 接下来,我需要考虑可能的解决方案。第一步应该是检查设备节点是否存在,用户可以使用ls命令查看。如果节点不存在,可能需要重新刷写分区或检查硬件连接。第二步是权限问题,可能需要root权限或者修改SELinux策略,但修改系统策略可能不适用于普通用户。第三步,检查分区名称是否正确,不同厂商可能有不同的命名。第四步,如果怀疑硬件损坏,可能需要专业维修。最后,升级固件可能修复已知的bug。 另外,用户可能需要使用fastboot或厂商工具来操作分区,但需要注意操作风险。还要提醒用户备份数据,避免数据丢失。需要确保回答清晰,分步骤说明,并引用相关参考资料。</think>### 问题分析 错误提示`error opening ECC source partition /dev/block/by-name/preloader_a: invalid argument`通常与以下原因相关: 1. **分区路径不存在或权限不足**:设备节点`/dev/block/by-name/preloader_a`可能未正确生成,或当前用户无访问权限[^1][^2]。 2. **硬件或固件问题**:分区可能因硬件损坏或固件版本不兼容导致无法访问[^3]。 3. **引导加载程序(Bootloader)限制**:某些设备的Bootloader(如LK)可能限制对关键分区的直接操作[^3]。 ### 分步解决方案 #### 1. 检查分区路径与权限 - **确认设备节点存在**: ```bash adb shell ls -l /dev/block/by-name/preloader_a ``` 若输出`No such file or directory`,说明分区未正确挂载或设备未启用ECC功能。 - **检查权限**: ```bash adb shell ls -l /dev/block/by-name/ | grep preloader_a ``` 确保输出包含`rw`权限(如`crw-rw----`)。若无权限,尝试以root身份操作: ```bash adb root adb remount ``` #### 2. 验证Bootloader状态 - 若设备使用LK作为Bootloader,部分分区(如`preloader`)可能被锁定。重启至Fastboot模式并尝试通过厂商工具访问: ```bash fastboot devices fastboot getvar preloader_a ``` #### 3. 更新或修复固件 - **刷写最新固件**: 使用厂商提供的工具(如MTK SP Flash Tool)重新刷写`preloader`分区。 - **检查ECC配置**: 部分设备需在工程模式中启用ECC功能,或通过`vendor/bin`下的专用工具配置。 #### 4. 排查硬件问题 - 若上述步骤无效,可能为存储芯片物理损坏,需联系售后检测。 ### 注意事项 - 直接操作`preloader`分区可能导致设备变砖,建议备份数据。 - 修改SELinux策略(如引用[2]中的`neverallow`规则)需重新编译系统镜像,普通用户不可行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值