主頁 > 作業系統 > 痞子衡嵌入式:其實i.MXRT下改造FlexSPI driver同樣支持AHB方式去寫入NOR Flash

痞子衡嵌入式:其實i.MXRT下改造FlexSPI driver同樣支持AHB方式去寫入NOR Flash

2021-08-31 16:59:54 作業系統


  大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家介紹的是i.MXRT下改造FlexSPI driver以AHB方式去寫入NOR Flash

  痞子衡前段時間寫過一篇 《串行NAND Flash的兩大特性導致其在i.MXRT FlexSPI下無法XiP》,文章里介紹了 NAND Flash 的 Page Read 等待特性(發完 Read 命令后需要回讀 Flash 內部狀態暫存器 Busy 位來判斷 Page 資料是否已準備好)導致其無法像 NOR Flash 那樣通過 AHB 方式被便捷訪問,僅能在一個 Page 空間里實作 AHB 讀(前提是在 IPG 方式發完讀命令以及讀完狀態暫存器確保資料已經準備好后),

  回到 NOR Flash 上,我們可以輕松通過 AHB 方式讀取 Flash 資料,但寫入 Flash 一般都是呼叫 FlexSPI 驅動來實作(即 IPG 方式),那么有沒有可能也通過 “AHB 方式來寫入 Flash” 呢?答案是可以的,但為啥痞子衡加了個引號,且往下看:

本文以恩智浦 MIMXRT1170-EVK 開發板上主芯片 i.MXRT1176 及其配套板載 Flash 芯片 - 芯成 IS25WP128 為例,

一、Flash寫操作流程

  芯成 IS25WP128 是一顆很典型的四線 QSPI NOR Flash,其寫入(編程)時序是符合 JEDEC216 標準的,簡單來說,一個完整的寫時序包含三個獨立子時序:Write Enable 時序 + Page Program 時序 + Read Status 時序,

  先來看打頭陣的 Write Enable 子時序,NOR Flash 內部的狀態暫存器會有一個位叫 WEL (Write Enable Latch),這個位控制著 Flash 的擦寫權限,默認值是 0(即不允許擦寫),如果想要寫入 Flash,必須先通過 Write Enable 命令將 WEL 位臨時設為 1(這個位會隨著當前的擦寫命令結束后自動恢復到 0),

  置位了 WEL 后,便可以傳輸 Page 資料給 Flash,這個子時序便是 Page Program,Page Program 按命令地址和資料傳輸方式不同分為三種:一線 SPI,四線 SPI,QPI,下面是常用的四線 SPI 的時序圖,命令和地址通過 IO0 傳輸,資料通過 IO[3:0] 傳輸,

  通常來說,在這個時序里,傳入的地址應該是 Page 首地址,寫入資料長度應該是一個完整的 Page 大小,但從非 Page 首地址處寫入小于一個 Page 長度的資料也是可以的,但有一個注意點就是不要在這個時序里出現跨頁的現象(如果出現,超出當前頁的資料會被放回到該頁起始地址處),

  Page Program 子時序結束后,資料還并未真正寫入 Flash 記憶體體中,Flash 內部控制器只是開始處理資料,這時候會有一個等待時間(大概0.2ms),Flash 內部的狀態暫存器有一個位叫 WIP (Write In Progress),這個位標志著資料寫入狀態(默認值是 0,當 Page Program 子時序結束后,WIP 立即跳為 1),用戶需要通過 Read Status 子時序來實時讀取狀態暫存器的值從而獲知資料處理情況,

  當 Flash 內部狀態暫存器中的 WIP 位從 1 跳回到 0,便意味著一次完整的寫時序結束了,主機可以發起下一次寫時序,

