国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DPDK系列之十六虛擬化virtio源碼分析之virtio-user

這篇具有很好參考價值的文章主要介紹了DPDK系列之十六虛擬化virtio源碼分析之virtio-user。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、virtio-user說明

在網(wǎng)絡IO的半虛擬中,vhost-user是目前最優(yōu)的解決方案。在DPDK中,同樣也采用了這種方式。vhost-user是為了解決內(nèi)核狀態(tài)數(shù)據(jù)操作復雜的情況提出的一種解決方式,通過在用戶進程來替代內(nèi)核進程來實現(xiàn)數(shù)據(jù)交互的最少化。在vhost-user在應用場景中,虛擬化的容器支持是一個重點方向。起初的virtio-user就是為了支持容器內(nèi)部與DPDK通信的。后來也發(fā)展到虛擬設(shè)備間的通信。
DPDK與Kernel的通信也叫做“exception path”,通常來說,這種通信方式主要有幾種:
1、KNI,是目前DPDK中用戶使用的主要方案。即通過虛擬網(wǎng)絡接口,利用隊列和DPDK應用交的數(shù)據(jù),但無法實現(xiàn)upstream(一種負載均衡的手段)
2、Tun/Tap或者pcap PMD.需要內(nèi)核切換,效率差
3、Flow Bifurcation,虛擬多張網(wǎng)卡,依賴硬件,不靈活
4、virtio-user和vhost-net,這是比較好的一種實現(xiàn)機制。
virtio-user在DPDK和虛擬場景下的應用還是非常多的。virtio-user虛擬出的設(shè)備和真實的設(shè)備在上層看沒有區(qū)別,這個非常重要。

二、數(shù)據(jù)結(jié)構(gòu)

下面看一下在DPDK中相關(guān)的數(shù)據(jù)結(jié)構(gòu)定義:

struct virtio_user_queue {
	uint16_t used_idx;
	bool avail_wrap_counter;
	bool used_wrap_counter;
};

struct virtio_user_dev {
	/* for vhost_user backend */
	int		vhostfd;
	int		listenfd;   /* listening fd */
	bool		is_server;  /* server or client mode */

	/* for vhost_kernel backend */
	char		*ifname;
	int		*vhostfds;
	int		*tapfds;

	/* for both vhost_user and vhost_kernel */
	int		callfds[VIRTIO_MAX_VIRTQUEUES];
	int		kickfds[VIRTIO_MAX_VIRTQUEUES];
	int		mac_specified;
	uint32_t	max_queue_pairs;
	uint32_t	queue_pairs;
	uint32_t	queue_size;
	uint64_t	features; /* the negotiated features with driver,
				   * and will be sync with device
				   */
	uint64_t	device_features; /* supported features by device */
	uint64_t	frontend_features; /* enabled frontend features */
	uint64_t	unsupported_features; /* unsupported features mask */
	uint8_t		status;
	uint16_t	net_status;
	uint16_t	port_id;
	uint8_t		mac_addr[RTE_ETHER_ADDR_LEN];
	char		path[PATH_MAX];
	union {
		struct vring		vrings[VIRTIO_MAX_VIRTQUEUES];
		struct vring_packed	packed_vrings[VIRTIO_MAX_VIRTQUEUES];
	};
	struct virtio_user_queue packed_queues[VIRTIO_MAX_VIRTQUEUES];
	bool		qp_enabled[VIRTIO_MAX_VIRTQUEUE_PAIRS];

	struct virtio_user_backend_ops *ops;
	pthread_mutex_t	mutex;
	bool		started;
};

除了虛擬設(shè)備外,其實它主要是和VHOST以及相關(guān)數(shù)據(jù)隊列的操作,而那些數(shù)據(jù)結(jié)構(gòu)在前面已經(jīng)基本都介紹過了。

三、基本流程

其實在前面說了,virtio-user在虛擬環(huán)境中應用非常廣泛,在virtio-user文件夾(driver/net/virtio)下可以看到,其實最主要的就是那幾個文件:

