首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android11 WiFi连接流程梳理

Android11 WiFi连接流程梳理

作者头像
用户7557625
发布于 2021-09-14 06:57:49
发布于 2021-09-14 06:57:49
4.5K0
举报

梳理一下Android11的wifi连接流程。

一、可以看到点击连接以后,如果config不为null,则先保存网络,再进行连接,所以即使连接失败,此网络依然在已保存网络列表里。

packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java

代码语言:javascript
AI代码解释
复制
void submit(WifiConfigController configController) {

    final WifiConfiguration config = configController.getConfig();
 if (configController.getMode() == WifiConfigUiBase.MODE_MODIFY) {
        if(!configController.checkWapiParam()) {
            if(configController.getCurSecurity() == AccessPoint.SECURITY_WAPI_CERT) {
                startWapiCertManage();
            }
            return;
        }
        mWifiManager.save(config, mSaveListener);
    } else {
        if(!configController.checkWapiParam()) {
            if(configController.getCurSecurity() == AccessPoint.SECURITY_WAPI_CERT) {
                startWapiCertManage();
            }
            return;
        }
        mWifiManager.save(config, mSaveListener);
        if (mSelectedAccessPoint != null) { // Not an "Add network"
            connect(config, false /* isSavedNetwork */,
                    CONNECT_SOURCE_UNSPECIFIED);
        }
    }

    mWifiTracker.resumeScanning();
}
代码语言:javascript
AI代码解释
复制
protected void connect(final WifiConfiguration config,
        boolean isSavedNetwork, @ConnectSource int connectSource) {
    // Log subtype if configuration is a saved network.
    mMetricsFeatureProvider.action(getContext(), SettingsEnums.ACTION_WIFI_CONNECT,
            isSavedNetwork);
    mConnectSource = connectSource;
    mWifiManager.connect(config, mConnectListener);
    mClickedConnect = true;
}

二、这里我们先看connect是怎么实现的,save的过程最后再看。具体实现还是在service,wifimanager只是一个桥梁、

frameworks/base/wifi/java/android/net/wifi/WifiManager.java

代码语言:javascript
AI代码解释
复制
public void connect(@NonNull WifiConfiguration config, @Nullable ActionListener listener) {
    if (config == null) throw new IllegalArgumentException("config cannot be null");
    connectInternal(config, WifiConfiguration.INVALID_NETWORK_ID, listener);
}
代码语言:javascript
AI代码解释
复制
private void connectInternal(@Nullable WifiConfiguration config, int networkId,
        @Nullable ActionListener listener) {
    ActionListenerProxy listenerProxy = null;
    Binder binder = null;
    if (listener != null) {
        listenerProxy = new ActionListenerProxy("connect", mLooper, listener);
        binder = new Binder();
    }
    try {
        mService.connect(config, networkId, binder, listenerProxy,
                listener == null ? 0 : listener.hashCode());
    } catch (RemoteException e) {
        if (listenerProxy != null) listenerProxy.onFailure(ERROR);
    } catch (SecurityException e) {
        if (listenerProxy != null) listenerProxy.onFailure(NOT_AUTHORIZED);
    }
}

三、wifiservice会判断uid的权限,然后这里会判断staid,因为android11上层是支持了双wifi的,就是连接俩个AP,当然具体功能还要厂商自己实现,双AP具体可以看Android11 wifi开启流程,这里开启wifi时就会分配staid。这里如果是AP1则是正常流程走ClientModeImpl,如果是AP2则会走QtiClientModeImpl。

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java

