SCSI/UFS储存架构/协议/电源管理/命令处理流程

UFS子系统架构

在这里插入图片描述

在这里插入图片描述

1.UFS协议

img

在这里插入图片描述

无论是ufs host controller部分还是ufs device部分,他们都将遵循统一的UFS规范

  • UFS Application Layer(UAP)应用层
    1.UFS command set (UCS)
    UCS处理命令集,如读、写命令等,.使用的命令是简化的SCSI命令(基于SBC和SPC),也可以扩展UFS本地命令集,目前暂时没有定义
    2.Task Manager
    任务管理器用以管理命令队列中的命令。比如任务管理器可以发Abort命令,终止之前发下去的命令。它也可以清空命令队列中的所有命令

  • device manager(Query Request)
    设备管理器用以管理UFS设备,包括:
    (1)处理设备级操作
    设备功耗管理、数据传输设置、后台操作使能和其它的特定操作
    (2)管理设备级配置
    维护和存储一组描述符,例如查询请求命令允许修改和查询设备的配置信息

  • The UFS Transport Protocol (UTP)传输层
    主要功能在UFS host端和ufs device端传输UPIU,将应用层的命令封装成UPIU,命令的数据、状态等对应不同的UPIU。UPIU是主机和设备进行信息交换的基本数据单元,它使用数据帧可以最小限度的减少HOST的处理时间,同时由device端控制数据传输的节奏,无需host端poll

  • UFS Interconnect Layer(UIC)互联层
    主要包括MIPI UniPro 数据链路层和MIPI M-PHY 物理层。其中,MIPI UniPro 数据链路层负责主机和设备的链接,它本身是一个完整的协议栈; MIPI M-PHY 物理层负责传输实实在在的物理信号,使用8/10编码、差分信号串行数据传输,数据传输分高低速模式,每种模式下又有几种不同的速度档

在 SCSI 架构中,主机上的 SCSI 接口卡称为 Initiator,与其相连接的 SCSI 磁盘等设备称为 Target,在逻辑上,Initiator 和 Target 之间通信的工作模式,与两个网络设备之间的模式相似,他们之间采用 client-server 的“请求-回应”模式:

img

SCSI 的 Initiator 与 Target 共同构成了一个典型的 C/S 模型,每个指令都是“请求/应答”这样的模型来实现:
* Initiator主要任务:发出SCSI请求;
* Target主要任务:回答SCSI请求,通过 LU 提供业务,并通过任务管理器提供任务管理功能;
LU(Logical Unit):逻辑单元,是指一个可被操作系统识别和访问的逻辑存储单元。一个 UFS 设备可以包含多个 LU,每个 LU 可以被视为一个独立的存储设备;
LUs : LU 的复数形式;
LUN(Logical Unit Number):逻辑单元号码,是用来标识不同 LU 的唯一编号。每个 LU 都有一个对应的 LUN,它可以用来在系统中唯一地标识和访问该 LU;

2.UFS 重要 Layer

img

此外,设备管理器可以略过传输层,直接管理与控制互联层:

img

主机设备管理器可以通过原语(Primitive)直接与UFS互联层(UIC,即MIPI的UniPro和M-PHY)通信。除了上图中所示的reset原语,UFS还包括让UIC进入和退出休眠的原语:DME_HIBERNATE_ENTER和DME_HIBERNATE_EXIT。

这是UFS主机和设备之间链路的省电模式,对UFS设备来说,链路只是整个UFS设备的一部分。一个UFS设备是否省电,除了看其链路,还需要考虑UFS控制器、存储介质等是否省电,即看整个UFS设备是否有好的电源管理。

Logical unit

UFS 设备有若干个 LU,LU 接收主机发过来的命令或请求可能来自应用层的 SCSI 模块、设备管理器或者任务管理器:

img

每个 LU 都是独立的,“独立”表现在下面几个方面:

  • 逻辑地址空间是独立的,都是从LBA[2] 0(Logical Block Addressing,逻辑块寻址)开始;
  • 逻辑块大小可以不同,可以为4KB,…;
  • 可以有不同的安全属性,比如可以设置不同的写保护属性;
  • 每个 LU 可以有自己的命令队列;
  • LU 可以启动代码、应用程序代码和应用数据;