二、FlexSPI對寫時序支持

  痞子衡舊文 《從頭開始認識i.MXRT啟動頭FDCB里的lookupTable》 里對 FlexSPI 讀時序介紹得非常詳細,尤其是對 AHB 方式讀支持的實作,現在痞子衡再介紹下 FlexSPI 對于寫時序的支持,

  第一節里介紹的 Flash 寫操作的三個子時序,在 FlexSPI 外設里當然都是支持的,SEQ_CTL 組件里都預先實作了這些子時序,比如下面就是 Page Program 的序列:

  因為 Flash 寫操作需要三個子序列,比 Flash 讀操作單序列要復雜得多,并且最關鍵的是寫操作還包含一個不確定的等待周期(Read Status 子時序與 Flash 互動),這就導致 FlexSPI 外設在 AHB 方式寫上沒法完美支持,這也是為什么寫入 Flash 都是通過 IPG 方式來完成的,因為 IPG 方式下,子序列可以隨意組合,由用戶代碼手動調度,

  原則上三個寫操作子序列可以放在 LUT 中的任何一個 Sequence 位置,因為即使按序放在一起,我們通過 FlexSPI->FLSHxCR2 暫存器(x可取A1/A2/B1/B2,具體根據Flash引腳連接來定)中的 AWRSEQID 位指明寫操作第一個子序列在 LUT 中的位置(index) 也無法自動完成 Page 資料的完整寫入操作,

  但也不要就此放棄,單獨 Page Program 子序列還是可以通過 AHB 方式寫來替代的,這樣也可以讓我們過一下 AHB 方式寫入 Flash 的癮,只是需要在 AHB 寫入操作前后輔助 IPG 方式下的 Write Enable 和 Read Status 動作,下一節用代碼給大家實際演示,

三、FlexSPI driver用法

例程路徑:\SDK_2.10.0_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer\cm7\iar

3.1 初始化

  先來看一下 FlexSPI 初始化函式 flexspi_nor_flash_init(),這個函式需要三個配置變數:分別是 flexspi_config_t 型面向 FlexSPI 外設層的配置 flexspiconfig,flexspi_device_config_t 型面向 Flash 器件端的配置 deviceconfig,以及很核心的 customLUT(這里只列出了跟 Flash 讀寫操作相關的時序),

#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD     0
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE        2
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD   4
#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG      12

#define CUSTOM_LUT_LENGTH        60
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
    /* Fast read quad mode - SDR */
    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),
    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = 
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x06, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04),

    /* Write Enable */
    [4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

    /* Page Program - quad mode */
    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

    /* Read status register */
    [4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),
};

flexspi_device_config_t deviceconfig = {
    .flexspiRootClk       = 12000000,
    .flashSize            = 0x4000, /* 16Mb/KByte */
    .CSIntervalUnit       = kFLEXSPI_CsIntervalUnit1SckCycle,
    .CSInterval           = 2,
    .CSHoldTime           = 3,
    .CSSetupTime          = 3,
    .dataValidTime        = 0,
    .columnspace          = 0,
    .enableWordAddress    = 0,
    .AWRSeqIndex          = 0,
    .AWRSeqNumber         = 0,
    // 支持 AHB 讀的關鍵配置
    .ARDSeqIndex          = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,
    .ARDSeqNumber         = 1,
    .AHBWriteWaitUnit     = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
    .AHBWriteWaitInterval = 0,
};

void flexspi_nor_flash_init(FLEXSPI_Type *base)
{
    CLOCK_SetRootClockDiv(kCLOCK_Root_Flexspi1, 2);
    CLOCK_SetRootClockMux(kCLOCK_Root_Flexspi1, 0);

    /*Get FLEXSPI default settings and configure the flexspi. */
    flexspi_config_t flexspiconfig;
    FLEXSPI_GetDefaultConfig(&flexspiconfig);

    /*Set AHB buffer size for reading data through AHB bus. */
    flexspiconfig.ahbConfig.enableAHBPrefetch    = true;
    flexspiconfig.ahbConfig.enableAHBBufferable  = true;
    flexspiconfig.ahbConfig.enableReadAddressOpt = true;
    flexspiconfig.ahbConfig.enableAHBCachable    = true;
    flexspiconfig.rxSampleClock                  = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;
    FLEXSPI_Init(base, &flexspiconfig);

    /* Configure flash settings according to serial flash feature. */
    FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA1);

    /* Update LUT table. */
    FLEXSPI_UpdateLUT(base, 0, customLUT, CUSTOM_LUT_LENGTH);

    /* Do software reset. */
    FLEXSPI_SoftwareReset(base);
}