int
virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
		     int cq, int queue_size, const char *mac, char **ifname,
		     int server, int mrg_rxbuf, int in_order, int packed_vq)
{
	pthread_mutex_init(&dev->mutex, NULL);
	strlcpy(dev->path, path, PATH_MAX);
	dev->started = 0;
	dev->max_queue_pairs = queues;
	dev->queue_pairs = 1; /* mq disabled by default */
	dev->queue_size = queue_size;
	dev->is_server = server;
	dev->mac_specified = 0;
	dev->frontend_features = 0;
	dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES;
	parse_mac(dev, mac);

	if (*ifname) {
		dev->ifname = *ifname;
		*ifname = NULL;
	}

	if (virtio_user_dev_setup(dev) < 0) {
		PMD_INIT_LOG(ERR, "backend set up fails");
		return -1;
	}

	if (!dev->is_server) {
		if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER,
					   NULL) < 0) {
			PMD_INIT_LOG(ERR, "set_owner fails: %s",
				     strerror(errno));
			return -1;
		}

		if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
					   &dev->device_features) < 0) {
			PMD_INIT_LOG(ERR, "get_features failed: %s",
				     strerror(errno));
			return -1;
		}
	} else {
		/* We just pretend vhost-user can support all these features.
		 * Note that this could be problematic that if some feature is
		 * negotiated but not supported by the vhost-user which comes
		 * later.
		 */
		dev->device_features = VIRTIO_USER_SUPPORTED_FEATURES;
	}

	if (!mrg_rxbuf)
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_MRG_RXBUF);

	if (!in_order)
		dev->unsupported_features |= (1ull << VIRTIO_F_IN_ORDER);

	if (!packed_vq)
		dev->unsupported_features |= (1ull << VIRTIO_F_RING_PACKED);

	if (dev->mac_specified)
		dev->frontend_features |= (1ull << VIRTIO_NET_F_MAC);
	else
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_MAC);

	if (cq) {
		/* device does not really need to know anything about CQ,
		 * so if necessary, we just claim to support CQ
		 */
		dev->frontend_features |= (1ull << VIRTIO_NET_F_CTRL_VQ);
	} else {
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_CTRL_VQ);
		/* Also disable features that depend on VIRTIO_NET_F_CTRL_VQ */
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_CTRL_RX);
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_CTRL_VLAN);
		dev->unsupported_features |=
			(1ull << VIRTIO_NET_F_GUEST_ANNOUNCE);
		dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ);
		dev->unsupported_features |=
			(1ull << VIRTIO_NET_F_CTRL_MAC_ADDR);
	}

	/* The backend will not report this feature, we add it explicitly */
	if (is_vhost_user_by_type(dev->path))
		dev->frontend_features |= (1ull << VIRTIO_NET_F_STATUS);

	/*
	 * Device features =
	 *     (frontend_features | backend_features) & ~unsupported_features;
	 */
	dev->device_features |= dev->frontend_features;
	dev->device_features &= ~dev->unsupported_features;

	if (rte_mem_event_callback_register(VIRTIO_USER_MEM_EVENT_CLB_NAME,
				virtio_user_mem_event_cb, dev)) {
		if (rte_errno != ENOTSUP) {
			PMD_INIT_LOG(ERR, "Failed to register mem event"
					" callback\n");
			return -1;
		}
	}

	return 0;
}

先是對設(shè)備的初始化,然后進行Setup:

