在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

VFIO設(shè)備直通原理

冬至子 ? 來源:openEuler ? 作者:openEuler ? 2023-06-07 17:40 ? 次閱讀

設(shè)備直通給虛擬機能夠極大提升虛擬機對物理設(shè)備訪問的性能,本文通過vfio內(nèi)核模塊和qemu用戶態(tài)實現(xiàn)介紹vfio設(shè)備直通時的關(guān)鍵部分,包括:用戶態(tài)訪問設(shè)備IO地址空間,DMA重映射,中斷重映射等.

VFIO訪問直通設(shè)備IO地址空間

1.PIO和MMIO

設(shè)備的IO地址空間的訪問有PIO和MMIO兩種方式,前者通過獨立的IO端口訪問設(shè)備,而MMIO是在物理內(nèi)存中映射一段區(qū)間,直接訪問該內(nèi)存就可以訪問設(shè)備的配置空間.在虛擬化的場景下,虛擬機通過PIO訪問直通設(shè)備時,首先會VM-exit到qemu,由qemu通過轉(zhuǎn)換表完成對該PIO操作的轉(zhuǎn)發(fā).對于PCI設(shè)備而言,其bar空間地址是通過PIO的方式設(shè)置的,如果將設(shè)備的PIO訪問完全暴露給虛擬機,虛擬機修改了真實的物理設(shè)備的PCI Bar空間基地址配置,與host上不一致,可能會出現(xiàn)嚴重的問題,所以對于設(shè)備的PIO訪問需要建立轉(zhuǎn)換表,在VM-exit之后由qemu來完成設(shè)置的轉(zhuǎn)發(fā).

對于設(shè)備的MMIO空間訪問,則可以通過建立EPT頁表將設(shè)備的MMIO物理內(nèi)存映射到虛擬的MMIO地址空間,讓虛擬機能夠直接通過MMIO訪問PCI設(shè)備的bar空間,提高IO性能.

2.獲取直通設(shè)備信息

通過VFIO提供的接口可以獲取到設(shè)備的基本信息,包括設(shè)備的描述符、region的數(shù)量等。

vfio_get_device:
    fd = ioctl(group- >fd, VFIO_GROUP_GET_DEVICE_FD, name);
    ret = ioctl(fd, VFIO_DEVICE_GET_INFO, &dev_info);

    vbasedev- >fd = fd;
    vbasedev- >group = group;
    QLIST_INSERT_HEAD(&group- >device_list, vbasedev, next);

    vbasedev- >num_irqs = dev_info.num_irqs;
    vbasedev- >num_regions = dev_info.num_regions;
    vbasedev- >flags = dev_info.flags;

2.直通設(shè)備PCI配置空間模擬

Qemu為每個PCI直通設(shè)備都建立一個虛擬數(shù)據(jù)結(jié)構(gòu) VFIOPCIDevice,保存物理PCI設(shè)備的相關(guān)信息,由vfio_get_device來獲取,保存到vbasedev中。