总结来说,划分不同 LU 有以下作用:

  • 外部可寻址;
  • 存储实体(可以单独做 Boot 启动、写保护或 RPMB[3](Replay Protected Memory Block,重播保护内存块) );
  • 内部任务队列;

3.UFS 架构

UFS 架构以 HCI(Host Controller Interface,主机控制器接口)为界划分为三部分。如下图,蓝色框上方调用 HCI 的为主机软件部分,蓝色框下方的为 HCI 封装的硬件处理细节部分,即 HC(Host Controller,主机控制器)

img

HCI 接口架构

数据结构服务于软件,主机的软件通过内存中的一系列主机 register 和数据结构 Transfer Request Descriptors 来与 Host controller 硬件进行交互。UFSHCI 定义了两种接口:IO Memory/Registar Space 以及 Host Memory Space,下图展示了 UFS HCI 的框图:

img

在这里插入图片描述

IO Memory/Registar Space:在这个空间,主机 register 被定义为主机的软件接口,通过 MMIO[4](Memory-Mapped I/O,内存映射 I/O)的方式被实现,主要包含了下面三种类型的寄存器:

  • Host Controller Capability Registers:这些寄存器提供了关于 HC 功能的描述。包括 UFS 标准版本、主机控制器支持的命令队列的大小以及主机控制器标识数据;

  • Runtime and Operation Registers:

    • Interrupt status:这些寄存器为主机软件提供了使能/中止以及中断状态的接口;
    • Host status:该寄存器显示 HC 的状态,并允许主机软件初始化/禁用 HC;
    • UTP Transfer Request:这些寄存器给 UTP Transfer Request List 提供了接口;
    • UTP Task Management Request:这些寄存器为 UTP Task Management request list 提供了一个接口;
    • UIC Command:这些寄存器为 Unipro 配置以及控制提供了接口;
  • Vendor Specific Registers:由供应商进行定义;

Host Memory Space:该空间中包含了能够描述将执行命令和命令中数据缓存的数据结构。简单地可以理解为——UTP Transfer Request List 负责通用的 IO 命令,UTP Task Mangement Request List 负责管理命令。

UTP Transfer Request List(传输请求列表)由一系列数据结构 UTRD (UTP Transfer Request Descriptor,传输请求描述符) 组成。UFS host controller 命令队列中的命令槽(slot)被 MMIO 到 UTRD,32 个 UTRD 对应最多 32 个 slot,UTRD 描述了要执行的命令及相关数据。
UFS 主机软件通过将要执行的命令及相关数据放置在 UTRD,再敲响主机控制器门铃(Offset 58h: UTRLDBR – UTP Transfer Request List Door Bell Register )向主机控制器发出命令。传输请求列表中的命令被 UFSHCI 顺序执行,但可能会按照不同的顺序完成。所有命令都可以产生命令完成中断或者更新在列表中的 UTRD 命令状态字段。UFS 主机软件可以在运行时向列表中添加命令。主机控制器支持中断聚合,即在预定义的命令完成设定的数量后生成单个命令完成中断。

img

在这里插入图片描述

UFS host驱动通过分配和使用UTRD描述符和UTMRD描述符来与host控制器硬件通信。host控制器系统内存可以同时接受多达32个UTRD描述符和8个UTMRD描述符。每个UTRD描述符指向了一块内存区域,这块内存区域包含:命令UPIU(UCD),response UPIU,并包含了一块物理区域描述符表(PRDT),表中每一项指向一个数据buffer,存储需要传输的数据(command upiu)或要接收的数据(response upiu)。UCD的command和response将被分别组装成UPIU并通过UTP层进行传输。

  • UTP UTRD
    This section defines Transfer Request Descriptor for UTP commands.
    对应数据结构为struct utp_transfer_req_desc

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • UTP command descriptor
    A UTP command descriptor contains the UPIU for the command, offset and length of the data buffer associated with the command, and offset and length of the PRDT.
    对应的数据结构为struct utp_transfer_cmd_desc

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UTP TMR descriptor (UTMRD)
对应的数据结构为struct utp_task_req_desc

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.UFS电源管理