static int
virtio_user_dev_setup(struct virtio_user_dev *dev)
{
	uint32_t q;

	dev->vhostfd = -1;
	dev->vhostfds = NULL;
	dev->tapfds = NULL;

	if (dev->is_server) {
		if (access(dev->path, F_OK) == 0 &&
		    !is_vhost_user_by_type(dev->path)) {
			PMD_DRV_LOG(ERR, "Server mode doesn't support vhost-kernel!");
			return -1;
		}
		dev->ops = &virtio_ops_user;
	} else {
		if (is_vhost_user_by_type(dev->path)) {
			dev->ops = &virtio_ops_user;
		} else {
			dev->ops = &virtio_ops_kernel;

			dev->vhostfds = malloc(dev->max_queue_pairs *
					       sizeof(int));
			dev->tapfds = malloc(dev->max_queue_pairs *
					     sizeof(int));
			if (!dev->vhostfds || !dev->tapfds) {
				PMD_INIT_LOG(ERR, "Failed to malloc");
				return -1;
			}

			for (q = 0; q < dev->max_queue_pairs; ++q) {
				dev->vhostfds[q] = -1;
				dev->tapfds[q] = -1;
			}
		}
	}

	if (dev->ops->setup(dev) < 0)
		return -1;

	if (virtio_user_dev_init_notify(dev) < 0)
		return -1;

	if (virtio_user_fill_intr_handle(dev) < 0)
		return -1;

	return 0;
}

然后在處理用戶狀態(tài)時可以啟動:

//drivers/net/virtio/virtio_user_ethdev.c
static void
virtio_user_set_status(struct virtio_hw *hw, uint8_t status)
{
	struct virtio_user_dev *dev = virtio_user_get_dev(hw);

	if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
		virtio_user_start_device(dev);
	else if (status == VIRTIO_CONFIG_STATUS_RESET)
		virtio_user_reset(hw);
	dev->status = status;
}

int
virtio_user_start_device(struct virtio_user_dev *dev)
{
	uint64_t features;
	int ret;

	/*
	 * XXX workaround!
	 *
	 * We need to make sure that the locks will be
	 * taken in the correct order to avoid deadlocks.
	 *
	 * Before releasing this lock, this thread should
	 * not trigger any memory hotplug events.
	 *
	 * This is a temporary workaround, and should be
	 * replaced when we get proper supports from the
	 * memory subsystem in the future.
	 */
	rte_mcfg_mem_read_lock();
	pthread_mutex_lock(&dev->mutex);

	if (is_vhost_user_by_type(dev->path) && dev->vhostfd < 0)
		goto error;

	/* Step 0: tell vhost to create queues */
	if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0)
		goto error;

	/* Step 1: set features */
	features = dev->features;
	/* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */
	features &= ~(1ull << VIRTIO_NET_F_MAC);
	/* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */
	features &= ~(1ull << VIRTIO_NET_F_CTRL_VQ);
	features &= ~(1ull << VIRTIO_NET_F_STATUS);
	ret = dev->ops->send_request(dev, VHOST_USER_SET_FEATURES, &features);
	if (ret < 0)
		goto error;
	PMD_DRV_LOG(INFO, "set features: %" PRIx64, features);

	/* Step 2: share memory regions */
	ret = dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL);
	if (ret < 0)
		goto error;

	/* Step 3: kick queues */
	if (virtio_user_queue_setup(dev, virtio_user_kick_queue) < 0)
		goto error;

	/* Step 4: enable queues
	 * we enable the 1st queue pair by default.
	 */
	dev->ops->enable_qp(dev, 0, 1);

	dev->started = true;
	pthread_mutex_unlock(&dev->mutex);
	rte_mcfg_mem_read_unlock();

	return 0;
error:
	pthread_mutex_unlock(&dev->mutex);
	rte_mcfg_mem_read_unlock();
	/* TODO: free resource here or caller to check */
	return -1;
}

這里其實會調(diào)用send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL)來傳遞內(nèi)存數(shù)據(jù)(ops中設(shè)置),如果后端為vhost-user時,即為vhost_user_sock。