代码语言:javascript
AI代码解释
复制
public void connect(WifiConfiguration config, int netId, IBinder binder,
        @Nullable IActionListener callback, int callbackIdentifier) {
    int uid = Binder.getCallingUid();
    if (!isPrivileged(Binder.getCallingPid(), uid)) {
        throw new SecurityException(TAG + ": Permission denied");
    }
    mLog.info("connect uid=%").c(uid).flush();
    int staId;
    if(config != null) staId = config.staId;
    else staId = getIdentityForNetwork(netId);
    if(staId == STA_PRIMARY) {
    } else {
        QtiClientModeImpl qtiClientModeImpl = mActiveModeWarden.getQtiClientModeImpl(staId);
        if (qtiClientModeImpl != null)
            qtiClientModeImpl.connect(config, netId, binder, callback, callbackIdentifier, uid);
    }
    if (mWifiPermissionsUtil.checkNetworkSettingsPermission(uid)) {
        if (config == null) {
            mWifiMetrics.logUserActionEvent(UserActionEvent.EVENT_MANUAL_CONNECT, netId);
        } else {
            mWifiMetrics.logUserActionEvent(
                    UserActionEvent.EVENT_ADD_OR_UPDATE_NETWORK, config.networkId);
        }
    }
    mClientModeImpl.connect(config, netId, binder, callback, callbackIdentifier, uid);
}

四、看一下wifi状态机里做了什么事情。

首先是调用WifiConfigManager.addOrUpdateNetwork来更新网络配置。如果保存成功则发送广播。然后检查网络权限等等各项操作结束以后,发送消息CMD_CONNECT_NETWORK。

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java

代码语言:javascript
AI代码解释
复制
public void connect(WifiConfiguration config, int netId, @Nullable IBinder binder,
        @Nullable IActionListener callback, int callbackIdentifier, int callingUid) {
    mWifiInjector.getWifiThreadRunner().post(() -> {
        if (callback != null && binder != null) {
            mProcessingActionListeners.add(binder, callback, callbackIdentifier);
        }
        /**
         * The connect message can contain a network id passed as arg1 on message or
         * or a config passed as obj on message.
         * For a new network, a config is passed to create and connect.
         * For an existing network, a network id is passed
         */
        NetworkUpdateResult result = null;
        if (config != null) {
            result = mWifiConfigManager.addOrUpdateNetwork(config, callingUid);
            if (!result.isSuccess()) {
                loge("connectNetwork adding/updating config=" + config + " failed");
                sendActionListenerFailure(callbackIdentifier, WifiManager.ERROR);
                return;
            }
            broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_SAVED, config);
        } else {
            if (mWifiConfigManager.getConfiguredNetwork(netId) == null) {
                loge("connectNetwork Invalid network Id=" + netId);
                sendActionListenerFailure(callbackIdentifier, WifiManager.ERROR);
                return;
            }
            result = new NetworkUpdateResult(netId);
        }
        final int networkId = result.getNetworkId();
        mWifiConfigManager.userEnabledNetwork(networkId);
        if (!mWifiConfigManager.enableNetwork(networkId, true, callingUid, null)
                || !mWifiConfigManager.updateLastConnectUid(networkId, callingUid)) {
            logi("connect Allowing uid " + callingUid
                    + " with insufficient permissions to connect=" + networkId);
        } else if (mWifiPermissionsUtil.checkNetworkSettingsPermission(callingUid)) {
            // Note user connect choice here, so that it will be considered in the
            // next network selection.
            mWifiConnectivityManager.setUserConnectChoice(networkId);
        }
        Message message =
                obtainMessage(CMD_CONNECT_NETWORK, -1, callbackIdentifier, result);
        message.sendingUid = callingUid;
        sendMessage(message);
    });
}

现在wifi状态机应该在ConnectModeState。我们看它怎么处理。

代码语言:javascript
AI代码解释
复制
case CMD_CONNECT_NETWORK:
    callbackIdentifier = message.arg2;
    result = (NetworkUpdateResult) message.obj;
    netId = result.getNetworkId();
    connectToUserSelectNetwork(
            netId, message.sendingUid, result.hasCredentialChanged());
    mWifiMetrics.logStaEvent(
            StaEvent.TYPE_CONNECT_NETWORK,
            mWifiConfigManager.getConfiguredNetwork(netId));
    sendActionListenerSuccess(callbackIdentifier);
    break;