UFS定义了4种基本功耗模式:Active,Idle,Power Down和Sleep(简称AIDS),外加3个过渡功耗模式:Pre-Active, Pre-Sleep和Pre-PowerDown,一共是7种功耗模式。非常4+3!

Active模式:UFS设备在执行命令或者做后台任务(Background Operation)时处于这种状态;

Idle模式:UFS设备空闲时,即既没有来自UFS主机的命令,自身也没有后台任务需要处理,设备就处于该状态;

Sleep模式:闲得瞌睡了。睡眠模式下,VCC电源可能被切断(取决UFS设备设计)。VCC一般给闪存供电,即切断闪存供电。

Power Down模式:掉电模式下,所有电源供电VCC, VCCQ和VCCQ2都可能被掐断(取决UFS设备设计),该模式是最省电的功耗模式了。

这些模式之间的转换如下图:我们只需要重点关注sleep->active->idle状态

img

5.实战:通过一个ufs缺陷了解ufs

缺陷描述:一直cat /sys/devices/platform/soc/4804000.ufshc/life_time_est_a 这个节点查看ufs寿命,会概率性出现系统重启。

有用的日志信息:

[  333.848513] ufshcd-qcom 4804000.ufshc: pwr ctrl cmd 0x18 with mode 0x0 completion timeout
[  334.360545] ufshcd-qcom 4804000.ufshc: pwr ctrl cmd 0x18 with mode 0x0 completion timeout
[  334.868572] ufshcd-qcom 4804000.ufshc: pwr ctrl cmd 0x18 with mode 0x0 completion timeout
[  334.972668] ufshcd-qcom 4804000.ufshc: pwr ctrl cmd 0x18 failed, host upmcrs:0x5
[  334.980372] ufshcd-qcom 4804000.ufshc: UFS Host state=2
[  334.985868] ufshcd-qcom 4804000.ufshc: lrb in use=0x0, outstanding reqs=0x0 tasks=0x0
[  334.994068] ufshcd-qcom 4804000.ufshc: saved_err=0x0, saved_uic_err=0x0, saved_ce_err=0x0
[  335.002634] ufshcd-qcom 4804000.ufshc: Device power mode=2, UIC link state=2
[  335.009929] ufshcd-qcom 4804000.ufshc: PM in progress=1, sys. suspended=0
[  335.016949] ufshcd-qcom 4804000.ufshc: Auto BKOPS=0, Host self-block=1
[  335.023709] ufshcd-qcom 4804000.ufshc: Clk gate=1, hibern8 on idle=4
[  335.030709] ufshcd-qcom 4804000.ufshc: error handling flags=0x0, req. abort count=0
[  335.038709] ufshcd-qcom 4804000.ufshc: Host capabilities=0x1587031f, caps=0x8f
[  335.046185] ufshcd-qcom 4804000.ufshc: quirks=0x0, dev. quirks=0xe2
[  335.052757] ufshcd-qcom 4804000.ufshc: pa_err_cnt_total=0, pa_lane_0_err_cnt=0, pa_lane_1_err_cnt=0, pa_line_reset_err_cnt=0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过Device power mode=2,UIC link state=0可以知道,电源进入sleep模式,链路状态进入disabeld状态。

思路1:想办法保证power和link是active状态,直接调ufshcd_resume回复power和link为正常状态。