//drivers/net/virtio/virtio-user
static int
vhost_user_sock(struct virtio_user_dev *dev,
		enum vhost_user_request req,
		void *arg)
{
	struct vhost_user_msg msg;
	struct vhost_vring_file *file = 0;
	int need_reply = 0;
	int fds[VHOST_MEMORY_MAX_NREGIONS];
	int fd_num = 0;
	int len;
	int vhostfd = dev->vhostfd;

	RTE_SET_USED(m);

	PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);

	if (dev->is_server && vhostfd < 0)
		return -1;

	msg.request = req;
	msg.flags = VHOST_USER_VERSION;
	msg.size = 0;

	switch (req) {
	case VHOST_USER_GET_FEATURES:
		need_reply = 1;
		break;

	case VHOST_USER_SET_FEATURES:
	case VHOST_USER_SET_LOG_BASE:
		msg.payload.u64 = *((__u64 *)arg);
		msg.size = sizeof(m.payload.u64);
		break;

	case VHOST_USER_SET_OWNER:
	case VHOST_USER_RESET_OWNER:
		break;

	case VHOST_USER_SET_MEM_TABLE:
		if (prepare_vhost_memory_user(&msg, fds) < 0)
			return -1;
		fd_num = msg.payload.memory.nregions;
		msg.size = sizeof(m.payload.memory.nregions);
		msg.size += sizeof(m.payload.memory.padding);
		msg.size += fd_num * sizeof(struct vhost_memory_region);
		break;

	case VHOST_USER_SET_LOG_FD:
		fds[fd_num++] = *((int *)arg);
		break;

	case VHOST_USER_SET_VRING_NUM:
	case VHOST_USER_SET_VRING_BASE:
	case VHOST_USER_SET_VRING_ENABLE:
		memcpy(&msg.payload.state, arg, sizeof(msg.payload.state));
		msg.size = sizeof(m.payload.state);
		break;

	case VHOST_USER_GET_VRING_BASE:
		memcpy(&msg.payload.state, arg, sizeof(msg.payload.state));
		msg.size = sizeof(m.payload.state);
		need_reply = 1;
		break;

	case VHOST_USER_SET_VRING_ADDR:
		memcpy(&msg.payload.addr, arg, sizeof(msg.payload.addr));
		msg.size = sizeof(m.payload.addr);
		break;

	case VHOST_USER_SET_VRING_KICK:
	case VHOST_USER_SET_VRING_CALL:
	case VHOST_USER_SET_VRING_ERR:
		file = arg;
		msg.payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK;
		msg.size = sizeof(m.payload.u64);
		if (file->fd > 0)
			fds[fd_num++] = file->fd;
		else
			msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK;
		break;

	default:
		PMD_DRV_LOG(ERR, "trying to send unhandled msg type");
		return -1;
	}

	len = VHOST_USER_HDR_SIZE + msg.size;
	if (vhost_user_write(vhostfd, &msg, len, fds, fd_num) < 0) {
		PMD_DRV_LOG(ERR, "%s failed: %s",
			    vhost_msg_strings[req], strerror(errno));
		return -1;
	}

	if (need_reply) {
		if (vhost_user_read(vhostfd, &msg) < 0) {
			PMD_DRV_LOG(ERR, "Received msg failed: %s",
				    strerror(errno));
			return -1;
		}

		if (req != msg.request) {
			PMD_DRV_LOG(ERR, "Received unexpected msg type");
			return -1;
		}

		switch (req) {
		case VHOST_USER_GET_FEATURES:
			if (msg.size != sizeof(m.payload.u64)) {
				PMD_DRV_LOG(ERR, "Received bad msg size");
				return -1;
			}
			*((__u64 *)arg) = msg.payload.u64;
			break;
		case VHOST_USER_GET_VRING_BASE:
			if (msg.size != sizeof(m.payload.state)) {
				PMD_DRV_LOG(ERR, "Received bad msg size");
				return -1;
			}
			memcpy(arg, &msg.payload.state,
			       sizeof(struct vhost_vring_state));
			break;
		default:
			PMD_DRV_LOG(ERR, "Received unexpected msg type");
			return -1;
		}
	}

	return 0;
}

找到相關(guān)的VHOST_USER_SET_MEM_TABLE選項設(shè)置就看了數(shù)據(jù)的準備,從調(diào)用函數(shù)就可以一路深入進去,明白整個過程。這里就不再做介紹。