代码语言:javascript
AI代码解释
复制
private void connectToUserSelectNetwork(int netId, int uid, boolean forceReconnect) {
    logd("connectToUserSelectNetwork netId " + netId + ", uid " + uid
            + ", forceReconnect = " + forceReconnect);
    if (!forceReconnect && (mLastNetworkId == netId || mTargetNetworkId == netId)) {
        // We're already connecting/connected to the user specified network, don't trigger a
        // reconnection unless it was forced.
        logi("connectToUserSelectNetwork already connecting/connected=" + netId);
    } else {
        mWifiConnectivityManager.prepareForForcedConnection(netId);
        if (uid == Process.SYSTEM_UID) {
            mWifiMetrics.setNominatorForNetwork(netId,
                    WifiMetricsProto.ConnectionEvent.NOMINATOR_MANUAL);
        }
        startConnectToNetwork(netId, uid, SUPPLICANT_BSSID_ANY);
    }
}

这里有发送了CMD_START_CONNECT消息。

代码语言:javascript
AI代码解释
复制
public void startConnectToNetwork(int networkId, int uid, String bssid) {
    sendMessage(CMD_START_CONNECT, networkId, uid, bssid);
}

还是在ConnectModeState中处理。在这里会更新AP的信息,然后计分器打分,从底层获取macaddress,然后开启IPClient。上述完成以后开始connectToNetwork

代码语言:javascript
AI代码解释
复制
case CMD_START_CONNECT:
    /* connect command coming from auto-join */
    netId = message.arg1;
    int uid = message.arg2;
    bssid = (String) message.obj;
    mSentHLPs = false;

    if (!hasConnectionRequests()) {
        if (mNetworkAgent == null) {
            loge("CMD_START_CONNECT but no requests and not connected,"
                    + " bailing");
            break;
        } else if (!mWifiPermissionsUtil.checkNetworkSettingsPermission(uid)) {
            loge("CMD_START_CONNECT but no requests and connected, but app "
                    + "does not have sufficient permissions, bailing");
            break;
        }
    }
    config = mWifiConfigManager.getConfiguredNetworkWithoutMasking(netId);
    logd("CMD_START_CONNECT "
            + " my state " + getCurrentState().getName()
            + " nid=" + Integer.toString(netId)
            + " roam=" + Boolean.toString(mIsAutoRoaming));
    if (config == null) {
        loge("CMD_START_CONNECT and no config, bail out...");
        break;
    }
    mTargetNetworkId = netId;
    // Update scorecard while there is still state from existing connection
    int scanRssi = mWifiConfigManager.findScanRssi(netId,
            mWifiHealthMonitor.getScanRssiValidTimeMs());
    mWifiScoreCard.noteConnectionAttempt(mWifiInfo, scanRssi, config.SSID);
    mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(config.SSID);

    updateWifiConfigOnStartConnection(config, bssid);
    reportConnectionAttemptStart(config, mTargetBssid,
            WifiMetricsProto.ConnectionEvent.ROAM_UNRELATED);

    String currentMacAddress = mWifiNative.getMacAddress(mInterfaceName);
    mWifiInfo.setMacAddress(currentMacAddress);
    Log.i(TAG, "Connecting with " + currentMacAddress + " as the mac address");
    mTargetWifiConfiguration = config;
    /* Check for FILS configuration again after updating the config */
    if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.FILS_SHA256)
            || config.allowedKeyManagement.get(
            WifiConfiguration.KeyMgmt.FILS_SHA384)) {

        boolean isIpClientStarted = startIpClient(config, true);
        if (isIpClientStarted) {
            mIpClientWithPreConnection = true;
            break;
        }
    }
    connectToNetwork(config);
    break;