设置ufs电源为active状态
#define ufshcd_set_ufs_dev_active(h) \((h)->curr_dev_pwr_mode = UFS_ACTIVE_PWR_MODE)/*** ufshcd_runtime_resume - runtime resume routine* @hba: per adapter instance** This function basically brings the UFS device, UniPro link and controller* to active state. Following operations are done in this function:** 1. Turn on all the controller related clocks* 2. Bring the UniPro link out of Hibernate state* 3. If UFS device is in sleep state, turn ON VCC rail and bring the UFS device*    to active state.* 4. If auto-bkops is enabled on the device, disable it.** So following would be the possible power state after this function return* successfully:*	S1: UFS device in Active state with VCC rail ON*	    UniPro link in Active state*	    All the UFS/UniPro controller clocks are ON** Returns 0 for success and non-zero for failure*/
int ufshcd_runtime_resume(struct ufs_hba *hba)
{int ret = 0;ktime_t start = ktime_get();if (!hba)return -EINVAL;if (!hba->is_powered)goto out;elseret = ufshcd_resume(hba, UFS_RUNTIME_PM);
out:trace_ufshcd_runtime_resume(dev_name(hba->dev), ret,ktime_to_us(ktime_sub(ktime_get(), start)),hba->curr_dev_pwr_mode, hba->uic_link_state);return ret;
}
EXPORT_SYMBOL(ufshcd_runtime_resume);int ufshcd_resume();int ufshcd_vreg_set_hpm()int ufshcd_setup_vreg(hba, true);ufshcd_toggle_vreg(dev, info->vcc, on);//给ufs设备供电ufshcd_toggle_vreg(dev, info->vccq, on);ufshcd_toggle_vreg(dev, info->vccq2, on);ufshcd_vops_resume(hba, pm_op);hba->vops->resume(hba, op);ret = ufshcd_uic_hibern8_exit(hba);//退出链路休眠模式(hibern8是链路休眠模式)ufshcd_set_link_active(hba);//激活链路

补充:三个供电电压,VCC,VCCQ和VCCQ2,分别给UFS设备模块供电。UFS设备主要包括三部分:前端UFS接口(M-PHY)UFS控制器闪存介质(图中的Memory模块)。VCC 给 闪存介质供电,VCCQ 一般给闪存输入输出接口 和 UFS控制器供电,VCCQ2一般给 M-PHY或其它一些低电压模块供电。

img

思路2:想办法保证power和link是active状态,直接调用pm_runtime_get_sync进入resume恢复power 为active状态。

pm_runtime_get_sync/pm_runtime_put_sync 增加/减少计数值,并判断是否进入suspend/resume。

  1. 在struct dev_pm_ops提供了3个回调函数:runtime_suspend,runtime_resume,runtime_idle,一般runtime_idle这个空闲函数不需要提供

  2. 上面2个函数不会直接导致runtime_suspend,runtime_resume,runtime_idle被调用,只是使能和修改计数值,当引用计数减为0,调用suspend,从0变为大于0调用resume。

