<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                內存池的初始化之后,這些內存池中的內存塊就可以使用了,這就需要用戶通過memp_malloc函數進行申請內存塊,而內存塊的大小就是指定的大小,其過程很簡單,就是根據內存池的類型去選擇從哪個內存池進行分配,因為不同類型的內存池中內存塊大小是不一樣的,比如TCP_PCB與UDP_PCB的大小就不一樣,所以申請內存的時候傳入的參數是內存池的類型而并非要申請的內存大小,系統中所有的內存池類型都會被記錄在memp_pools數組中,我們可以將該數組稱之為內存池描述表,它負責將系統所有的內存池信息描述并且記錄下來,這樣子在申請內存的時候就能很迅速得到一個對應的內存塊,內存分配函數的源碼具體見代碼清單 5 7。 ``` 1 void * 2 memp_malloc(memp_t type) 3 { 4 void *memp; 5 LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;); 6 7 memp = do_memp_malloc_pool(memp_pools[type]); 8 9 return memp; 10 } 11 12 static void * 13 do_memp_malloc_pool(const struct memp_desc *desc) 14 { 15 struct memp *memp; 16 SYS_ARCH_DECL_PROTECT(old_level); 17 memp = *desc->tab; 18 if (memp != NULL) 19 { 20 21 *desc->tab = memp->next; 22 23 LWIP_ASSERT("memp_malloc: memp properly aligned", 24 ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); 25 26 SYS_ARCH_UNPROTECT(old_level); 27 /* cast through u8_t* to get rid of alignment warnings */ 28 return ((u8_t *)memp + MEMP_SIZE); 29 } 30 else 31 { 32 SYS_ARCH_UNPROTECT(old_level); 33 LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, 34 ("memp_malloc: out of memory in pool %s\n", desc->desc)); 35 } 36 return NULL; 37 } ``` 內存池申請函數的核心代碼就一句,那就是memp = *desc->tab;,通過這句代碼,能直接得到對應內存塊中的第一個空閑內存塊,如果該內存塊不是NULL,則將其取出,并且移動 *desc->tab指針,指向下一個空閑內存塊,然后將((u8_t *)memp + MEMP_SIZE)返回,MEMP_SIZE偏移的空間大小,因為內存塊需要一些空間存儲內存塊相關的信息,該宏定義的值是(LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEM_SANITY_REGION_BEFORE_ALIGNED),我們暫時無需理會它,只要知道申請內存塊后返回的地址是直接可用的地址即可,而偏移的MEMP_SIZE這部分內容是內存分配器管理的空間,用戶是不允許觸碰的地方,否則就很可能發生錯誤。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看