電腦開機老要重插內存
電腦開機無反應,顯示器也不亮,這是大家平時使用電腦當中經常會遇到故障之一,最常用的解決辦法就是拔下內存條,清理一下內存插槽的灰塵,把內存條的金手指用橡皮擦下再重新輸入,一頓操作之后大多數情況下都是可以...
2025.07.03COPYRIGHT ? 2023
粵ICP備2021108052號
郵箱:611661226@qq.com
留言給我在介紹 HugePages 之前,我們先來回顧一下 Linux 下 虛擬內存 與 物理內存 之間的關系。
嵌入式進階教程分門別類整理好了,看的時候十分方便,由于內容較多,這里就截取一部分圖吧。
需要的朋友私信【內核】即可領取。
我們通過圖1描述虛擬內存地址轉換成物理內存地址的過程:
如 圖1 所示,頁表 保存的是虛擬內存地址與物理內存地址的映射關系,MMU 從 頁表 中找到虛擬內存地址所映射的物理內存地址,然后把物理內存地址提交給 CPU,這個過程與 Hash 算法相似。
內存映射是以內存頁作為單位的,通常情況下,一個內存頁的大小為 4KB(如圖1所示),所以稱為 分頁機制。
我們來看看在 64 位的 Linux 系統中(英特爾 x64 CPU),虛擬內存地址轉換成物理內存地址的過程,如圖2:
從圖2可以看出,Linux 只使用了 64 位虛擬內存地址的前面 48 位(0 ~ 47倍),并且 Linux 把這 48 虛擬內存地址分為 5 個部分,如下:
把 圖1 中的 頁表 分為 4 級:頁全局目錄、頁上級目錄、頁中間目錄 和 頁表 目的是為了減少內存消耗(思考下為什么可以減少內存消耗)。
注意:頁全局目錄、頁上級目錄、頁中間目錄 和 頁表 都占用一個 4KB 大小的物理內存頁,由于 64 位內存地址占用 8 個字節,所以一個 4KB 大小的物理內存也可以容納 512 個 64 位內存地址。
另外,CPU 有個名為 CR3 的寄存器,用于保存 頁全局目錄 的起始物理內存地址(如圖2所示)。所以,虛擬內存地址轉換成物理內存地址的過程如下:
上面介紹了以 4KB 的內存頁作為內存映射的單位,但有些場景我們希望使用更大的內存頁作為映射單位(如 2MB)。使用更大的內存頁作為映射單位有如下好處:
Tips:TLB 是一塊高速緩存,TLB 緩存虛擬內存地址與其映射的物理內存地址。MMU 首先從 TLB 查找內存映射的關系,如果找到就不用回溯查找頁表。否則,只能根據虛擬內存地址,去頁表中查找其映射的物理內存地址。
因為映射的內存頁越大,所需要的 頁表 就越小(很容易理解);頁表 越小,TLB 失效的情況就越少。
使用大于 4KB 的內存頁作為內存映射單位的機制叫 HugePages,目前 Linux 常用的 HugePages 大小為 2MB 和 1GB,我們以 2MB 大小的內存頁作為例子。
要映射更大的內存頁,只需要增加偏移量部分,如 圖3 所示:
如 圖3 所示,現在把偏移量部分擴展到 21 位(頁表部分被覆蓋了,21 位能夠表示的大小范圍為 0 ~ 2MB),所以 頁中間目錄 直接指向映射的 物理內存頁地址。
這樣,就可以減少 頁表 部分的內存消耗。由于內存映射關系變少,所以 TLB 失效的情況也會減少。
了解了 HugePages 的原理后,我們來介紹一下怎么使用 HugePages。
HugePages 的使用不像普通內存申請那么簡單,而是需要借助 Hugetlb文件系統 來創建,下面將會介紹 HugePages 的使用步驟:
Hugetlb 文件系統是專門為 HugePages 而創造的,我們可以通過以下命令來掛載一個 Hugetlb 文件系統:
$ mkdir /mnt/huge$ mount none /mnt/huge -t hugetlbfs
執行完上面的命令后,我們就在 /mnt/huge 目錄下掛載了 Hugetlb 文件系統。
要使用 HugePages,首先要向內核聲明可以使用的 HugePages 數量。/proc/sys/vm/nr_hugepages 文件保存了內核可以使用的 HugePages 數量,我們可以使用以下命令設置新的可用 HugePages 數量:
$ echo 20 > /proc/sys/vm/nr_hugepages
上面命令設置了可用的 HugePages 數量為 20 個(也就是 20 個 2MB 的內存頁)。
要使用 HugePages,必須使用 mmap 系統調用把虛擬內存映射到 Hugetlb 文件系統中的文件,如下代碼:
#include #include #include #include #define MAP_LENGTH (10*1024*1024) // 10MBint main(){int fd;void * addr;// 1. 創建一個 Hugetlb 文件系統的文件fd = open("/mnt/huge/hugepage1", O_CREAT|O_RDWR);if (fd < 0) {perror("open()");return -1;}// 2. 把虛擬內存映射到 Hugetlb 文件系統的文件中addr = mmap(0, MAP_LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (addr == MAP_FAILED) {perror("mmap()");close(fd);unlink("/mnt/huge/hugepage1");return -1;}strcpy(addr, "This is HugePages example...");printf("%s\n", addr);// 3. 使用完成后,解除映射關系munmap(addr, MAP_LENGTH);close(fd);unlink("/mnt/huge/hugepage1");return 0; }
編譯上面的代碼并且執行,如果沒有問題,將會輸出以下信息:
This is HugePages example...
本文主要介紹了 HugePages 的原理和使用,雖然 HugePages 有很多優點,但也有其不足的地方。比如調用 fork 系統調用創建子進程時,內核使用了 寫時復制 的技術,在父子進程內存發生改變時,需要復制更大的內存頁,從而影響性能。
電腦開機無反應,顯示器也不亮,這是大家平時使用電腦當中經常會遇到故障之一,最常用的解決辦法就是拔下內存條,清理一下內存插槽的灰塵,把內存條的金手指用橡皮擦下再重新輸入,一頓操作之后大多數情況下都是可以...
2025.07.03視頻相對于其他格式的文件,體積都比較大,有時候分享給其他人的時候會受到平臺大小限制,針對這樣的問題可以先將視頻壓縮(https://www.yasuoshipin.com)變小,那么怎么壓縮視頻大小呢...
2025.07.02RT,有些圖片,通過windows照片查看器查看,提示windows照片查看器無法顯示此圖片,因為內存不足。一百度,全是改環境變量的,關環境變量毛事?我C盤可用空間160G,電腦內存16G,有毛線不足...
2025.07.02簡介內存是計算機中最重要的資源之一,通常情況下,物理內存無法容納下所有的進程。雖然物理內存的增長現在達到了N個GB,但比物理內存增長還快的是程序,所以無論物理內存如何增長,都趕不上程序增長的速度,所以...
2025.07.03很多人現在在DIY的時候,都是直接買板U套餐,確實,這個很方便,但是,往往很多人都忽略了主板,或者壓根沒去看什么樣的主板。主板:在一臺微型計算機里,主板上安裝了計算機的主要電路系統和大量的集成電路,并...
2025.07.03