pm_runtime_get_sync__pm_runtime_resume(dev, RPM_GET_PUT) atomic_inc(&dev->power.usage_count); // 若上级arg2&RPM_GET_PUT为真,才调用rpm_resume(dev, rpmflags) //关闭本地CPU中断后调用它if (dev->power.disable_depth > 0) retval = -EACCES; 
//若要使用runtime PM的函数,需要首先pm_runtime_enable。if (!dev->power.timer_autosuspends) /*为了防止设备频繁的开关,可以设置timer_autosuspends的值*/pm_runtime_deactivate_timer(dev);if (dev->power.runtime_status == RPM_ACTIVE) {  /*如果已经是ACTIVE,就没有必要再次resume*/if (dev->power.runtime_status == RPM_RESUMING || dev->power.runtime_status == RPM_SUSPENDING) 如果设备正处于RPM_RESUMING和RPM_SUSPENDING状态,等待其完成if (!parent && dev->parent) //增加父级的使用计数器并在必要时恢复它,在resume设备本身之前先resume父设备。开始resume设备自己:dev->pm_domain->ops->runtime_resume    //或dev->type->pm->runtime_resume          //或dev->class->pm->runtime_resume         //或dev->bus->pm->runtime_resume           //或 前4个被称为subsystem level的callback,优先调用,第5个是驱动级别的。dev->driver->pm->runtime_resume        //或__update_runtime_status(dev, RPM_SUSPENDED); //如果resume失败,重新设置回SUSPENDED状态if (parent) atomic_inc(&parent->power.child_count); //如果resume成功时给父亲的child_count加1wake_up_all(&dev->power.wait_queue); //唤醒其它进程pm_runtime_put_sync__pm_runtime_idle(dev, RPM_GET_PUT)if (!atomic_dec_and_test(&dev->power.usage_count)) //减少usage_count引用计数rpm_idle(dev, rpmflags); //让设备进入idle状态rpm_check_suspend_allowed //检查是否允许设备进入suspend状态,看来内核把idle和suspend一样看待了。if (dev->power.disable_depth > 0) retval = -EACCES; //调用时还没有pm_runtime_enable,就失败。if (atomic_read(&dev->power.usage_count) > 0) retval = -EAGAIN;if (!dev->power.ignore_children && atomic_read(&dev->power.child_count)) retval = -EBUSY; //它的孩子不全睡眠它是不能睡眠的if (dev->power.runtime_status != RPM_ACTIVE) retval = -EAGAIN; //如果不是出于ACTIVE状态直接返回。开始suspend设备自己:dev->pm_domain->ops->runtime_suspend    //或dev->type->pm->runtime_suspend          //或dev->class->pm->runtime_suspend         //或dev->bus->pm->runtime_suspend           //或 前4个被称为subsystem level的callback,优先调用,第5个是驱动级别的。dev->driver->pm->runtime_suspend        //或wake_up_all(&dev->power.wait_queue); //唤醒其它进程

debug ufs信息

ls /sys/kernel/debug/4804000.ufshc
crash_on_err   dump_device_desc host_regs    reset_controller
dbg_print_en   err_inj_scenario inject_fault show_hba
dme_local_read err_inj_stats    power_mode   stats
dme_peer_read  err_state        qcom

可以通过cat show_hba将ufs设备信息全部打印出来。也可以通过cat host_regs将host的寄存器的值打印出来。

static int ufsdbg_show_hba_show(struct seq_file *file, void *data)
{struct ufs_hba *hba = (struct ufs_hba *)file->private;seq_printf(file, "hba->outstanding_tasks = 0x%x\n",(u32)hba->outstanding_tasks);seq_printf(file, "hba->outstanding_reqs = 0x%x\n",(u32)hba->outstanding_reqs);seq_printf(file, "hba->capabilities = 0x%x\n", hba->capabilities);seq_printf(file, "hba->nutrs = %d\n", hba->nutrs);seq_printf(file, "hba->nutmrs = %d\n", hba->nutmrs);seq_printf(file, "hba->ufs_version = 0x%x\n", hba->ufs_version);seq_printf(file, "hba->irq = 0x%x\n", hba->irq);seq_printf(file, "hba->auto_bkops_enabled = %d\n",hba->auto_bkops_enabled);seq_printf(file, "hba->ufshcd_state = 0x%x\n", hba->ufshcd_state);seq_printf(file, "hba->clk_gating.state = 0x%x\n",hba->clk_gating.state);seq_printf(file, "hba->eh_flags = 0x%x\n", hba->eh_flags);seq_printf(file, "hba->intr_mask = 0x%x\n", hba->intr_mask);seq_printf(file, "hba->ee_ctrl_mask = 0x%x\n", hba->ee_ctrl_mask);/* HBA Errors */seq_printf(file, "hba->errors = 0x%x\n", hba->errors);seq_printf(file, "hba->uic_error = 0x%x\n", hba->uic_error);seq_printf(file, "hba->saved_err = 0x%x\n", hba->saved_err);seq_printf(file, "hba->saved_uic_err = 0x%x\n", hba->saved_uic_err);seq_printf(file, "power_mode_change_cnt = %d\n",hba->ufs_stats.power_mode_change_cnt);seq_printf(file, "hibern8_exit_cnt = %d\n",hba->ufs_stats.hibern8_exit_cnt);seq_printf(file, "pa_err_cnt_total = %d\n",hba->ufs_stats.pa_err_cnt_total);seq_printf(file, "pa_lane_0_err_cnt = %d\n",hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_0]);seq_printf(file, "pa_lane_1_err_cnt = %d\n",hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_1]);seq_printf(file, "pa_line_reset_err_cnt = %d\n",hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LINE_RESET]);seq_printf(file, "dl_err_cnt_total = %d\n",hba->ufs_stats.dl_err_cnt_total);seq_printf(file, "dl_nac_received_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_RECEIVED]);seq_printf(file, "dl_tcx_replay_timer_expired_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED]);seq_printf(file, "dl_afcx_request_timer_expired_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED]);seq_printf(file, "dl_fcx_protection_timer_expired_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED]);seq_printf(file, "dl_crc_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_CRC_ERROR]);seq_printf(file, "dll_rx_buffer_overflow_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_RX_BUFFER_OVERFLOW]);seq_printf(file, "dl_max_frame_length_exceeded_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED]);seq_printf(file, "dl_wrong_sequence_number_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_WRONG_SEQUENCE_NUMBER]);seq_printf(file, "dl_afc_frame_syntax_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR]);seq_printf(file, "dl_nac_frame_syntax_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR]);seq_printf(file, "dl_eof_syntax_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_EOF_SYNTAX_ERROR]);seq_printf(file, "dl_frame_syntax_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FRAME_SYNTAX_ERROR]);seq_printf(file, "dl_bad_ctrl_symbol_type_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE]);seq_printf(file, "dl_pa_init_err_cnt = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_INIT_ERROR]);seq_printf(file, "dl_pa_error_ind_received = %d\n",hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_ERROR_IND_RECEIVED]);seq_printf(file, "dme_err_cnt = %d\n", hba->ufs_stats.dme_err_cnt);return 0;
}