typedef struct VFIOPCIDevice {
    PCIDevice pdev;
    VFIODevice vbasedev;

VFIO設(shè)備作為qemu的設(shè)備模型的一部分,qemu對直通設(shè)備的模擬初始化入口在 vfio_realize,通過vfio_get_device獲取到直通設(shè)備的基本信息之后,會調(diào)用pread設(shè)備的fd獲取到設(shè)備的配置空間信息的一份拷貝,qemu會寫入一些自定義的config配置。

vfio_realize:
    /* Get a copy of config space */
    ret = pread(vdev- >vbasedev.fd, vdev- >pdev.config,
                MIN(pci_config_size(&vdev- >pdev), vdev- >config_size),
                vdev- >config_offset);
    if (ret < (int)MIN(pci_config_size(&vdev- >pdev), vdev- >config_size)) {
        ret = ret < 0 ? -errno : -EFAULT;
        error_setg_errno(errp, -ret, "failed to read device config space");
        goto error;
    }

    /* vfio emulates a lot for us, but some bits need extra love */
    vdev- >emulated_config_bits = g_malloc0(vdev- >config_size);

    /* QEMU can choose to expose the ROM or not */
    memset(vdev- >emulated_config_bits + PCI_ROM_ADDRESS, 0xff, 4);

    /* QEMU can change multi-function devices to single function, or reverse */
    vdev- >emulated_config_bits[PCI_HEADER_TYPE] =
                                              PCI_HEADER_TYPE_MULTI_FUNCTION;

    /* Restore or clear multifunction, this is always controlled by QEMU */
    if (vdev- >pdev.cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
        vdev- >pdev.config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
    } else {
        vdev- >pdev.config[PCI_HEADER_TYPE] &= ~PCI_HEADER_TYPE_MULTI_FUNCTION;
    }

    /*
     * Clear host resource mapping info.  If we choose not to register a
     * BAR, such as might be the case with the option ROM, we can get
     * confusing, unwritable, residual addresses from the host here.
     */
    memset(&vdev- >pdev.config[PCI_BASE_ADDRESS_0], 0, 24);
    memset(&vdev- >pdev.config[PCI_ROM_ADDRESS], 0, 4);

3.直通設(shè)備MMIO映射

直通PCI設(shè)備的MMIO內(nèi)存主要是指其Bar空間,qemu使用vfio_populate_device函數(shù)調(diào)用VFIO接口獲取到PCI設(shè)備的Bar空間信息,然后通過vfio_region_setup獲取到對應(yīng)region的信息,并將qemu內(nèi)存虛擬化的MemoryRegion設(shè)置為IO類型的region。重要的是,qemu會為該IO類型的MemoryRegion設(shè)置ops為vfio_region_ops,這樣后續(xù)對于該塊內(nèi)存的讀寫會經(jīng)過qemu VFIO模塊注冊的接口來進行。

vfio_populate_device:
    for (i = VFIO_PCI_BAR0_REGION_INDEX; i < VFIO_PCI_ROM_REGION_INDEX; i++) {
        char *name = g_strdup_printf("%s BAR %d", vbasedev- >name, i);

        ret = vfio_region_setup(OBJECT(vdev), vbasedev, &vdev- >bars[i].region, i, name);
            - > vfio_get_region_info
            - > memory_region_init_io(region- >mem, obj, &vfio_region_ops,
                              region, name, region- >size);
        QLIST_INIT(&vdev- >bars[i].quirks);
    }
    ret = vfio_get_region_info(vbasedev, VFIO_PCI_CONFIG_REGION_INDEX, ®_info);
            - >    ioctl(vbasedev- >fd, VFIO_DEVICE_GET_REGION_INFO, *info))
    ret = ioctl(vdev- >vbasedev.fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);

到這里已經(jīng)獲取到了PCI設(shè)備的MMIO內(nèi)存信息,但是還沒有真正的將物理內(nèi)存中的Bar空間映射到qemu,這一動作在vfio_bars_setup中完成,vfio_region_mmap會對region中每個需要map的內(nèi)存地址完成映射,然后將映射的物理內(nèi)存通過qemu注冊到虛擬機作為一段虛擬機的物理地址空間。