四、總結(jié)

通過上面的分析可以看出,virtio-user既可以實現(xiàn)虛擬機前后端的通信,也可以實現(xiàn)不同設(shè)備間的通信,還可以實現(xiàn)與內(nèi)核間的通信。所以一種新的技術(shù)被提出后,會不斷的推動應用的向前發(fā)展,反過來,應用的發(fā)展又不斷要求前者提供更好的支持。互相促進,就會形成一個新的應用場景并有可能暴發(fā)。文章來源地址http://www.zghlxwxcb.cn/news/detail-430867.html

到了這里,關(guān)于DPDK系列之十六虛擬化virtio源碼分析之virtio-user的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • KVM虛擬化解決方案系列之KVM架構(gòu)篇

    KVM虛擬化解決方案系列之KVM架構(gòu)篇

    虛擬化是云計算的基礎(chǔ),在有虛擬化之前,一個物理主機上只能安裝一個操作系統(tǒng)和運行一個核心業(yè)務程序。在有了虛擬化之后,一個物理主機上可以運行多臺虛擬機,虛擬機上可以安裝不同的操作系統(tǒng)和運行不同的核心業(yè)務程序,虛擬機共享物理主機的CPU、內(nèi)存、I/O硬件資

    2024年02月09日
    瀏覽(18)
  • KVM虛擬化解決方案系列之KVM部署篇(1-4)

    KVM虛擬化解決方案系列之KVM部署篇(1-4)

    通過《KVM虛擬化解決方案系列之KVM架構(gòu)篇》我們了解了KVM的基本架構(gòu)之后,那么接下來繼續(xù)介紹如何使用KVM來搭建自己的虛擬化環(huán)境,搭建環(huán)境如表1所示。 表1. KVM搭建環(huán)境 主機名 角色 操作系統(tǒng) IP地址 備注 kvm01 KVM主機1 CentOS-7-x86_64-DVD-1810.ISO 192.168.150.151 kvm02 KVM主機2 ubuntu-

    2024年02月14日
    瀏覽(24)
  • KVM虛擬化解決方案系列之KVM管理工具-libvirt介紹篇

    KVM虛擬化解決方案系列之KVM管理工具-libvirt介紹篇

    KVM作為后起之秀,在公有云Hytervisor市場中占主宰地位,如一大批基于OpenStack二次開發(fā)的云廠商。而老牌的商業(yè)VMware則在私有云Hytervisor市場中占主宰地位,仍然是各大中小企業(yè)搭建私有云的首選,不過目前也受到Hyper-V的挑戰(zhàn)。 Hypervisor虛擬化技術(shù)有很多種實現(xiàn)方式,如KVM、Q

    2024年02月06日
    瀏覽(25)
  • 【SA8295P 源碼分析】17 - 設(shè)備虛擬化 之 Passthrough透傳、Vdev Trap、HAB Socket 原理解析

    【源碼分析】 因為一些原因,本文需要移除, 對于已經(jīng)購買的兄弟,不用擔心,不是跑路, 我會繼續(xù)持續(xù)提供技術(shù)支持, 有什么模塊想學習的,或者有什么問題有疑問的, 請私聊我,我們 +VX 溝通技術(shù)問題,一起學習,一起進步 接下來,我一一私聊已經(jīng)購買的兄弟添加V

    2024年02月12日
    瀏覽(19)
  • Linux Kernel入門到精通系列講解(QEMU-虛擬化篇) 2.2 新增加CPU外設(shè)之UART、中斷控制器和pFLASH

    上一章節(jié)我們將 CPU 和部分 memory 已經(jīng)初始化完成了,具體實現(xiàn)可以查看代碼倉庫,本章節(jié)我們將在上一章節(jié)的基礎(chǔ)之上去增加 pFlash 設(shè)備(作為初始化完 ROM 后的第一個代碼存儲區(qū))、中斷控制器和 UART 設(shè)備。

    2024年04月25日
    瀏覽(28)
  • Linux Kernel入門到精通系列講解(QEMU-虛擬化篇) 2.1 新增加一個RISC-V CPU(NARUTO-PI)

    上一章節(jié)我們講解了開源的 QEMU 開發(fā)板怎么啟動,從這章節(jié)開始,我們將會親手去從無到有開發(fā)一個 CPU ,它包括 CPU Core , Memory Device , Communication Controller 和 Device 等等。 注意,本章節(jié)中調(diào)用的很多自定義宏都在 include/hw/riscv/naruto.h 文件,這里我就不展開說了,大家下載我

    2024年04月25日
    瀏覽(27)
  • 云計算虛擬化技術(shù)與開發(fā)-------虛擬化技術(shù)應用第一章內(nèi)容(虛擬化技術(shù)概念、虛擬化特征、虛擬化目的、半虛擬化和全虛擬化特點和區(qū)別、虛擬化實現(xiàn)的三種結(jié)構(gòu)的特點和區(qū)別)

    云計算虛擬化技術(shù)與開發(fā)-------虛擬化技術(shù)應用第一章內(nèi)容(虛擬化技術(shù)概念、虛擬化特征、虛擬化目的、半虛擬化和全虛擬化特點和區(qū)別、虛擬化實現(xiàn)的三種結(jié)構(gòu)的特點和區(qū)別)

    目錄 虛擬化技術(shù)第一章主要內(nèi)容 虛擬化技術(shù)的概念: 虛擬化的特征: ????????虛擬化的目的: 虛擬化與云計算的關(guān)系: 半虛擬化和全虛擬化的特點和區(qū)別: ?虛擬化實現(xiàn)的三種結(jié)構(gòu)的特點和區(qū)別: ????????虛擬化(Virtualization)是把物理資源轉(zhuǎn)變?yōu)檫壿嬌峡梢怨芾?/p>

    2024年02月03日
    瀏覽(23)
  • 云計算基礎(chǔ)-計算虛擬化-內(nèi)存虛擬化

    云計算基礎(chǔ)-計算虛擬化-內(nèi)存虛擬化

    內(nèi)存在物理上是由內(nèi)存卡提供的,也就是我們俗稱的內(nèi)存條,內(nèi)存條提供了物理內(nèi)存。 在物理內(nèi)存之上還有虛擬內(nèi)存,虛擬內(nèi)存操作系統(tǒng)給程序分配的一段連續(xù)的內(nèi)存,屬于邏輯上的概念。 虛擬內(nèi)存和物理內(nèi)存之間會有一個映射關(guān)系,這個映射關(guān)系我們稱之為頁表,通過頁

    2024年02月20日
    瀏覽(31)
  • 什么是網(wǎng)絡虛擬化 網(wǎng)絡虛擬化簡介

    這個概念產(chǎn)生的比較久了,VLAN,VPN, VPLS等 都可以歸為網(wǎng)絡虛擬化的技術(shù)。近年來,云計算的浪潮席卷IT界。幾乎所有的IT基礎(chǔ)構(gòu)架都在朝著云的方向發(fā)展。在云計算的發(fā)展中,虛擬化技術(shù)一直是重要的推動因素。作為基礎(chǔ)構(gòu)架,服務器和存儲的虛擬化已經(jīng)發(fā)展的有聲有色,

    2024年02月05日
    瀏覽(26)
  • 云計算基礎(chǔ)-計算虛擬化-CPU虛擬化

    云計算基礎(chǔ)-計算虛擬化-CPU虛擬化

    在CPU的工作原理中,CPU有不同的指令集,如下圖,CPU有4各指令集:Ring0-3,指令集是在服務器上運行的所有命令,最終都會在CPU上執(zhí)行,但是CPU并不是說所有的命令都是一視同仁的,它會把命令分為不同的指令集 Ring0指令集稱之為內(nèi)核態(tài)指令集,改啊指令集里面啊運行的主要

    2024年02月20日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包