3.2 一般用法(IPG寫)

  先來看 IPG 方式的 Flash 寫入函式,其中 Page Program 子時序是通過 FLEXSPI_TransferBlocking() 函式來完成的,這個函式就是往大小為 256 bytes 的 IP TX FIFO 寫 src 里的資料(默認 FlexSPI->MCR0[ATDFEN] = 0 情況下),SEQ_CTL 組件處理時會將快取在 IP TX FIFO 里的資料全部發送到 Flash 端,

void flexspi_nor_flash_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size)
{
    // Write Enable 子時序
    flexspi_nor_write_enable(base, dstAddr);

    flexspi_transfer_t flashXfer;
    flashXfer.deviceAddress = dstAddr;
    flashXfer.port          = kFLEXSPI_PortA1;
    flashXfer.cmdType       = kFLEXSPI_Write;
    flashXfer.SeqNumber     = 1;
    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;
    flashXfer.data          = https://www.cnblogs.com/henjay724/archive/2021/08/26/(uint32_t *)(void *)src;
    flashXfer.dataSize      = size;
    // page program 子時序
    FLEXSPI_TransferBlocking(base, &flashXfer);

    // Read Status 子時序
    flexspi_nor_wait_bus_busy(base);

    FLEXSPI_SoftwareReset(base);
}

3.3 特殊用法(AHB寫)

  我們現在來改造 IPG 方式的 Flash 寫入函式,首先要修改 deviceconfig 變數將 AWRSeqIndex 指向 PAGEPROGRAM_QUAD 在 LUT 中的位置,然后將 FLEXSPI_TransferBlocking() 函式換成 AHB 寫入代碼(memcpy 或者指標操作賦值),這時候 src 里的資料就會被自動放在大小為 64 bytes 的 AHB TX Buffer 里,SEQ_CTL 組件處理時會將快取在 AHB TX Buffer 里的資料全部發送到 Flash 端,

  但這里有一些限制,經實測,利用 memcpy 做 AHB 寫,一次僅能寫入 1/2/3/4/8 這五種有效長度的資料,其他資料長度不及預期(比如拷貝 5 - 7 位元組,實際僅寫入前 4 位元組;拷貝 8 位元組以上,實際僅寫入前 8 位元組),這其實跟 《i.MXRT中FlexSPI外設對AHB Burst Read特性的支持》 一文里提及的處理器 AHB Burst 策略有關,FlexSPI 每次僅會快取一次 AHB Burst 寫資料進 AHB TX Buffer,而 SEQ_CTL 每作業一次都會使能一次 Flash 器件的資料處理流程(進入 Busy 狀態),因此連續的兩次 AHB burst 寫,后面一次的 burst 行為其實不產生實際 Flash 寫入效果,

flexspi_device_config_t deviceconfig = {
    // 支持 AHB 寫的關鍵配置
    .AWRSeqIndex          = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD,
    .AWRSeqNumber         = 1,
    // ... 其他省略
};

void flexspi_nor_flash_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src, uint32_t size)
{
    while (size)
    {
        // Write Enable 子時序
        flexspi_nor_write_enable(base, 0);

        uint32_t cpyBytes = 0;
        if (size >= 8)      { cpyBytes = 8; }
        else if (size >= 4) { cpyBytes = 4; }
        else                { cpyBytes = size; }
        memcpy((void *)dstAddr, (void *)src, cpyBytes);
        __DSB();

        // Read Status 子時序
        flexspi_nor_wait_bus_busy(base);

        dstAddr += cpyBytes;
        src += cpyBytes / 4;
        size -= cpyBytes;
    }

    FLEXSPI_SoftwareReset(base);
}

  上面看似雞肋的 AHB 方式寫入 Flash 到底有什么用?底下痞子衡會講到 XECC 模塊,到時你就知道其用處了,

  至此,i.MXRT下改造FlexSPI driver以AHB方式去寫入NOR Flash痞子衡便介紹完畢了,掌聲在哪里~~~

歡迎訂閱

文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

  最后歡迎關注痞子衡個人微信公眾號【痞子衡嵌入式】,一個專注嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式,

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡杰(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師,

  專欄內所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案,

  關于專欄文章有任何疑問請直接在博客下面留言,痞子衡會及時回復免費(劃重點)答疑,

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發,


轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/295902.html

標籤:其他

上一篇:Shell入門01

下一篇:記離線安裝python插件方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more