不对ufs操作和往ufs写数据对比

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UFS访问硬件资源信息
ufshcd_read_desc_param()ufshcd_query_descriptor_retry()__ufshcd_query_descriptor()ufshcd_hold_all(hba);//退出hibern8模式进入activeufshcd_init_query()//构造请求reqest初始化ufshcd_exec_dev_cmd()//执行命令查询ufs寿命ufshcd_compose_dev_cmd()//构造lrbp结构体ufshcd_send_command()//发送命令ufshcd_wait_for_dev_cmd()//等待命令执行结果

参考资料:

https://blog.csdn.net/jasonactions/article/details/116295649

https://blog.csdn.net/don_chiang709/article/details/89314552

https://blog.csdn.net/Frank_sample/article/details/119033341

https://blog.csdn.net/jasonactions/article/details/116293944

https://blog.csdn.net/jasonactions/article/details/116932302

https://blog.csdn.net/don_chiang709/category_8805138.html

https://blog.csdn.net/frank_sample/category_11016468.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用,使用并不平凡,该数据库曾做过一次服务器间的迁移。 用户描述,所有oracle客户端查询该视图都报tns错误,一般ora-12154会发生在连接数据库时,因为tns配…

[文件IO]文件操作的几个笔试题

目录 1.扫描指定目录,找到要查询的文件名,并询问用户是否要删除 2. 文件的复制 3.扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录) 1.扫描指定目录,找到要查询的文件名&#x…

Hardware-Aware-Transformers开源项目笔记

文章目录 Hardware-Aware-Transformers开源项目笔记开源项目背景知识nas进化算法进化算法代码示例 开源项目Evolutionary Search1 生成延迟的数据集2 训练延迟预测器3 使延时约束运行搜索算法4. 训练搜索得到的subTransformer5. 根据重训练后的submodel 得到BLEU精度值 代码结构…

医学图像的图像处理、分割、分类和定位-1

一、说明 本报告全面探讨了应用于医学图像的图像处理和分类技术。开展了四项不同的任务来展示这些方法的多功能性和有效性。任务 1 涉及读取、写入和显示 PNG、JPG 和 DICOM 图像。任务 2 涉及基于定向变化的多类图像分类。此外,我们在任务 3 中包括了胸部 X 光图像…