代码语言:javascript
AI代码解释
复制
void connectToNetwork(WifiConfiguration config) {
    if ((config != null) && mWifiNative.connectToNetwork(mInterfaceName, config)) {
        mWifiInjector.getWifiLastResortWatchdog().noteStartConnectTime();
        mWifiMetrics.logStaEvent(StaEvent.TYPE_CMD_START_CONNECT, config);
        mLastConnectAttemptTimestamp = mClock.getWallClockMillis();
        mIsAutoRoaming = false;
        if (getCurrentState() != mDisconnectedState) {
            transitionTo(mDisconnectingState);
        }
    } else {
        loge("CMD_START_CONNECT Failed to start connection to network " + config);
        mTargetWifiConfiguration = null;
        stopIpClient();
        reportConnectionAttemptEnd(
                WifiMetrics.ConnectionEvent.FAILURE_CONNECT_NETWORK_FAILED,
                WifiMetricsProto.ConnectionEvent.HLF_NONE,
                WifiMetricsProto.ConnectionEvent.FAILURE_REASON_UNKNOWN);
    }
}

五、然后通过WifiNative到了SupplicantStaIfaceHal

frameworks/opt/net/wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java

connectToNetwork->addNetworkAndSaveConfig->addNetwork->supplicant

六、到了supplicant里面,添加网络,注册网络,完成以后就要开始连接了

external/wpa_supplicant_8/wpa_supplicant/hidl/1.3/sta_iface.cpp

代码语言:javascript
AI代码解释
复制
std::pair<SupplicantStatus, sp<ISupplicantNetwork>>
StaIface::addNetworkInternal()
{
	android::sp<ISupplicantStaNetwork> network;
	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
	if (!ssid) {
		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
	}
	HidlManager *hidl_manager = HidlManager::getInstance();
	if (!hidl_manager ||
	    hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId(
		wpa_s->ifname, ssid->id, &network)) {
		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
	}
	return {{SupplicantStatusCode::SUCCESS, ""}, network};
}

external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.c

代码语言:javascript
AI代码解释
复制
struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s)
{
	struct wpa_ssid *ssid;

	ssid = wpa_config_add_network(wpa_s->conf);
	if (!ssid)
		return NULL;
	wpas_notify_network_added(wpa_s, ssid);
	ssid->disabled = 1;
	wpa_config_set_network_defaults(ssid);

	return ssid;
}

/external/wpa_supplicant_8/wpa_supplicant/config.c

代码语言:javascript
AI代码解释
复制
struct wpa_ssid * wpa_config_add_network(struct wpa_config *config)
{
	int id;
	struct wpa_ssid *ssid, *last = NULL;

	id = -1;
	ssid = config->ssid;
	while (ssid) {
		if (ssid->id > id)
			id = ssid->id;
		last = ssid;
		ssid = ssid->next;
	}
	id++;

	ssid = os_zalloc(sizeof(*ssid));
	if (ssid == NULL)
		return NULL;
	ssid->id = id;
	dl_list_init(&ssid->psk_list);
	if (last)
		last->next = ssid;
	else
		config->ssid = ssid;

	wpa_config_update_prio_list(config);

	return ssid;
}

external/wpa_supplicant_8/wpa_supplicant/notify.c

代码语言:javascript
AI代码解释
复制
void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
			       struct wpa_ssid *ssid)
{
	if (wpa_s->p2p_mgmt)
		return;

	/*
	 * Networks objects created during any P2P activities should not be
	 * exposed out. They might/will confuse certain non-P2P aware
	 * applications since these network objects won't behave like
	 * regular ones.
	 */
	if (!ssid->p2p_group && wpa_s->global->p2p_group_formation != wpa_s) {
		wpas_dbus_register_network(wpa_s, ssid);
#ifdef CONFIG_HIDL
		wpas_hidl_register_network(wpa_s, ssid);
#endif
	}
}

external/wpa_supplicant_8/wpa_supplicant/hidl/1.3/hidl.cpp