vfio_bars_setup:
    for (i = 0; i < PCI_ROM_SLOT; i++)
        vfio_bar_setup(vdev, i);
            vfio_region_mmap(&bar- >region)
                    for (i = 0; i < region- >nr_mmaps; i++) {
                    region- >mmaps[i].mmap = mmap(NULL, region- >mmaps[i].size, prot,
                                                MAP_SHARED, region- >vbasedev- >fd,
                                                region- >fd_offset +
                                                region- >mmaps[i].offset);
                    memory_region_init_ram_device_ptr
                    memory_region_add_subregion
            pci_register_bar(&vdev- >pdev, nr, type, bar- >region.mem);

這里的映射mmap接口對應(yīng)的是VFIO設(shè)備在內(nèi)核中注冊的vfio_pci_mmap 函數(shù),在內(nèi)核中,該函數(shù)會為vma注冊一個mmap的ops,對應(yīng)著注冊了一個缺頁處理函數(shù),當(dāng)用戶態(tài)程序訪問該段虛擬內(nèi)存缺頁時,調(diào)用注冊的缺頁處理函數(shù),完成虛擬地址到實際物理地址的映射。

vfio_pci_mmap:
    vma- >vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
    vma- >vm_ops = &vfio_pci_mmap_ops;
        - > .fault = vfio_pci_mmap_fault,
                - > if (remap_pfn_range(vma, vma- >vm_start, vma- >vm_pgoff,
                    vma- >vm_end - vma- >vm_start, vma- >vm_page_prot))

簡單來說,對于MMIO內(nèi)存的的映射,主要是將物理內(nèi)存中的MMIO空間映射到了qemu的虛擬地址空間,然后再由qemu將該段內(nèi)存注冊進虛擬機作為虛擬機的一段物理內(nèi)存,在這個過程中會建立從gpa到hpa的EPT頁表映射,提升MMIO的性能。

DMA重映射

首先關(guān)于DMA,設(shè)備通過DMA可以直接使用iova地址訪問物理內(nèi)存,從iova到實際物理地址的映射是在IOMMU中完成的,一般在dma_allooc分配設(shè)備能夠訪問的內(nèi)存的時候,會分配iova地址和實際的物理地址空間,并在iommu中建立映射關(guān)系。 所以說要讓設(shè)備進行DMA最關(guān)鍵的幾個部分:

  • 設(shè)備能夠識別的地址:IOVA
  • 一段物理內(nèi)存
  • IOVA到物理內(nèi)存在IOMMU中的映射關(guān)系

基于這幾點來看VFIO的DMA重映射就比較清晰,首先從VFIO設(shè)備的初始化開始,在獲取設(shè)備信息之前會先獲取到設(shè)備所屬的group和Container,并調(diào)用VFIO_SET_IOMMU完成container和IOMMU的綁定,并attach由VFIO管理的所有設(shè)備。此外注意到這里的 pci_device_iommu_address_space 函數(shù),意思是qemu為設(shè)備dma注冊了一段專門的地址空間,這段內(nèi)存作為虛擬機的一段物理內(nèi)存存在,在VFIO_SET_IOMMU之后,注冊該地址空間,其region_add函數(shù)為 vfio_listener_region_add,意思是當(dāng)內(nèi)存空間布局發(fā)生變化這里是增加內(nèi)存的時候都會調(diào)用該接口。

vfio_realize:
    group = vfio_get_group(groupid, pci_device_iommu_address_space(pdev), errp);
        vfio_connect_container(group, as, errp)
            ret = ioctl(fd, VFIO_SET_IOMMU, container- >iommu_type);
            container- >listener = vfio_memory_listener;
            memory_listener_register(&container- >listener, container- >space- >as);
                    - > .region_add = vfio_listener_region_add,

那么跟DMA有什么關(guān)系呢,當(dāng)為設(shè)備進行DMA分配一塊內(nèi)存時,實際是以MemoryRegion的形式存在的,也就是說虛擬機進行dma alloc 會調(diào)用region_add函數(shù),進而調(diào)用注冊的memory_listener_region_add函數(shù),MemoryRegion有了意味著分配了一塊物理內(nèi)存,還需要IOVA和映射關(guān)系才行。這里,IOVA地址使用的是section->offset_within_address_space,為什么可以這樣,因為IOVA地址只是作為設(shè)備識別的地址,只要建立了映射關(guān)系就有意義。

vfio_listener_region_add:
    iova = TARGET_PAGE_ALIGN(section- >offset_within_address_space);
    /* Here we assume that memory_region_is_ram(section- >mr)==true */
    vaddr = memory_region_get_ram_ptr(section- >mr) +
            section- >offset_within_region +
            (iova - section- >offset_within_address_space);
    ret = vfio_dma_map(container, iova, int128_get64(llsize),
                       vaddr, section- >readonly);

vfio_dma_map:
    struct vfio_iommu_type1_dma_map map = {
        .argsz = sizeof(map),
        .flags = VFIO_DMA_MAP_FLAG_READ,
        .vaddr = (__u64)(uintptr_t)vaddr,
        .iova = iova,
        .size = size,
    };

    ioctl(container- >fd, VFIO_IOMMU_MAP_DMA, &map)

建立映射的關(guān)鍵在于vfio_dma_map,通過ioctl調(diào)用container->fd接口VFIO_IOMMU_MAP_DMA完成DMA重映射。為什么是container->fd,因為VFIO Container管理內(nèi)存資源,與IOMMU直接綁定,而IOMMU是完成IOVA到實際物理內(nèi)存映射的關(guān)鍵。值得注意的是qemu只知道這一段內(nèi)存的虛擬地址vaddr,所以將vaddr,iova和size傳給內(nèi)核,由內(nèi)核獲取物理內(nèi)存信息完成映射。

vfio_dma_do_map:
    vfio_pin_map_dma
        while (size) {
            /* Pin a contiguous chunk of memory */
            npage = vfio_pin_pages_remote(dma, vaddr + dma- >size,
                                size > > PAGE_SHIFT, &pfn, limit);
            /* Map it! */
            vfio_iommu_map(iommu, iova + dma- >size, pfn, npage,
                            dma- >prot);
                list_for_each_entry(d, &iommu- >domain_list, next)
                    iommu_map(d- >domain, iova, (phys_addr_t)pfn < < PAGE_SHIFT,
                            npage < < PAGE_SHIFT, prot | d- >prot);
                        arm_smmu_map
                            __arm_lpae_map
            size -= npage < < PAGE_SHIFT;
            dma- >size += npage < < PAGE_SHIFT;
        }

內(nèi)核完成建立iova到物理內(nèi)存的映射之前會將分配的DMA內(nèi)存給pin住,使用vfio_pin_pages_remote接口可以獲取到虛擬地址對應(yīng)的物理地址和pin住的頁數(shù)量,然后vfio_iommu_map進而調(diào)用iommu以及smmu的map函數(shù),最終用iova,物理地址信息pfn以及要映射的頁數(shù)量在設(shè)備IO頁表中建立映射關(guān)系。

+--------+  iova  +--------+  gpa  +----+
| device |   - >   | memory |   < -  | vm |
+--------+        +--------+       +----+

最終完成了DMA重映射,設(shè)備使用qemu分配的iova地址通過IOMMU映射訪問內(nèi)存,虛擬機使用gpa通過Stage 2頁表映射訪問內(nèi)存

中斷重映射

對于PCI直通設(shè)備中斷的虛擬化,主要包括三種類型INTx,Msi和Msi-X。

1.INTx中斷初始化及enable

對于INTx類型的中斷,在初始化的時候就進行使能了,qemu通過VFIO device的接口將中斷irq set設(shè)置到內(nèi)核中,并且會注冊一個eventfd,設(shè)置了eventfd的handler,當(dāng)發(fā)生intx類型的中斷時,內(nèi)核會通過eventfd通知qemu進行處理,qemu會通知虛擬機進行處理。

vfio_realize:
    if (vfio_pci_read_config(&vdev- >pdev, PCI_INTERRUPT_PIN, 1)) {
        pci_device_set_intx_routing_notifier(&vdev- >pdev, vfio_intx_update);
        ret = vfio_intx_enable(vdev, errp);
            *pfd = event_notifier_get_fd(&vdev- >intx.interrupt);
            qemu_set_fd_handler(*pfd, vfio_intx_interrupt, NULL, vdev);
            ret = ioctl(vdev- >vbasedev.fd, VFIO_DEVICE_SET_IRQS, irq_set);

2.MSI-X初始化

MSIX在vfio_realzie初始化時,首先獲取到物理設(shè)備的中斷相關(guān)的配置信息,將其設(shè)置到注冊給對應(yīng)的MMIO內(nèi)存中

vfio_msix_early_setup:
    pos = pci_find_capability(&vdev- >pdev, PCI_CAP_ID_MSIX);

    if (pread(fd, &ctrl, sizeof(ctrl),
            vdev- >config_offset + pos + PCI_MSIX_FLAGS) != sizeof(ctrl)) {
    if (pread(fd, &table, sizeof(table),
            vdev- >config_offset + pos + PCI_MSIX_TABLE) != sizeof(table)) {
    if (pread(fd, &pba, sizeof(pba),
            vdev- >config_offset + pos + PCI_MSIX_PBA) != sizeof(pba)) {

    ctrl = le16_to_cpu(ctrl);
    table = le32_to_cpu(table);
    pba = le32_to_cpu(pba);

    msix = g_malloc0(sizeof(*msix));
    msix- >table_bar = table & PCI_MSIX_FLAGS_BIRMASK;
    msix- >table_offset = table & ~PCI_MSIX_FLAGS_BIRMASK;
    msix- >pba_bar = pba & PCI_MSIX_FLAGS_BIRMASK;
    msix- >pba_offset = pba & ~PCI_MSIX_FLAGS_BIRMASK;
    msix- >entries = (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1;

vfio_msix_setup:
    msix_init(&vdev- >pdev, vdev- >msix- >entries,
                    vdev- >bars[vdev- >msix- >table_bar].region.mem,
                    vdev- >msix- >table_bar, vdev- >msix- >table_offset,
                    vdev- >bars[vdev- >msix- >pba_bar].region.mem,
                    vdev- >msix- >pba_bar, vdev- >msix- >pba_offset, pos);
        
        memory_region_init_io(&dev- >msix_table_mmio, OBJECT(dev), &msix_table_mmio_ops, dev,
                          "msix-table", table_size);
        memory_region_add_subregion(table_bar, table_offset, &dev- >msix_table_mmio);
        memory_region_init_io(&dev- >msix_pba_mmio, OBJECT(dev), &msix_pba_mmio_ops, dev,
                            "msix-pba", pba_size);
        memory_region_add_subregion(pba_bar, pba_offset, &dev- >msix_pba_mmio);

vfio_realize:
    /* QEMU emulates all of MSI & MSIX */
    if (pdev- >cap_present & QEMU_PCI_CAP_MSIX) {
        memset(vdev- >emulated_config_bits + pdev- >msix_cap, 0xff,
               MSIX_CAP_LENGTH);

    if (pdev- >cap_present & QEMU_PCI_CAP_MSI) {
        memset(vdev- >emulated_config_bits + pdev- >msi_cap, 0xff,
               vdev- >msi_cap_size);
  1. MSI/MSI-X enable 與 irqfd的注冊

當(dāng)虛擬機因為寫PCI配置空間而發(fā)生VM-exit時,最終會完成msi和msix的使能,以MSIX的使能為例,在qemu側(cè)會設(shè)置eventfd的處理函數(shù),并通過kvm將irqfd注冊到內(nèi)核中,進而注冊虛擬中斷給虛擬機。

kvm_cpu_exec:
    vfio_pci_write_config:
        vfio_msi_enable(vdev);
        vfio_msix_enable(vdev);
            for (i = 0; i < vdev- >nr_vectors; i++) {
                if (event_notifier_init(&vector- >interrupt, 0)) {

                qemu_set_fd_handler(event_notifier_get_fd(&vector- >interrupt),
                                    vfio_msi_interrupt, NULL, vector);

                vfio_add_kvm_msi_virq(vdev, vector, i, false);
                    kvm_irqchip_add_msi_route(kvm_state, vector_n, &vdev- >pdev);
                    vfio_add_kvm_msi_virq
                        kvm_irqchip_add_irqfd_notifier_gsi
                            kvm_vm_ioctl(s, KVM_IRQFD, &irqfd);
            /* Set interrupt type prior to possible interrupts */
            vdev- >interrupt = VFIO_INT_MSI;
            ret = vfio_enable_vectors(vdev, false);
                ret = ioctl(vdev- >vbasedev.fd, VFIO_DEVICE_SET_IRQS, irq_set);

小結(jié)

要讓設(shè)備直通給虛擬機,需要將設(shè)備的DMA能力、中斷響應(yīng)和IO地址空間訪問安全地暴露給用戶態(tài),本文主要介紹了VFIO設(shè)備直通關(guān)鍵的幾個環(huán)節(jié),包括如何在用戶態(tài)訪問物理設(shè)備的IO地址空間、如何進行DMA重映射和中斷重映射。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    561

    瀏覽量

    100604
  • 虛擬機
    +關(guān)注

    關(guān)注

    1

    文章

    917

    瀏覽量

    28221
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    18307
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    13908
  • qemu
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    5357
收藏 人收藏

    評論

    相關(guān)推薦

    詳解交換機測試中的直通時延和存儲轉(zhuǎn)發(fā)時延二者區(qū)別

    有朋友問我,用我司BigTao200測試儀測試交換機時,在時延的統(tǒng)計項中有“直通時延”和“存儲轉(zhuǎn)發(fā)時延”,二者的區(qū)別在哪里?我的理解是這樣的——存儲轉(zhuǎn)發(fā)時延是數(shù)據(jù)最后一個比特到達設(shè)備輸入端口的時間
    發(fā)表于 08-26 16:29

    布線技巧二:UTP直通

    布線技巧二:UTP直通線 本系列的這一部分將關(guān)注CAT5網(wǎng)線安裝,因為它是目前最常見的UTP網(wǎng)線類型。它非常靈活,
    發(fā)表于 04-23 18:04 ?2290次閱讀

    什么是直通線?直通線的做法?

    什么是直通直通線是常用的一種計算機到交換機連線,兩端壓制的線序都應(yīng)該按照t-568b方式進行壓制。交叉線是常用的計算機到計算機
    發(fā)表于 04-23 23:59 ?8486次閱讀

    Linux設(shè)備與驅(qū)動的手動解綁與手動綁定

    但是有時候,這種自動匹配并不一定是我們想要的。比如我們有時候就是希望XXX設(shè)備用YYY驅(qū)動,而不是用XXX驅(qū)動。工程中有手動匹配的需求,最典型的場景是VFIO的場景,想讓設(shè)備與內(nèi)核空間原本綁定的驅(qū)動解綁,轉(zhuǎn)而采用內(nèi)核空間的通用
    的頭像 發(fā)表于 08-03 16:25 ?2914次閱讀
    Linux<b class='flag-5'>設(shè)備</b>與驅(qū)動的手動解綁與手動綁定

    關(guān)于VFIO的詳細研究解析

    由于VFIO是將設(shè)備直接透傳給虛擬機,所以Guest中與該設(shè)備相關(guān)的IO性能會大幅提高,接近native性能。
    的頭像 發(fā)表于 05-02 11:20 ?3563次閱讀
    關(guān)于<b class='flag-5'>VFIO</b>的詳細研究解析

    一個簡單的直通式監(jiān)聽板

    電子發(fā)燒友網(wǎng)站提供《一個簡單的直通式監(jiān)聽板.zip》資料免費下載
    發(fā)表于 07-29 14:39 ?2次下載
    一個簡單的<b class='flag-5'>直通</b>式監(jiān)聽板

    Arm對虛擬化下設(shè)備直通的支持

    虛擬機里使用直通設(shè)備,的確可以帶來最大的性能提升。但是卻暴漏出一系列的系統(tǒng)安全問題。比如提供DMA的設(shè)備通常可以寫內(nèi)存的任意頁,因此虛擬機里的Guest OS擁有創(chuàng)建DMA的能力就等同于用戶空間擁有了root權(quán)限
    的頭像 發(fā)表于 04-28 15:30 ?1276次閱讀
    Arm對虛擬化下<b class='flag-5'>設(shè)備</b><b class='flag-5'>直通</b>的支持

    為什么使用直通技術(shù)可以幫助延長儲能系統(tǒng)的使用壽命

    直通? mode 是一種控制器操作,使電源能夠直接連接到負載。直通模式用于降壓-升壓或升壓轉(zhuǎn)換器,以提高效率和電磁兼容性。1,2本文介紹了配備直通技術(shù)的控制器相對于其他控制器的優(yōu)勢,以及直通
    的頭像 發(fā)表于 06-15 09:55 ?1045次閱讀
    為什么使用<b class='flag-5'>直通</b>技術(shù)可以幫助延長儲能系統(tǒng)的使用壽命

    SMT貼片加工生產(chǎn)怎么提高直通

    一站式PCBA智造廠家今天為大家講講如何提高SMT貼片加工的直通率?提高smt貼片加工的直通率方法。SMT貼片加工對加工質(zhì)量評價有一個重要指標,那就是直通率。在貼片加工中。SMT加工直通
    的頭像 發(fā)表于 09-13 09:38 ?631次閱讀

    直通串口和交叉串口的區(qū)別 如何辨別交叉串口線與直連串口線?

    直通串口和交叉串口的區(qū)別 如何辨別交叉串口線與直連串口線?什么時候用交叉,什么時候用直通直通串口和交叉串口是在計算機設(shè)備或系統(tǒng)中用于連接串行設(shè)備
    的頭像 發(fā)表于 11-28 15:45 ?2620次閱讀

    smt貼片加工直通率為什么如此重要

    smt貼片加工,smt 直通率堪稱是貼片加工廠的生命線,有些公司的直通率必須達到95%才是達標線,因此直通率的高低,反應(yīng)了貼片加工廠的技術(shù)實力、工藝品質(zhì),直通率高能夠提升公司的產(chǎn)能效率
    的頭像 發(fā)表于 12-05 10:23 ?2086次閱讀

    直通網(wǎng)線和交叉網(wǎng)線的區(qū)別有哪些呢?

    T-568B線序標準。 在實際運用中,直通網(wǎng)線常用來連接不同的設(shè)備,例如電腦和路由器、路由器和交換機等,而交叉網(wǎng)線用來連接相同的設(shè)備,例如電腦和電腦、路由器和路由器。 此外,直通網(wǎng)線和
    的頭像 發(fā)表于 03-07 10:34 ?1475次閱讀

    直通網(wǎng)線和交叉網(wǎng)線區(qū)別

    白、棕。而交叉網(wǎng)線則在一端采用568A線序,另一端采用568B線序,其線纜兩端的線序是交叉的。568A的線序是:綠白、綠、橙白、藍、藍白、橙、棕白、棕。 使用場景:直通網(wǎng)線主要用于連接不同類型的設(shè)備,例如路由器與交換機、個人電腦
    的頭像 發(fā)表于 05-10 10:06 ?3259次閱讀

    直通網(wǎng)線的作用及制作步驟

    直通網(wǎng)線的主要作用是連接不同的設(shè)備,如電腦和路由器、路由器和交換機等,以建立網(wǎng)絡(luò)連接。以下是直通網(wǎng)線的制作步驟: 一、直通網(wǎng)線的作用 直通網(wǎng)
    的頭像 發(fā)表于 07-04 09:51 ?767次閱讀

    直通電度表——關(guān)鍵的計量設(shè)備

    在現(xiàn)代電力計量領(lǐng)域,直通電度表作為一種關(guān)鍵的計量設(shè)備,發(fā)揮著極為重要的作用。它能夠精確地測量電路中的電能消耗,為電力供應(yīng)、能源管理以及電費結(jié)算等諸多環(huán)節(jié)提供不可或缺的數(shù)據(jù)支持。 直通電度表,又稱
    的頭像 發(fā)表于 12-11 09:51 ?182次閱讀
    主站蜘蛛池模板: 午夜影院在线看| xxxx69日本hd| 足控免费视频xxav| 免费欧美黄色片| 特污兔午夜影院| 久操视频在线观看| 91天天干| 亚洲高清一区二区三区四区| 色黄视频| avbobo在线| 性做久久久久久久免费观看| 啪啪.com| 午夜性爽快| 亚洲性后网| 日韩欧美视频一区| 久久精品夜色国产| 97人人射| 4虎影院在线观看| 天天摸天天摸天天躁| 黄网在线看| 性夜黄 a 爽免费看| 亚洲综合色网| 欧美在线资源| 日本免费看黄| 日韩在线一区视频| 久久综合色视频| china国语对白刺激videos| 国产成人精品亚洲日本在线| 国模精品| 黄 色 毛片免费| 黄色短视频软件| 亚洲午夜久久| 操操操插插插| 国产精品一区在线播放| 久久久婷婷| 色五阁| 国产色秀视频| 狼人 成人 综合 亚洲| 国产精品夜夜春夜夜爽| 日本免费不卡在线一区二区三区| 天天摸天天舔天天操|