java数据结构与算法刷题-----LeetCode977. 有序数组的平方

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 时间复杂度 空间复杂度 O(n * l o g 2 n log_2{n} log2​…

PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算

目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…

JVM工作原理与实战(十九):运行时数据区-方法区

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、方法区 1.方法区介绍 2.方法区在Java虚拟机的实现 3.类的元信息 4.运行时常量池 5.字符串常量池 6.静态变量的存储 总结 前言 JVM作为Java程序的运行环境…

App分发测试平台:改变应用开发的游戏规则

App分发测试平台是一个提供应用开发者上传、测试、分享和发布应用的在线服务平台。它为开发者提供了一个高效的测试环境,并为用户提供了一个方便的应用获取渠道。其中,测试环节尤为关键,因为它能够确保应用在上线之前达到预期的功能和性能。 …

问题:Feem无法发送信息OR无法连接(手机端无法发给电脑端)

目录 前言 问题分析 资源、链接 其他问题 前言 需要在小米手机、华为平板、Dell电脑之间传输文件,试过安装破解的华为电脑管家、小米的MIUI文件传输等,均无果。(小米“远程管理”ftp传输倒是可以,但速度太慢了,且…

Java JVM 堆、栈、方法区详解

目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈 5. 程序计数器 首先来看一下JVM运行时数据区有哪些。 1. 栈 在介绍JVM栈之前,先了解一下 栈帧 概念。 栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方…

ROS学习笔记8——实现ROS通信时的常用命令

机器人系统中启动的节点少则几个,多则十几个、几十个,不同的节点名称各异,通信时使用话题、服务、消息、参数等等都各不相同,一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节点通信时,如何获取对方的话…

gitgud.io+Sapphire注册账号教程

gitgud.io是一个仓库,地址 https://gitgud.io/,点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire,就跳转到Sapphire的登陆页面,点击创建新账号,就进入注册页面。&#xff0…

SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functi…

Spring | Spring中的Bean--下

Spring中的Bean: 4.Bean的生命周期5.Bean的配装配式 ( 添加Bean到IOC容器的方式 依赖注入的方式 )5.1 基于XML的配置5.2 基于Annotation (注解) 的装配 (更常用)5.3 自动装配 4.Bean的生命周期 Spring容器可以管理 singleton作用域的Bean的生命周期,在此…

go语言(七)----slice的声明方式

1、声明方式一 //声明一个slice1是一个切片,但是并没有给slice分配空间var slice1 []intslice1 make([]int,3)2、声明方式二 声明一个slice切片,同时给slice分配空间,3个空间,初始化值是0var slice1 []int make([]int,3)3、声…

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练

论文标题:Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码:https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势,因为模态之间有充分的相互…

从临床和科研场景分析ChatGPT在医疗健康领域的应用可行性

2023年4月发表在Journal Medical Systems的文献《Evaluating the Feasibility of ChatGPT in Healthcare: An Analysis of Multiple Clinical and Research Scenarios》(评估 ChatGPT 在医疗健康领域的可行性:对多种临床和研究场景的分析)介绍…

IPv6自动隧道---6to4中继

6to4中继 普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地…

PPT 编辑模式滚动页面不居中

PPT 编辑模式滚动页面不居中 目标:编辑模式下适应窗口大小、切换页面居中显示 调整视图大小,编辑模式通过Ctrl 鼠标滚轮 或 在视图菜单中点击适应窗口大小。 2. 翻页异常,调整视图大小后,PPT翻页但内容不居中或滚动&#xff0c…

『MySQL快速上手』-⑩-索引特性

文章目录 1.索引的作用2.索引的理解建立测试表插入多条记录查看结果 2.1 MySQL与磁盘交互的基本单位2.1 为何IO交互要是 Page2.3 理解单个Page2.4 理解多个Page2.5 页目录2.6 单页情况2.7 多页情况2.8 B vs B2.9 聚簇索引 vs 非聚簇索引非聚簇索引聚簇索引 3.索引操作3.1 创建主…