代码语言:javascript
AI代码解释
复制
int wpas_hidl_register_network(
    struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
{
	if (!wpa_s || !wpa_s->global->hidl || !ssid)
		return 1;

	wpa_printf(
	    MSG_DEBUG, "Registering network to hidl control: %d", ssid->id);

	HidlManager *hidl_manager = HidlManager::getInstance();
	if (!hidl_manager)
		return 1;

	return hidl_manager->registerNetwork(wpa_s, ssid);
}

七、接着第五步,SupplicantStaIfaceHal中的connectToNetwork最后会执行select,我们看supplicant中select具体做了什么

代码语言:javascript
AI代码解释
复制
SupplicantStaNetworkHal networkHandle =
       checkSupplicantStaNetworkAndLogFailure(ifaceName, "connectToNetwork");
if (networkHandle == null) {
   loge("No valid remote network handle for network configuration: "
           + config.getKey());
   return false;
}

PmkCacheStoreData pmkData = mPmkCacheEntries.get(config.networkId);
if (pmkData != null
       && !WifiConfigurationUtil.isConfigForPskNetwork(config)
       && pmkData.expirationTimeInSec > mClock.getElapsedSinceBootMillis() / 1000) {
   logi("Set PMK cache for config id " + config.networkId);
   if (networkHandle.setPmkCache(pmkData.data)) {
       mWifiMetrics.setConnectionPmkCache(true);
   }
}

if (!networkHandle.select()) {
   loge("Failed to select network configuration: " + config.getKey());
   return false;
}
return true;
}

八、这里选择AP以后就开始关联了,关联成功就是四次握手。

external/wpa_supplicant_8/wpa_supplicant/hidl/1.3/sta_network.cpp

external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.c

/external/wpa_supplicant_8/wpa_supplicant/events.c

external/wpa_supplicant_8/src/rsn_supp/wpa.c

select->selectInternal->wpa_supplicant_select_network->wpa_supplicant_fast_associate->wpas_select_network_from_last_scan->wpa_supplicant_pick_network->wpa_supplicant_select_bss->wpa_supplicant_connect->wpa_supplicant_associate->wpas_start_assoc_cb->wpa_sm_set_assoc_wpa_ie

supplicant状态的关键日志

代码语言:javascript
AI代码解释
复制
09-07 11:17:32.502  3911  3911 D wpa_supplicant: wlan0: State: DISCONNECTED -> ASSOCIATING
09-07 11:17:32.554  3911  3911 D wpa_supplicant: wlan0: State: ASSOCIATING -> ASSOCIATED
09-07 11:17:32.665  3911  3911 D wpa_supplicant: wlan0: State: ASSOCIATED -> 4WAY_HANDSHAKE
09-07 11:17:32.683  3911  3911 D wpa_supplicant: wlan0: State: 4WAY_HANDSHAKE -> 4WAY_HANDSHAKE
09-07 11:17:32.686  3911  3911 D wpa_supplicant: wlan0: State: 4WAY_HANDSHAKE -> GROUP_HANDSHAKE
09-07 11:17:32.689  3911  3911 D wpa_supplicant: wlan0: State: GROUP_HANDSHAKE -> COMPLETED

总体流程如下图,第一次画流程图,有点丑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
内存焦虑?长文梳理: HBM/DRAM/CXL/HBF/GPU-Direct
在人工智能,特别是大语言模型(LLM)和基础模型飞速发展的今天,模型的规模和复杂性呈指数级增长,对内存容量和带宽的需求急剧膨胀,传统CPU-DRAM与块存储的两级架构已难以满足现代AI工作负载的严苛要求。这不仅导致了严重的性能瓶颈,更催生了“搁浅GPUs”(Stranded GPUs)现象——大量内存资源因无法被高效利用而闲置。
数据存储前沿技术
2025/10/09
1K0
内存焦虑?长文梳理: HBM/DRAM/CXL/HBF/GPU-Direct
AMD:AI集群扩展架构技术总结
数据中心网络的传统层级由核心层(CORE)、汇聚层(AGGREGATION)和架顶层(TOR)构成,主要承载南北向数据流量;而AI集群的兴起催生了“东西向后端”新层级,该层级以高带宽、低延迟为核心需求,专门支撑GPU间密集的数据交互,成为Fabric技术扩展的核心场景。
光芯
2025/09/03
2910
AMD:AI集群扩展架构技术总结
基于CXL™-Type3 实现内存池化
Microchip Technology Inc. 是一家总部位于美国亚利桑那州钱德勒的半导体公司,成立于1989年。该公司专注于设计、开发和制造微控制器、混合信号、模拟和闪存(Flash)IP解决方案。Microchip 的产品广泛应用于汽车、工业、消费电子、计算机和通信等多个行业。
数据存储前沿技术
2025/02/11
8931
基于CXL™-Type3 实现内存池化
XConn:CXL内存应用的带宽和时延
• XConn Technologies开发了CXL 2.0和PCIe 5.0交换机芯片,支持混合模式。
数据存储前沿技术
2025/02/11
9580
XConn:CXL内存应用的带宽和时延
PCIe Gen5 互联拓扑设计与经验
机箱中没有额外的高性能CPU,数据控制流从计算节点(Copmute)通过PCIe交换机调取数据到GPU节点处理。
数据存储前沿技术
2025/02/11
8710
PCIe Gen5  互联拓扑设计与经验
从CXL路标,看数据中心再解耦
Flit是"Flow Control Unit"的缩写,在CXL等高速互连协议中,它是数据传输的基本单位。
数据存储前沿技术
2025/02/11
5340
从CXL路标,看数据中心再解耦
澜起科技:CXL 2.0 内存共享案例
本文由 Montage 技术的Geof Findley介绍,他拥有超过20年内存产品经验,在DDR4和DDR5内存接口产品方面处于行业领先地位,并且在PCIe Gen 4和5 Retimer领域具有广泛的市场设计经验。
数据存储前沿技术
2025/02/11
7910
澜起科技:CXL 2.0 内存共享案例
Xconn:CXL 2.0 交换机实现内存共享
本文介绍了Xconn Technologies公司开发的基于Compute Express Link (CXL) 2.0标准的交换机,旨在实现数据中心内可组合内存系统的高效管理与资源共享。
数据存储前沿技术
2025/02/11
1.5K0
Xconn:CXL 2.0 交换机实现内存共享
AsteraLabs:PCIe 长距离跨节点传输方案
总结: AI基础设施面临的主要挑战包括模型规模指数增长、GPU集群需求增加、功耗限制及热量管理。这对扩展多个机架中的计算集群带来了巨大压力。
数据存储前沿技术
2025/02/11
6170
AsteraLabs:PCIe 长距离跨节点传输方案
三星:光互连+分层网络架构+内存优化,打造百万卡算力集群
三星在去年提出了本项目,旨在通过跨学科协作,在本十年末打造一个包含100万个GPU/xPU的超级计算集群,以突破当前AI/ML工作负载的性能瓶颈。这一“登月计划”的核心在于解决大规模计算元件的连接性、内存效率和网络扩展性问题,其技术路径涵盖原生互连、光通信、内存架构优化及分层集群设计。
光芯
2025/04/08
3150
三星:光互连+分层网络架构+内存优化,打造百万卡算力集群
CXL 实践指南:关于内存扩展,需要知道的是...
在人工智能(AI)和机器学习(ML)领域,数据处理的需求呈指数级增长,对内存容量和性能提出了前所未有的挑战。传统的DRAM解决方案在成本、容量和扩展性方面面临瓶颈。Compute Express Link(CXL)作为一种新兴的互连技术,通过提供高速、低延迟的连接,为解决这些挑战带来了新的希望。本文深入探讨了CXL技术在AI/ML应用中的潜力,并提供了一份实践指南,旨在帮助读者了解如何利用CXL技术释放AI和ML的性能。
数据存储前沿技术
2025/05/01
1.9K0
CXL 实践指南:关于内存扩展,需要知道的是...
澜起科技PCIe 5.0/CXL 2.0 Retimer芯片实现量产
1月6日消息,澜起科技今日宣布其PCIe 5.0 / CXL 2.0 Retimer 芯片成功实现量产。该芯片是澜起科技现有 PCIe 4.0 Retimer 产品的升级,可为业界提供稳定可靠的高带宽、低延迟PCIe 5.0/ CXL 2.0互连解决方案。
芯智讯
2023/02/09
3790
深入理解DRAM-4(结):未来与CXL
考虑到以上因素,目前3DS生产工艺,停留在2层堆叠,即DDP(Dual Die Package ),先进厂商提出4D-NAND概念[1]。
数据存储前沿技术
2025/02/11
2800
深入理解DRAM-4(结):未来与CXL
深入理解DRAM(全文·万字30+图)
其中,“数据传输速率”是指每个时钟周期内单个引脚的数据传输速度,而“位宽”则代表了连接到内存控制器的引脚数量。
数据存储前沿技术
2025/02/11
5.5K0
深入理解DRAM(全文·万字30+图)
超微:下一代存储系统接口设计与实践
按:海外服务器厂商 Supermicro (超微)在FMS2024 峰会上,介绍了其最新存储服务器架构设计和选型建议,并曝露CXL内存的支持路标。
数据存储前沿技术
2025/02/11
4130
超微:下一代存储系统接口设计与实践
Samsung:数据为中心的内存架构
随着AI/ML/自动驾驶等数据密集型场景逐渐落地,新一轮应用资源特征,对现有计算架构提出新挑战,产业需要平衡三大资源:
数据存储前沿技术
2025/02/11
3170
Samsung:数据为中心的内存架构
Solidigm:无序IO访问优化CXL内存性能
Solidigm 是一家全球领先的创新NAND闪存解决方案提供商。该公司源自于2020年10月SK海力士与英特尔签订的协议,收购了英特尔的NAND和固态硬盘(SSD)业务。Solidigm于2021年12月30日正式成立,成为SK海力士在美国的独立子公司。
数据存储前沿技术
2025/02/11
3100
Solidigm:无序IO访问优化CXL内存性能
Google/Meta:云服务商视角下的CXL应用
Note:鹏弟认为,基于CXL Switch互联的内存,应属于 Network Attached 范畴。前几天整理的CXL Switch 多级内存时延测试数据,解耦内存池访问时延在1μs以内,与图中时延在一个数量级,图示数据时延更高。
数据存储前沿技术
2025/02/11
5220
Google/Meta:云服务商视角下的CXL应用
Intel 的光学互连方案 -- CPO 与 OCI 以及 4Tbps 光学小芯片
这两天 Intel 公司在 “HotChips 2024” 中介绍了它的”4Tb/s Optical Compute Interconnect Chiplet for XPU - to - XPU Connectivity“。翻译过来就是 ”用于 XPU 到 XPU 连接的 4Tb/s 光计算互连芯片“。
通往ICT之路
2024/08/30
1.4K0
Intel 的光学互连方案  --  CPO 与 OCI 以及 4Tbps 光学小芯片
SK Hynix:CXL内存解耦在HPC/AI场景的应用
1. 内存资源利用不足与性能瓶颈:传统数据中心面临内存孤岛和数据溢出问题,导致内存资源浪费和性能降低,难以满足AI和大数据应用需求。
数据存储前沿技术
2025/02/11
4350
SK Hynix:CXL内存解耦在HPC/AI场景的应用
推荐阅读
相关推荐
内存焦虑?长文梳理: HBM/DRAM/CXL/HBF/GPU-Direct
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档