99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

嵌入式內(nèi)存管理實(shí)戰(zhàn):從C內(nèi)存布局到內(nèi)存池與泄漏排查

嵌入式內(nèi)存管理實(shí)戰(zhàn):從C內(nèi)存布局到內(nèi)存池與泄漏排查 做嵌入式這些年我越發(fā)覺得內(nèi)存在整個(gè)嵌入式開發(fā)里是最難講明白、也最值得深挖的一塊。很多人學(xué)完C語言、寫完幾個(gè)開發(fā)板例程就開始刷驅(qū)動(dòng)、調(diào)外設(shè)等到真正碰上隨機(jī)死機(jī)、設(shè)備重啟、運(yùn)行久了系統(tǒng)變慢這類問題才發(fā)現(xiàn)自己對內(nèi)存的理解還停留在malloc完了要記得free這種層面。本文想把我實(shí)際項(xiàng)目里踩過的內(nèi)存坑、面試中反復(fù)被問到的那幾道內(nèi)存題、以及幾個(gè)開源項(xiàng)目里比較成熟的池化思路串起來聊一聊嵌入式內(nèi)存管理的完整圖景——從C內(nèi)存布局到分配器選型從結(jié)構(gòu)體對齊到泄漏排查盡量講清楚每個(gè)關(guān)鍵決策背后的為什么。不管你是剛?cè)腴T的學(xué)生、想轉(zhuǎn)嵌入式的工程師還是已經(jīng)在做產(chǎn)品開發(fā)、想系統(tǒng)補(bǔ)一補(bǔ)內(nèi)存這塊短板的開發(fā)者這篇文章都值得耐心看完。我會(huì)把每個(gè)話題盡量拆得通俗一些用生活里的類比來講原理同時(shí)也會(huì)給出可以直接落到代碼和工程里的做法。1. 嵌入式內(nèi)存全景為什么這條戰(zhàn)線繞不開1.1 嵌入式內(nèi)存和PC內(nèi)存的最大不同先聊個(gè)很根本的問題嵌入式內(nèi)存和PC內(nèi)存到底哪里不一樣PC上你寫代碼基本不用操心物理內(nèi)存長什么樣因?yàn)椴僮飨到y(tǒng)給你包了一層虛擬內(nèi)存。你的程序以為自己獨(dú)享4GB或者32GB的空間背后是操作系統(tǒng)的頁表和缺頁中斷在處理映射關(guān)系。寫崩一個(gè)地址最多彈窗報(bào)錯(cuò)進(jìn)程掛掉系統(tǒng)通常沒事。嵌入式環(huán)境就完全是另一套邏輯。大多數(shù)MCU單片機(jī)級別的芯片根本沒有MMUMemory Management Unit所有代碼跑在物理地址上。你寫一個(gè)野指針訪問到的不是一段非法內(nèi)存而可能是某個(gè)外設(shè)寄存器——輕則數(shù)據(jù)被改壞重則直接觸發(fā)硬件錯(cuò)誤把整個(gè)系統(tǒng)打趴。這個(gè)差異決定了嵌入式開發(fā)者必須比純應(yīng)用開發(fā)者更敬畏內(nèi)存。在帶MMU的嵌入式Linux平臺(tái)上情況介于兩者之間。你確實(shí)有虛擬地址空間但資源是受限的。板子可能只有64MB內(nèi)存跑著內(nèi)核、根文件系統(tǒng)和你的業(yè)務(wù)進(jìn)程任何一個(gè)不注意的分配泄漏都可能在運(yùn)行幾天后悄悄拖垮系統(tǒng)。很多設(shè)備不在人身邊不能像PC那樣重啟一下再用這就對內(nèi)存管理的穩(wěn)定性提出了特別苛刻的要求。1.2 一張內(nèi)存地圖SRAM、DDR與Flash要理解嵌入式內(nèi)存腦子里得先有一張芯片內(nèi)部的地圖。對MCU來說內(nèi)存基本分為幾塊Flash非易失性用來放程序代碼和只讀數(shù)據(jù)掉電不丟SRAM靜態(tài)隨機(jī)存儲(chǔ)器用來放程序運(yùn)行時(shí)數(shù)據(jù)掉電就丟還有寄存器空間映射到CPU地址空間的特定區(qū)域是操作外設(shè)的入口。以STM32F4為例典型的配置是1MB Flash 192KB SRAM地址空間從0x08000000開始是Flash從0x20000000開始是SRAM。對運(yùn)行Linux的應(yīng)用處理器來說外部掛的是DDR內(nèi)存容量從幾十MB到幾GB不等地址空間中間還有各種外設(shè)寄存器的映射區(qū)。你在用戶態(tài)寫代碼時(shí)malloc到的內(nèi)存實(shí)際上是內(nèi)核通過缺頁機(jī)制一點(diǎn)點(diǎn)分配給你的物理頁你操作GPIO或者讀取DMA緩沖也得通過/dev/mem或者ioremap來映射物理地址。這里有一個(gè)很多新手會(huì)忽略的點(diǎn)嵌入式內(nèi)存地圖的每一段都有它的性格。Flash適合存常量字符串但不能頻繁擦寫SRAM速度快但容量小適合放棧和熱點(diǎn)數(shù)據(jù)DDR容量大但時(shí)序復(fù)雜帶寬可能成為性能瓶頸。寫代碼時(shí)如果對數(shù)據(jù)放哪一段有意識(shí)性能差異是能感覺出來的。我見過有人把一個(gè)大查找表定義成const數(shù)組放在Flash里比放在RAM里省了一大片空間這就是最簡單的內(nèi)存性格運(yùn)用。1.3 從內(nèi)存夠用到內(nèi)存省著用第二個(gè)觀念上的轉(zhuǎn)變是從內(nèi)存夠不夠用變成內(nèi)存省著用、精準(zhǔn)用。PC應(yīng)用開發(fā)者的思維通常是內(nèi)存不夠加程序運(yùn)行卡換更好的機(jī)器這種思路在嵌入式場景里寸步難行。做產(chǎn)品的時(shí)候芯片選型一旦定下來內(nèi)存容量就定死了你還得跟競爭對手比成本、比功耗每一顆多余的DDR顆粒都會(huì)增加BOM成本。所以嵌入式內(nèi)存管理的核心命題不是如何讓程序跑得起來而是如何讓程序在給定的內(nèi)存上限里穩(wěn)定、高效、持續(xù)地運(yùn)行。這種省著用不是讓你寫代碼摳摳搜搜而是要有全局意識(shí)哪些數(shù)據(jù)生命周期短可以放棧上哪些要長期保存必須用靜態(tài)區(qū)哪些是臨時(shí)緩沖區(qū)可以復(fù)用哪些高頻分配的小對象值得建一個(gè)內(nèi)存池。把這些設(shè)計(jì)做在前面后期排查問題時(shí)你會(huì)省出幾十倍的時(shí)間。2. 棧、堆、靜態(tài)區(qū)三種內(nèi)存的相處之道2.1 棧區(qū)嵌入式開發(fā)的主戰(zhàn)場與隱藏陷阱C程序的內(nèi)存布局里有三個(gè)主角棧、堆、靜態(tài)區(qū)。嵌入式開發(fā)里棧是默認(rèn)的主戰(zhàn)場。函數(shù)調(diào)用、局部變量、函數(shù)參數(shù)、返回地址全在棧上。棧的分配和釋放完全是編譯器生成的代碼在管理速度極快因?yàn)樗举|(zhì)就是移動(dòng)一下棧指針。但棧有一個(gè)致命的特點(diǎn)大小是有限的。在裸機(jī)工程里棧的大小一般由啟動(dòng)文件或者鏈接腳本指定常見的是1KB到8KB在嵌入式Linux里每個(gè)線程的棧默認(rèn)是8MB可以通過ulimit查看和修改但實(shí)際物理內(nèi)存不一定支撐你開很多線程。棧溢出的典型癥狀有兩種一是程序飛了表現(xiàn)為PC指針跑到0xFFFFFFFF或者隨機(jī)地址二是局部數(shù)組越界寫悄悄改掉了相鄰變量的值出現(xiàn)各種難以解釋的邏輯錯(cuò)誤。怎么避坑我給自己立了三條規(guī)矩。第一不在棧上放大的數(shù)組比如幾百字節(jié)以上的緩沖區(qū)盡量用靜態(tài)區(qū)或者動(dòng)態(tài)分配第二遞歸函數(shù)在嵌入式里能不用就不用一層遞歸就是一個(gè)棧幀深度不可控第三裸機(jī)工程里明確估算每個(gè)任務(wù)的棧需求留出至少30%的余量。比如中斷處理函數(shù)如果嵌套層級深前面所有函數(shù)的局部變量都會(huì)疊在同一個(gè)棧上這種場景特別容易爆棧。2.2 堆區(qū)malloc/free背后的代價(jià)堆是大家最熟悉又最容易出問題的地方。malloc、free、new、delete這段自由內(nèi)存看起來很隨意但嵌入式環(huán)境下的堆管理遠(yuǎn)遠(yuǎn)沒有你想象的那么自由。先說說malloc的底層機(jī)制。在glibc或者Newlib這類C庫的實(shí)現(xiàn)里malloc從操作系統(tǒng)或者裸機(jī)的堆區(qū)間一次性申請一大塊內(nèi)存然后在進(jìn)程內(nèi)部用一個(gè)空閑鏈表來管理。每次malloc分配器會(huì)按某種策略比如first-fit或best-fit從空閑鏈表中切一塊出來free的時(shí)候再把塊還回鏈表。這個(gè)過程有幾個(gè)代價(jià)一是鏈表查找有時(shí)間開銷頻繁分配釋放會(huì)出現(xiàn)性能和碎片問題二是每個(gè)分配出去的內(nèi)存塊頭部都要存元信息大小、狀態(tài)、前后指針小對象分配這種開銷占比極高三是碎片積累到一定程度明明總空閑內(nèi)存夠但連續(xù)大塊分配失敗。嵌入式里如果要用堆我的建議是能不用就不用用了就要管住生命周期。特別是長期運(yùn)行的系統(tǒng)如果分配釋放模式無序碎片會(huì)在幾天甚至幾小時(shí)內(nèi)把堆搞成一盤散沙。一次典型的事故是設(shè)備連續(xù)運(yùn)行一周后突然malloc失敗排查發(fā)現(xiàn)網(wǎng)絡(luò)上來的每個(gè)請求都分配了一個(gè)幾KB的緩沖區(qū)請求結(jié)束后釋放但釋放時(shí)機(jī)和大小模式不均勻碎片越積越多到最后分不出一個(gè)足夠大的連續(xù)塊。這種問題頂多靠定期重啟緩解根治還得改架構(gòu)。2.3 靜態(tài)區(qū)全局變量的代價(jià)與收益靜態(tài)區(qū)存放的是全局變量、static變量和字符串常量。這個(gè)區(qū)域在程序啟動(dòng)時(shí)就固定好了布局生命周期跟程序一樣長不涉及運(yùn)行時(shí)分配也沒有碎片問題——這是它的好處。但天下沒有免費(fèi)的午餐。靜態(tài)區(qū)的空間在編譯鏈接時(shí)就占了整個(gè)程序運(yùn)行期間都不可能被回收。如果一個(gè)系統(tǒng)里全是全局變量、全局緩沖區(qū)內(nèi)存壓力就會(huì)變成硬性壓力。更麻煩的是全局變量在多任務(wù)環(huán)境下天然是并發(fā)訪問的溫床你要用鎖、關(guān)中斷、原子操作去保護(hù)稍不留神就會(huì)埋下競態(tài)條件的隱患。我的經(jīng)驗(yàn)是分級使用真正的系統(tǒng)級配置、硬件寄存器映射、以及需要在整個(gè)生命周期內(nèi)存活的常量數(shù)據(jù)放到靜態(tài)區(qū)沒問題但那些只在某個(gè)業(yè)務(wù)階段才會(huì)用到的大塊緩沖完全可以設(shè)計(jì)成按需分配用完了釋放掉。比如協(xié)議棧里某個(gè)大緩沖區(qū)只在接收突發(fā)數(shù)據(jù)時(shí)起作用平時(shí)可以釋放或者復(fù)用給其他模塊這樣能顯著壓低系統(tǒng)的常駐內(nèi)存水位線。提示判斷該用哪種內(nèi)存可以問自己三個(gè)問題——數(shù)據(jù)需要活多久數(shù)據(jù)大小是否編譯期確定這段代碼的運(yùn)行頻次和實(shí)時(shí)性要求如何回答完這三個(gè)問題內(nèi)存選型基本就有結(jié)論了。3. 內(nèi)存分配器的選型與內(nèi)存池實(shí)現(xiàn)3.1 通用malloc的問題為什么跑著跑著系統(tǒng)變慢嵌入式項(xiàng)目跑到后期很多人會(huì)注意到一個(gè)現(xiàn)象系統(tǒng)剛上電時(shí)一切正常越往后響應(yīng)越慢甚至卡頓。這往往不是CPU性能不夠而是內(nèi)存分配路徑上出了問題。通用malloc的慢主要體現(xiàn)在幾方面。第一分配路徑可能有系統(tǒng)調(diào)用。Linux的glibc malloc在小塊分配時(shí)走brk大塊才走mmap但mmap和munmap涉及內(nèi)核態(tài)的頁表操作開銷比純用戶態(tài)操作高一個(gè)數(shù)量級。第二空閑鏈表的遍歷和合并需要時(shí)間特別是經(jīng)過大量分配釋放后鏈表碎片化導(dǎo)致每次分配要掃描更多節(jié)點(diǎn)。第三多線程環(huán)境下malloc內(nèi)部有鎖競爭多個(gè)線程同時(shí)分配時(shí)會(huì)互相阻塞RTOS里如果中斷和任務(wù)都在調(diào)malloc還要考慮臨界區(qū)保護(hù)。實(shí)時(shí)性要求高的場景下這種不確定性是致命的。音頻處理里的一個(gè)緩沖如果在運(yùn)行過程中出現(xiàn)幾毫秒的分配延遲輸出的聲音就會(huì)爆音控制環(huán)路里一個(gè)高頻任務(wù)如果因?yàn)榉峙鋬?nèi)存被阻塞就可能造成嚴(yán)重的控制偏差。所以我一直強(qiáng)調(diào)實(shí)時(shí)關(guān)鍵路徑里的內(nèi)存分配必須提前準(zhǔn)備好不能在運(yùn)行時(shí)才現(xiàn)摘現(xiàn)用。3.2 內(nèi)存池把分配變成取塊內(nèi)存池的思路其實(shí)特別樸素預(yù)先從堆或者靜態(tài)區(qū)里切出一大塊連續(xù)內(nèi)存劃分成若干個(gè)大小固定的塊用鏈表串起來。分配時(shí)從空閑鏈表頭取一個(gè)塊釋放時(shí)再掛回鏈表頭。因?yàn)閴K大小固定不需要維護(hù)元信息分配釋放都是O(1)復(fù)雜度而且不會(huì)產(chǎn)生碎片。我用一個(gè)可控稍微復(fù)雜一點(diǎn)的例子說明。假設(shè)你要管理一個(gè)池子總共有N個(gè)塊每塊大小BLOCK_SIZE??梢杂靡粋€(gè)數(shù)組做底層存儲(chǔ)再用一個(gè)空閑塊索引棧來記錄哪些塊是空的typedef struct { uint8_t *pool; // 內(nèi)存池起始地址 uint32_t block_size; // 每個(gè)塊大小 uint32_t block_num; // 總塊數(shù) uint32_t *free_stack; // 空閑塊索引棧 int32_t top; // 棧頂指針 } mem_pool_t; void mem_pool_init(mem_pool_t *p, uint8_t *buf, uint32_t blk_size, uint32_t blk_num) { p-pool buf; p-block_size blk_size; p-block_num blk_num; p-free_stack (uint32_t *)(buf blk_size * blk_num); // 索引棧放在池后面 p-top blk_num - 1; for (uint32_t i 0; i blk_num; i) { p-free_stack[i] blk_num - 1 - i; } } void *mem_pool_alloc(mem_pool_t *p) { if (p-top 0) { return NULL; // 池已耗盡 } uint32_t idx p-free_stack[p-top--]; return p-pool[idx * p-block_size]; } void mem_pool_free(mem_pool_t *p, void *ptr) { uint32_t idx ((uint8_t *)ptr - p-pool) / p-block_size; p-free_stack[p-top] idx; }分配和釋放的函數(shù)體只有幾行沒有任何循環(huán)和鎖單任務(wù)場景執(zhí)行時(shí)間完全確定。這在實(shí)時(shí)系統(tǒng)里很受歡迎——你用塊大小固定換來了分配時(shí)間確定、無碎片、開銷極小。但是內(nèi)存池也有它的局限性。塊大小固定意味著不夠靈活如果某類對象遠(yuǎn)小于塊大小內(nèi)部碎片率會(huì)比較高如果某個(gè)需求突然超過塊大小池就派不上用場了。所以實(shí)際項(xiàng)目里往往不是單一池子而是分層設(shè)計(jì)小塊池、中塊池、大塊池各管一種規(guī)格再加上隊(duì)列消息、DMA描述符這些專用池子。3.3 常用分配器方案的橫向?qū)Ρ惹度胧筋I(lǐng)域常用的分配器方案我整理成一張對比表供參考方案優(yōu)點(diǎn)缺點(diǎn)適用場景標(biāo)準(zhǔn)庫malloc通用、兼容性好時(shí)間不確定、有碎片開發(fā)期、非實(shí)時(shí)路徑固定大小內(nèi)存池O(1)、無碎片、實(shí)時(shí)性好塊大小固定、靈活性差高頻小對象、實(shí)時(shí)關(guān)鍵路徑伙伴分配器大塊管理高效、支持任意大小實(shí)現(xiàn)復(fù)雜、小塊有內(nèi)部碎片嵌入式Linux內(nèi)核、大緩存管理slab分配器按對象類型緩存、效率高依賴復(fù)雜內(nèi)核機(jī)制Linux內(nèi)核中常用TLSF分配器時(shí)間確定性好、支持任意大小實(shí)現(xiàn)難度中等需要實(shí)時(shí)性又需要靈活大小的場景我自己在裸機(jī)工程里用得最多的是固定池上了Linux用戶態(tài)高實(shí)時(shí)任務(wù)里也會(huì)自己搭TLSF或者固定池普通后臺(tái)任務(wù)才撒手用glibc的malloc。做選型的時(shí)候別貪心沒有銀彈關(guān)鍵是想清楚你的需求到底是實(shí)時(shí)性碎片控制還是靈活性抓住主要矛盾就行。4. 結(jié)構(gòu)體、字節(jié)對齊與內(nèi)存布局優(yōu)化4.1 結(jié)構(gòu)體對齊看起來省下的空間其實(shí)沒省結(jié)構(gòu)體是嵌入式C開發(fā)里最常用的數(shù)據(jù)容器但很多人對結(jié)構(gòu)體的內(nèi)存布局完全沒有概念。你以為寫了個(gè)int8_t、int32_t、int8_t的成員結(jié)構(gòu)體大小就是6字節(jié)實(shí)際上編譯器為了保證對齊會(huì)在成員之間和結(jié)構(gòu)體末尾插入填充字節(jié)這個(gè)結(jié)構(gòu)體的大小很可能是12字節(jié)。對齊的規(guī)則可以簡化成一句每個(gè)成員變量的地址必須是其自身對齊值的整數(shù)倍。int32_t對齊值是4結(jié)構(gòu)體的整體大小必須是對齊值最大成員的整數(shù)倍。所以成員順序會(huì)影響結(jié)構(gòu)體大小。舉個(gè)實(shí)際例子同樣的三個(gè)成員// 方案A亂序定義占用12字節(jié) struct s_a { char a; // offset 0 int b; // offset 41-3被填充 short c; // offset 8 }; // 整體大小 12 // 方案B按對齊值從大到小排列占用8字節(jié) struct s_b { int b; // offset 0 short c; // offset 4 char a; // offset 6 }; // 整體大小 8同樣的數(shù)據(jù)內(nèi)容僅僅因?yàn)槌蓡T排列順序不同內(nèi)存占用就從12字節(jié)降到8字節(jié)省了33%。如果這個(gè)結(jié)構(gòu)體類型要被創(chuàng)建成千上萬次或者通過網(wǎng)絡(luò)/存儲(chǔ)批量寫入這個(gè)差異會(huì)直接放大成非??捎^的節(jié)省。4.2 位域、packed與硬件的咬合協(xié)議棧和驅(qū)動(dòng)開發(fā)里我們經(jīng)常需要把多個(gè)標(biāo)志位打包進(jìn)一個(gè)字節(jié)或者跟硬件寄存器的位定義一一對應(yīng)這時(shí)候可以用位域bit-field。但位域的布局在不同編譯器和平臺(tái)上沒有統(tǒng)一標(biāo)準(zhǔn)跨平臺(tái)移植時(shí)很容易踩坑。我的做法比較保守能用位運(yùn)算和掩碼處理寄存器的就盡量不用位域位域只用在編譯器和平臺(tái)都固定的內(nèi)部代碼里。至于#pragma pack(1)或者_(dá)_attribute__((packed))這招能取消對齊填充讓結(jié)構(gòu)體按緊湊方式排列但代價(jià)是訪問未對齊成員時(shí)可能觸發(fā)總線錯(cuò)誤或者性能懲罰。我在ARM Cortex-M系列上實(shí)測過訪問packed結(jié)構(gòu)體里的int32_t成員編譯器會(huì)生成多字節(jié)拼接的代碼效率明顯下降。所以packed只適合用在需要精確匹配協(xié)議報(bào)文、或者內(nèi)存極度緊缺的場景并且要注意涉及DMA傳輸?shù)慕Y(jié)構(gòu)體對齊要求尤其敏感不要輕易packed。結(jié)構(gòu)體字段排列的順序還應(yīng)該考慮實(shí)際讀寫模式。把高頻訪問的字段放在同一緩存行內(nèi)可以減少緩存失效把互斥訪問的字段分開可以降低偽共享。這些在嵌入式Linux多核場景下尤其重要單核裸機(jī)時(shí)代不用太在意但一旦上了多核布局問題可能直接影響性能和并發(fā)正確性。4.3 編譯選項(xiàng)與鏈接腳本最后一道省內(nèi)存的閘門代碼層面的優(yōu)化只是前半程編譯鏈接階段還有兩道閘門可以控制內(nèi)存占用。第一道是編譯器優(yōu)化選項(xiàng)。-Osoptimize for size在嵌入式里通常比-O2更常用因?yàn)樗鼉A向于生成更小的代碼。實(shí)測下來同一段代碼用-Os編譯Flash占用可能比-O2少10%到20%代價(jià)是部分場景性能輕微下降。如果你的產(chǎn)品Flash資源緊張-Os幾乎是必選的。第二道是鏈接腳本。鏈接腳本決定了代碼段、數(shù)據(jù)段、BSS段未初始化數(shù)據(jù)放在哪里、按什么順序排布。很多MCU工程里可以在鏈接腳本里把只讀數(shù)據(jù)放到Flash、把變量放到SRAM還可以用__attribute__((section(...)))把某個(gè)大模塊的數(shù)據(jù)放到獨(dú)立的段里。這樣做的意義在于你可以精確控制內(nèi)存映射把熱點(diǎn)數(shù)據(jù)放到更快的內(nèi)存區(qū)域把冷數(shù)據(jù)放到大容量但更慢的區(qū)域。還有一個(gè)很實(shí)用的小技巧是-fdata-sections -ffunction-sections配合--gc-sections。這兩個(gè)選項(xiàng)讓編譯器和鏈接器把每個(gè)函數(shù)、每個(gè)全局?jǐn)?shù)據(jù)拆分成獨(dú)立段鏈接時(shí)自動(dòng)丟棄沒有引用到的段。很多項(xiàng)目的Flash占用能因此降低5%到15%尤其適合用HAL庫或SDK帶了大量你用不上的函數(shù)時(shí)。我在一個(gè)使用STM32的工程里開過這個(gè)組合Flash用量從96KB降到81KB非??捎^。5. 內(nèi)存泄漏、踩內(nèi)存與實(shí)戰(zhàn)排查5.1 嵌入式內(nèi)存問題的四種典型癥狀嵌入式內(nèi)存問題的癥狀千奇百怪但歸根結(jié)底可以歸成四類一是內(nèi)存泄漏。內(nèi)存持續(xù)分配但不釋放表現(xiàn)為系統(tǒng)的空閑內(nèi)存不斷下降最終malloc失敗。特點(diǎn)是溫水煮青蛙可能運(yùn)行幾小時(shí)甚至幾天才爆發(fā)。二是踩內(nèi)存buffer overflow/underflow。數(shù)組越界寫、指針指向了錯(cuò)誤地址、釋放后再使用use-after-free這類問題最隱蔽因?yàn)樗茐牡目赡苁悄阃耆饬现獾淖兞?。三是棧溢出。??臻g不夠用函數(shù)調(diào)用時(shí)壓棧把棧指針推過了棧區(qū)邊界程序飛掉或者行為異常。IAR、Keil里調(diào)試時(shí)如果看到PC飆到異常地址第一個(gè)要懷疑的就是棧。四是堆碎片??臻e內(nèi)存總量充足但無法分配出足夠大的連續(xù)塊。前面討論過這類問題通常在malloc失敗的那一瞬間才被發(fā)現(xiàn)而現(xiàn)場大概率已經(jīng)無法復(fù)現(xiàn)。5.2 靜態(tài)分析與動(dòng)態(tài)檢測工具排查嵌入式內(nèi)存問題工具鏈的配合是必需的。我強(qiáng)烈建議所有嵌入式C/C項(xiàng)目在開發(fā)階段就把一些靜態(tài)檢查工具納入CI流程。靜態(tài)分析方面cppcheck是免費(fèi)的輕量選手能發(fā)現(xiàn)很多數(shù)組越界、空指針解引用、資源泄漏問題clang-tidy和Coverity這類更強(qiáng)的工具能做的更深但對嵌入式交叉編譯環(huán)境的配置要求也更高。我實(shí)際用下來的感受是靜態(tài)工具能幫你掃掉五六類的低級錯(cuò)誤但別指望它搞定所有內(nèi)存問題很多問題只有在運(yùn)行時(shí)才能暴露。動(dòng)態(tài)檢測方面不同平臺(tái)的工具路徑不太一樣嵌入式Linux平臺(tái)最經(jīng)典的是Valgrind memcheck能檢測內(nèi)存泄漏、越界訪問、使用未初始化內(nèi)存等問題。部署到板子上跑測試用例配合--leak-checkfull和--error-limitno能揪出非常多隱藏問題。缺點(diǎn)是Valgrind會(huì)大幅拖慢運(yùn)行速度5-20倍不適合所有場景但用來做回歸測試非常值得。裸機(jī)/MCU平臺(tái)可以用編譯器自帶的sanitizerARM GCC支持-fsanitizeaddress的實(shí)驗(yàn)性功能但可能影響運(yùn)行性能更通用的做法是自己寫一個(gè)簡單的內(nèi)存監(jiān)視模塊在所有malloc/free調(diào)用處記錄指針、大小、調(diào)用點(diǎn)啟動(dòng)后定期打印分配統(tǒng)計(jì)。嵌入式RTOS平臺(tái)FreeRTOS有heap_4里自帶的統(tǒng)計(jì)接口xPortGetFreeHeapSizeRT-Thread則自帶內(nèi)存堆檢查功能。這些都可以做水位線監(jiān)測我在產(chǎn)品里跑一個(gè)周期性任務(wù)每30秒采集一次剩余堆內(nèi)存發(fā)到日志系統(tǒng)能快速發(fā)現(xiàn)泄漏趨勢。5.3 一次典型的排查實(shí)錄分享一個(gè)我做車載項(xiàng)目時(shí)遇到的實(shí)際案例。設(shè)備跑的是嵌入式Linux客戶反饋連續(xù)運(yùn)行一周后設(shè)備變慢最終死機(jī)。拿到日志時(shí)發(fā)現(xiàn)進(jìn)程的內(nèi)存占用在穩(wěn)步上升從正常的45MB一路漲到135MB直到內(nèi)存耗盡。排查第一步先確認(rèn)是不是進(jìn)程內(nèi)存泄漏。我在板子上用top和/proc/[pid]/status里的VmRSS觀察增長曲線同時(shí)抓了一遍/proc/[pid]/maps看看虛擬內(nèi)存分布。發(fā)現(xiàn)一個(gè)可疑點(diǎn)VmSize漲得比VmRSS還快說明除了實(shí)際物理內(nèi)存增長還有一個(gè)虛擬地址段在膨脹。順著可疑的映射塊找最后鎖定了問題出在一個(gè)第三方庫的消息隊(duì)列處理模塊——每次收到一條消息它都malloc一塊緩沖區(qū)但處理失敗時(shí)沒有釋放導(dǎo)致泄漏。修復(fù)其實(shí)只有一行free但排查過程花了整整兩天。這次經(jīng)歷讓我養(yǎng)成了一個(gè)習(xí)慣所有長期運(yùn)行的嵌入式設(shè)備不管看起來多穩(wěn)定都要在設(shè)計(jì)和測試階段就內(nèi)置內(nèi)存監(jiān)控能力。否則真出了問題在現(xiàn)場復(fù)現(xiàn)的成本是實(shí)驗(yàn)室里的十倍以上。提示排查時(shí)的關(guān)鍵心態(tài)是不要猜要測。每一次判斷都要有工具輸出的數(shù)據(jù)支撐否則你在排查過程中做的很多假設(shè)最后都會(huì)被證明是錯(cuò)的。6. 嵌入式面試中的內(nèi)存八股與項(xiàng)目經(jīng)驗(yàn)6.1 高頻面試題從背答案到講原理結(jié)合熱搜詞里的嵌入式面試題嵌入式八股文我把實(shí)際面試?yán)锍霈F(xiàn)頻率最高的內(nèi)存類題目梳理了一下。注意面試官問這些題多半不是想聽你背標(biāo)準(zhǔn)答案而是想通過追問判斷你實(shí)際踩過多少坑。第一道高頻題是說說C程序的內(nèi)存布局?;A(chǔ)答案是棧、堆、BSS、數(shù)據(jù)段、代碼段但加分答案是能講清楚BSS和數(shù)據(jù)段的區(qū)別未初始化的全局變量放在BSS程序加載時(shí)清零不占磁盤空間已初始化的全局變量放在數(shù)據(jù)段在磁盤上占空間加載時(shí)拷貝到內(nèi)存。還要能結(jié)合嵌入式場景講出const變量放在只讀段定義在Flash里這種實(shí)際工程理解。第二道高頻題是malloc和free為什么不適合實(shí)時(shí)系統(tǒng)。面試官想聽的不是因?yàn)闀?huì)碎片而是更深入的回答分配時(shí)間復(fù)雜度不確定、底層可能涉及內(nèi)核系統(tǒng)調(diào)用、多線程鎖競爭、以及嵌入式實(shí)時(shí)任務(wù)里如何用內(nèi)存池代替。第三道高頻題是如何檢測內(nèi)存泄漏。理想回答會(huì)分層次編譯期用靜態(tài)分析工具、運(yùn)行期用Valgrind/ASan、裸機(jī)自研分配計(jì)數(shù)、系統(tǒng)級通過監(jiān)控/proc/meminfo和VmRSS。能把工具和場景匹配起來的人明顯是真正做過項(xiàng)目的。第四道是struct對齊問題。除了講規(guī)則最好能現(xiàn)場舉例說明重排成員順序能節(jié)省多少空間再多說一句packed的代價(jià)就能和背道題的人拉開差距。6.2 項(xiàng)目經(jīng)驗(yàn)怎么講不露怯面試?yán)锉缺嘲斯筛匾氖侵v項(xiàng)目里的內(nèi)存處理經(jīng)驗(yàn)。我見過很多候選人簡歷上都寫著熟悉嵌入式Linux但問起來就說不清楚自己項(xiàng)目里內(nèi)存占用多少、峰值多少、泄漏問題遇到過沒有。我的建議是準(zhǔn)備項(xiàng)目經(jīng)驗(yàn)時(shí)死死盯住幾個(gè)具體數(shù)字整個(gè)系統(tǒng)的RAM占用總量、程序最大棧深度、堆峰值使用量、池化前后的分配延遲對比。比如你可以這樣講我負(fù)責(zé)的音頻采集模塊原來每個(gè)音頻幀都malloc緩沖區(qū)后來改成環(huán)形緩沖雙緩沖池分配延遲從平均50微秒降到接近0幀率還提升了10%。這種描述比優(yōu)化了內(nèi)存管理有說服力得多。另外把自己踩過的坑整理成事故復(fù)盤講給面試官往往比報(bào)一堆技術(shù)名詞更有含金量。我面試別人時(shí)最愿意聽的就是候選人在項(xiàng)目中遇到了什么詭異問題、通過什么手段定位、最后怎么根治、以及從中學(xué)到了什么。這種敘事自帶真實(shí)性比任何背出來的答案都可信。6.3 給新人的一條學(xué)習(xí)路徑如果你現(xiàn)在還是學(xué)生或者剛?cè)胄邢胂到y(tǒng)地補(bǔ)一補(bǔ)嵌入式內(nèi)存這堂課我給一條自己驗(yàn)證過的路線第一先把C語言里的指針、數(shù)組、結(jié)構(gòu)體徹底學(xué)通透最好把《C和指針》或者《深入理解計(jì)算機(jī)系統(tǒng)》的內(nèi)存相關(guān)章節(jié)啃一遍第二在開發(fā)板上跑FreeRTOS或者RT-Thread親手配置堆棧、寫內(nèi)存池第三把一個(gè)開源項(xiàng)目比如一些RTOS內(nèi)核、TinyUSB、LwIP的源碼下下來重點(diǎn)看它們怎么管理緩沖區(qū)、怎么處理DMA描述符、怎么在ISR和任務(wù)間共享消息第四總結(jié)一套適合自己的調(diào)試方法論把工具用熟。這條路線走下來你會(huì)發(fā)現(xiàn)自己看代碼的習(xí)慣都會(huì)變——不再只盯著功能邏輯而是會(huì)自動(dòng)在心里畫出每個(gè)變量的內(nèi)存生命周期圖。這大概就是內(nèi)存課真正想教給你的東西。7. 內(nèi)存優(yōu)化的底層心法從修問題到設(shè)計(jì)問題7.1 三個(gè)優(yōu)化維度峰值、均值、確定性做嵌入式內(nèi)存管理久了你會(huì)發(fā)現(xiàn)優(yōu)化這件事要同時(shí)盯住三個(gè)維度峰值內(nèi)存、平均內(nèi)存、分配確定性和穩(wěn)定性。峰值內(nèi)存決定了你需要多少物理內(nèi)存直接關(guān)系芯片選型和成本。降低峰值的方法包括把大塊緩沖改成按需分配、錯(cuò)峰使用不同模塊復(fù)用同一塊緩沖區(qū)、把部分?jǐn)?shù)據(jù)處理流水分塊而不是一次性加載。平均內(nèi)存代表系統(tǒng)運(yùn)行的水位降低均值可以有效延長設(shè)備的穩(wěn)定運(yùn)行時(shí)間減少碎片觸頂概率。而分配確定性是我們前面反復(fù)強(qiáng)調(diào)的實(shí)時(shí)性來源關(guān)鍵路徑上必須用O(1)的分配器。實(shí)際優(yōu)化的時(shí)候我會(huì)先做內(nèi)存畫像memory profiling統(tǒng)計(jì)系統(tǒng)在冷啟動(dòng)、穩(wěn)態(tài)、高峰期、異常情況下的內(nèi)存使用曲線。只有把基線數(shù)據(jù)摸清楚了后續(xù)所有優(yōu)化動(dòng)作才能有的放矢。7.2 從內(nèi)存省著用到內(nèi)存高效用最后想聊一個(gè)觀念層面的東西。很多初學(xué)者覺得內(nèi)存優(yōu)化等于省著用能用char絕不用int能用bit絕不用byte。但我覺得真正的高效不是拼命壓省每一個(gè)字節(jié)而是讓每一塊內(nèi)存都在它的生命周期里發(fā)揮最大價(jià)值。比如你為了省內(nèi)存把一個(gè)本來該用uint32_t的計(jì)數(shù)器改成uint8_t結(jié)果計(jì)數(shù)溢出導(dǎo)致邏輯錯(cuò)亂為了排查這個(gè)bug花掉的成本可能比省下的那3個(gè)字節(jié)寶貴得多。反過來如果一段緩沖區(qū)生命周期很短且只在一個(gè)模塊內(nèi)部使用那它完全可以在棧上分配既快又不需要管理——這是合理用勝于省著用的典型場景。我在實(shí)際項(xiàng)目中體會(huì)最深的一點(diǎn)是內(nèi)存優(yōu)化的終極目標(biāo)是系統(tǒng)的確定性和安全性不只是省空間。一個(gè)內(nèi)存占用偏高但邊界清晰、分配模式可控的系統(tǒng)往往比一個(gè)省到極限但處處是隱藏風(fēng)險(xiǎn)的系統(tǒng)更容易維護(hù)。做內(nèi)存設(shè)計(jì)時(shí)永遠(yuǎn)先考慮這個(gè)系統(tǒng)能不能穩(wěn)定跑一年不宕機(jī)再考慮能不能省下那幾十KB。7.3 后續(xù)可以繼續(xù)深挖的擴(kuò)展方向這篇文章講的主要內(nèi)容偏裸機(jī)和嵌入式Linux用戶態(tài)如果你還想繼續(xù)深入有幾個(gè)方向值得花時(shí)間一是內(nèi)核態(tài)內(nèi)存管理。掌握kmalloc、vmalloc、slab、頁面分配器以及不同內(nèi)存分配API的適用場景是成為內(nèi)核開發(fā)者繞不開的路。二是C的RAII與智能指針在嵌入式里的應(yīng)用。很多人覺得嵌入式不用C實(shí)際上隨著MCU算力提升基于現(xiàn)代C的嵌入式項(xiàng)目越來越多。理解std::unique_ptr、std::shared_ptr和內(nèi)存池的結(jié)合方式能幫你寫出更安全的代碼。三是異構(gòu)計(jì)算場景下的內(nèi)存管理。NPU、GPU這類加速器的內(nèi)存分配和主機(jī)側(cè)不同涉及ion/dma-buf這類跨設(shè)備內(nèi)存共享機(jī)制這是當(dāng)前AIoT設(shè)備開發(fā)的熱門方向。根據(jù)我個(gè)人的體會(huì)做嵌入式內(nèi)存這堂課其實(shí)沒有捷徑。只有多寫代碼、多踩坑、多復(fù)盤才可能把內(nèi)存從敵人變成朋友。希望這篇分享能給你的嵌入式開發(fā)路提供一點(diǎn)地圖至少讓你在遇到內(nèi)存問題時(shí)知道該往哪個(gè)方向去排查。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
午夜无码熟熟妇丰满人妻 | 丁香五月天殴美激情| 影音先锋女人AA鲁色资源| 五月婷婷综合色啪首页| 五月深爱婷婷| 六月丁香婷婷综合色播| 国产67194| 亚洲偷| 丁香五月天成人网站| 就要去操亚洲成人精品五月天丁香婷婷| 丰满少妇猛烈A片免费看观看 | 丁香五月 激情文学| 六月激情婷婷| 亚洲操人| 99热伊人| 天天色天天日| 婷婷五月激情中文字幕| 丁香色婷婷| 日日夜夜天天| 爱婷婷都市激情| 丁香色情五月综合网站| 天天插天天操| 思思99精品视频| 欧美人人女女精品综合五月天| 91久久久久久久久久18| 久久精品一区二区三区四区| 97 天堂| 五月天综合在线| 五月婷婷激情| 99热66| 亚洲欧洲国产精品| 色色色99| 激情五月婷婷丁香| 五月婷婷六月激情| 江苏少妇性BBB搡BBB爽爽爽| 99热超碰人| 涩涩五月天| 午夜丁香| 五月天综合在线| 丁香五月久久| 午夜69成人做爰视频| 九九热在线观看视频| 亚洲综合五月天| 婷婷色情六月| www.婷婷.com| 婷婷五月天综合在线| 激情色情五月天| 国产69久久久欧美黑人A片| 五月色综合| 丁香六月婷婷色XXXXX| 日韩成人AV在线播放| 丁香在线视频| 97色色色| 91女人18毛片水多国产| 亚洲爱婷婷| 久久精品日| 97人人操人人操人人操人人| 91精品丝袜久久久久久| 激情婷婷综合| 人人爱国产| 五月天激情久久| 五月丁香六月婷婷操操操| 婷婷亚洲五月| 激情影院丁香五月| 色婷婷第四色| 丁香六月婷月91婷月| www色婷婷久久综合久色| j久久性爱视频| 九九九精品视频免费观看| 丁香六月婷婷五月天| 五月丁香视频在线观看| 五月丁香婷婷成人网| 五月婷婷真爱激情网| 免费不卡狠操美女视频网| 一丁香五月天月AV| 丁香婷婷综合激情五月色| 全部老头和老太XXXXX| 欧美婷婷丁香社区在线播放| 中文字幕av在线| 五月天啪啪| 五月丁香婷婷AV天堂| 99色1| 五月婷婷六月丁香在线| 97人人操人人干| 亚洲丁香五冃97色| 欧美操人| 五月色婷婷综合| 欧美婷婷丁香社区在线播放| 在线五月婷| ztEJj| 九月丁香欧美综合| 激情影院内射| 在线观看免费狠狠色丁香香综合| 日本熟妇乱妇熟色A片蜜桃| 九九爱激情| 日本99色| 婷婷亚洲五月色综合| 来吧亚洲综合网| 狠狠干在线| 中国无码av| 激情无码网| 开心久久xxx色| 99色热视频| 婷婷五月天网址| www.超碰| 五月婷婷啪啪网| 丁香婷婷久久老熟女综合网| 色色色999| www.九月婷婷丁香.com| 五月婷婷伊人久久| 六月丁香网| 久久婷婷五月综合色丁香| 狠狠干综合| 色色五月婷婷丁香| 激情五月婷婷| 六月婷婷日| 婷婷久久99| 在线观看视频1区| www.99婷婷| 色婷婷激情视频| 天天天天干| 91网站黄| 狠狠爱婷婷爱| 91超级碰在线| 久热免费视频| 91日日日| 狼友超碰| 五月婷婷五月天| 啪到高潮激情丁香五月| 九九Y精品热播| 婷婷丁香视频在线观看免费| 丁香五月在线观看| 性爱先锋AV| 这里有精品| 新激情五月天| 中文网av| 九月大香蕉| 激情亚洲色图片丁香综合| 99热在线精品观看| 熟女激情网| AV在线中文| 超碰精品国产首页| 色婷婷88| 思思热闹这里只有精品| 色一情一乱一乱一区91Av| 色婷婷综合综合网| 翔田千里 50岁 无码| 爆乳熟女-区二区三区| 色五月成人网| 五月花激情网| 99热播放| 婷婷色五月综合丁香| 丁香五月电影| 五月天·www·com| 五月婷婷久草| A久久| 奇米四色五月天| 人人人操B超碰| 丁香花大香蕉婷婷综合| 91午夜激情| 国产色视频网站2| 色综合天天综合成人网| 婷婷五月av| 超碰在线91| 色五月婷婷中文字幕| 99爱爱| 激情网第九色| 蒲京久久无码视频| 欧美大香蕉视频| 9久久久久久久久久久| 天天操中文字幕| 91五月天| 伊人九九九久| 第五婷婷伊人丁香色| 爱草人视频| 日韩另类在线观看| 婷婷五月花| 综合久久五月| 99狠狠| 99视频35精品视频在线观看| 丁香久久AV| 色天堂婷婷| 天天爽综合| 91高潮喷水久久久久久久久| 欧美精品999| 五月天开心激情网色欲无码| 欧美成综合在线观看| 99这里有精品视频| 色色色视频免费无码| 中文字幕 中文字幕明步| 色5月婷婷| 亚洲免费在线观看岛国| 无码少妇高潮喷水A片免费| 丁香婷婷啪啪啪| 五月丁香视频色色| 99热个人在线| www.91久久| 色国产五月| www。五月,com| 亭亭色网| 99热在线精品观看| 美女要搞搞天天搞搞搞网站| 九九亚洲综合| 婷婷五月日本| 精品久久久91久久影视网| 5月婷婷6月六月丁香| 久久久久久综合88| 六月婷婷网| 丁香五月婷婷基地| 国产白丝在线一区| 久久人妻乱| 天天做天天爱天天爽夜夜揉| 中文字幕五月久久婷| 亚洲超碰在线| 五月婷精品| 五月天色网站| 狠狠色激情在线| 在线观看亚洲视频影院| 99欧美三级视频| 婷婷在线播放| 丁香色婷婷| 91日日日| 日本天天色| 色婷婷色五月丁香| 99热视| 成人视频在线免费播放| 日本高清不卡免费一区二区三区| 另类图片 五月激情| 色播五月丁香综合| 天花AV无码| 五月婷视频| 99久久婷婷国产综合| 国产色五月| 婷婷五月天播| eeuus五月婷| 99久在线精品99re5热视频| 日本一级黄色片。| 欧美激情综合五月色丁香| 色五月琪琪| 色色A| 深爱激情五月天婷婷网| 婷婷五月天视频小说| 亚洲综合激情五月久久| 91丨九色丨熟女高潮| 伊人玖玖婷婷| 97干在线观看视频| 大香蕉婷婷丁香天堂AV| 久久免费精品小视频| 天天综合 99久久婷婷| 一本狠婷婷综合| seav天堂| 涩涩激情五月婷婷| 综合玖玖偷拍| 任你操精品免费| 4438全国最大视频成人网站在线观看| www.com在线操视频免费观看| 8050一级网| 97热91| 精品成人无码A片观看香草视频| 这里只有精品视频免费在线观看| 九九伊人网| 亚洲操操操| 91碰碰碰| 91免费在线视频6| 国内裸舞二区| 99热这里只有精品 搜| 激情五月六月丁香| 久久美女五月天| 久久这里都是精品| 五月天婷婷av| 最新高清无码专区| 婷婷久久色| 婷婷伊人五月丁香天堂网| 日韩 mm 不卡| 丁香婷婷色五月| 欧美噜噜免费观看| 色婷婷九月| 色五月丁香五月天| 五月婷婷综合激情网| 色色色色色色色色综合网| 久久五月天婷婷| 亚洲激情av| 淫五月停停| 久久艹网| 天天插综合在线| 亚洲瑟瑟精品在线| 久久多色| 久久精品凹凸分类| 九热...av| 激情五月婷婷免费视频| 99热a片免| 激情久久久久久久久久久| 亚洲视频99| 日韩av变天就操逼不卡区| 激情婷婷五月社区| 色五月天影视| 色五月天成人| 五月花婷婷| 色五月成人网| 乱码操操| 大香蕉丁香| 五月天大香蕉| 五月天综合视频| 色婷久久| 亭亭玉月丁香| 丁香婷停五月激情综合深爱| 色五月婷婷久久| 五月天丁香色色| 综合99视频| 婷婷综合网在线| 高清无码视频网址| A片试看120分钟做受图片| 五月丁香婷婷啪啪网| 五月停亭六月,六月停亭的英语 | 99在线精品视频| 九九热最新视频| 五月婷av| 五月天激情网页| 国产成人99久久亚洲综合精品| 97操资源婷婷| 激情婷婷亚洲五月| 色色色com| 熟美女麻豆| 激情的五月婷婷蜜桃| 野战毛片三一3| 国产XXXX搡XXXXX搡麻豆| 丁香密臀AV激情网| 欧美婷婷精品激情| 91干婷婷| 色综合色欲综合天天免费 | 激情五月影院| 丁香六月婷婷综合| 人妻AV在线观看| 99re视频在线精品| 超pen个人视频97| 国产五月天婷婷| 五月丁香淫淫婷婷婷| 亚洲人人操| 九九久久综合| 91碰碰| 人人九色| www九九热| 97婷婷狠狠久久综合9色| 六月丁香五月激情网| 天天狠狠夜夜狠狠2023| 99,色| 成人电影在线免费试看| WWW色色色COm| 91超碰在线观看| 色狠狠综合入口| 天天日日综合| 婷婷激情综合色五月久久91| 婷婷五月天电影区小说区| 91男人操女人视频| wwwC0maV五月花| 丰满少妇猛烈A片免费看观看| 综合久久婷婷五月丁香| 亚洲成人在线播放| 丁香五月在线观看综合| 99cao婷婷| 五月天激情综合10p| 人妻丰满精品一区二区A片| 激情婷婷五月亚洲| 96自拍视频九色在线观看| 天堂五月婷婷| 婷婷五月综合免费在线| 亚洲人成色A777777在线观看| 色站9/| 亚洲综合五月| 狠狠色噜噜狠狠狠狠综合| 99婷婷国产最新视频| 99在线视频免费| 密视AV综合在线| av操一操| 婷婷免费无马| 天天爽天天操| 停停五月丁香| www.激情| 色五月综合激情网| 在线观看欧美| 热的国产,热的综合,热的有码| 亚洲亚洲人成综合网络| 五月丁香六月婷婷无码| 久久9视频欧美| 国产这里只有精品| 狠狠色噜噜| 激情 婷婷| 欧洲亚洲精品| 激情久久综合网| 超碰9在| 九九九热精品| WWW、日本色丁香、co m| www.第四色99| 大香蕉五月天婷婷| 性色99| 丁香五月人妻| 熟妇人妻中文字幕无码老熟妇 | 狠狠草网| 国产真人做爰视频免费| 色丁香五月婷婷| 狠狠艹狠狠艹| 久久精品五月| 色婷婷成人做爰A片免费看网站| 久久久久久丁香五月| 99亚洲精美视频在线观看| 久久这里只有精品99| 激情 婷婷 插| 99久久婷婷国产综合精品草原| 曰韩少妇内射免费播放| 色五月婷婷操逼| 亚洲第一色网站| 色五月视频无码播放| 91久久精品视频| www.五月天婷婷| 99热99热在线| 人妻肉射免费观看| 五月天激情四射| 精品亚洲国产成AV人片传媒| 久久婷婷影院| www色五月| 色五月天中文字幕| 久久精典| 3p久久| 五月婷婷久久大片| 色色色热| 99热免| 丁香婷婷基地| 婷婷五月花西瓜| 色婷婷婷av| 99视频久久久| 天天综合网色欲香| 亚洲久久天堂| 无码成人播放器| 色色吧综合| 婷婷五月色惰| 99久久精彩视频| 激情99| 99婷婷| 五月丁香成人网| 热99久久这里只有精品| 亚洲AV另类| 日韩人妻在线观看| 高清激情av在线观看| 婷婷五月丁香综合亚洲| 神马欧美精| 丁香五月激情六月欧亚激情综合导航| 粉嫩AV久久一区二区三区| 噜噜噜精品欧美成人在线观看| 久久婷婷五月综合色和| 国产白丝在线一区| 91啪级电影| se婷97| 久久激情五月婷婷| 激情丁香五月激情婷婷| 中文字幕五月久久婷| 色五月 五月婷婷| 丁香五月天五码婷婷| 激情五月天婷婷色色色色色色色色色色色| 99操碰| 午夜天堂一区人妻| 激情av在线| 色七色九九| 亚洲天堂制| 丁香五月天啪啪| 天天色色婷婷| 99人碰碰碰| 国产无遮挡又黄又爽免费网站| 婷婷五月综合亚洲| 欧美色骚婷婷五月天| 丁香花五月天社区| 婷婷色色五月天| 5月婷婷6月六月丁香| 天天谢天天操| 婷婷五月天成人在线视频| 国产黄大片在线观看画质优化| 噜噜吧天天爱| 婷婷丁香五月天小说| www.sebowuyue| 国产亚洲精品AAAAAAA片| 久久丁香五月| 青青草婷婷综合五月| 玖玖在线| 色玖玖网| 日逼AV影音先锋男人资源站| 综合激情五月天| 激情五月天激情综合网| 色综合xx| 久热这里只有精品6官网亚洲| 一区操| 夜精品无码A片一区二区蜜桃| 99狠狠| 色色 9| 亚洲99激情| 欧美三级黄色片久久| 新激情五月天| 亚州美女| 桃色五月天| 性爱久久| 欧美成人va| 一区二区三区四区无码| 亚洲婷婷五月天综合| 婷丁香五月天| 密视AV综合在线| 91精品国产综合久久久不卡电影| 爱射综合| 五月在线| 色播五月婷婷| 久久婷五月天| 大香蕉久艹| 深爱激情五月网| 婷婷爱婷婷| 婷婷丁香五月精品| 99这里精品| www99热| 日本一级一片免费视频| 六月丁香婷婷色狠狠久久| 日本性视频| 五月天影院婷婷在线观看| 成人av在线网站| www,com,五月色色| 激情中文在线| 9热在线观看| www.99免费视频| 免费观看高清无码| 九九热99精品| 亚洲一级AV在线免费播放| 五月丁香六月停停停| 在线观看免费观看在线9久| 色五月婷婷中文字幕| 操一区| 五月天婷婷影院| 六月婷婷av| 九九综合色综合| 六月婷婷激情| www.婷婷亚洲基地| 五月婷婷婷| 色情五月婷婷| 久久久婷| 熟女强人妻一区二区三区四区无| 亚洲日韩久久婷婷伊人| 90色免费视频| 新激情综合| 97干婷婷| 国产免费一区二区在线A片视频| 一区二区成人电影| 婷婷五月成人有| 婷婷五月天xxx| 婷婷天天综合| 中文在线视频久1| 色婷婷六月| 五月天激情啪啪| 色婷婷操逼| 欧美色婷婷| 无码人妻少妇色欲AV一区二区| 成人片黄网站色大片免费毛片| 五月天激情小说网| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 激情综合色婷婷啪啪六月天| 五月婷色色| 新久久五月天激情| 97色色色视频| 91免费看片| 日本va欧美va国产激情| 亚洲精品国产A久久久久久| 91制片厂久久久国产电影| www.91AV.COM| 婷婷激情小说网| 午夜丁香六月婷| 丁香五月婷婷骚视屏| 另类视频五月天| 狠狠爱综合| 99精品成人无码A片观看金桔| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | av在线色五月丁香婷区久| 五月婷亚洲精品| 9久视频| 99精品视频在线观看| 激情婷婷激情在线不卡| 一区二区成人电影| 五月天激情婷婷丁香| 丁香五月天激情免费在线观看AV777| h在线看免费版在线看| 色综合激情| 91麻豆国产三级精品福利在线观看| 国内久久久精品99| 思思99精品视频在线观看| 中文字幕色色| 99无码视频| AV网在线观看| av 一区三区四区| 激情婷婷色五月| 天天插综合| av一区免费看| 98毛片| 色五月婷婷在线| 激情小说五月天| 丁香五月综合久久| 五月婷免费视频久久久| 综合激情在线视频| 九九伦子片| 欧美激情五月综合| 无码动漫av| 国产成人综合亚洲| 色视频2025| 天天综合网在线| 国产精品VIDEOSSEX久久发布| 涩涩婷婷五月| 人妻精品久久久久久久| 色一情一乱一乱一区91Av| 99热一本久道| 我要看激情五月天| 国产毛片精品一区二区色欲黄A片| 九色在线观看91av| 国产乱妇乱子伦| 97综合在线| 色婷久九| jiZZdr| 国产黄色在线| 婷婷五月蜜桃成人桃色丁香| 日本婷久久| 色婷婷五月天无码视频| 五月婷婷色吧!| 狠狠狠狠狠| 久久总和99| 久久视频这里有精品99| 大香伊人久色| 久久午夜理论| 色无码| 日韩不卡DvD| 色婷婷在线视频| 免费观看高清无码| 天天干天天操天天上| 色优久久| 激情婷婷色小说| 夜夜干夜夜操| 久热无码| 91狠狠色丁香婷婷综合久久| 嫩模aV在线| 日日干日日| 丁香伊人五月色婷婷五十路| 婷婷情色激情| 婷婷热色| 激情五月开心五月丁香五月| 操逼电影免费看| 六月婷婷国产| 五月婷婷狠狠干| 97五月久久丁香婷婷| 日韩精品呦呦va| 中国丰满熟女A片免费观| 人妻综合网| 婷婷综合一二三| 婷婷金品综合视频| 婷婷五月天首页| 夜夜天天久久婷婷| 秋霞学生妹一二级| 丁香六月婷月91婷月| 亚洲综合婷婷五月| 996er热| 91人操人人人操人| 丁香婷婷91在线观看视频| 五月丁香另类网| 婷婷五六日| 亚洲婷婷性爱| 丁香狠狠色婷婷久久无码视频| Caoub青青超碰| 79精品视频在线观看,| 久九九热| 久久婷婷亚洲| 五月丁香激情五月天| 亚洲精品久久久久AV无码| 婷婷5月天av| 五月婷婷香蕉| 五月婷婷亚洲色视频| 天堂爱啪啪| 97精品综合久久| 婷婷丁香六月综合激情站| 色色婷婷五月| 日本熟女一区二区| 久久久久久久久99精品| 天天做天天爱天天综合网| 天天摸人人摸| 五月婷婷激情综合av| 67194中文字幕| 五月停停色色丁香| 99精品网| 男同91| 99视频日韩| 九热电影av| 色色五月天网站| 99色在线视频观看| 丁香激情六月天婷婷| 国产日日操夜夜操的肉棒视频| 丁香五月天激情网| 色五月大| 日本三级韩三级99久久| 色五月丁香五| 成人免费高清在线播放| 五月色综合网欧美网| 丁香开心深爱| 26uuu精品国产| 人妻AV在线观看| 久久激情视频| 五月丁香狠狠爱婷婷综合| 六月大香蕉| 五月激情五月丁香| 丁香色五月婷婷91桃色| 丁香色成人| 激情第四色| 丁香五夜激情四射夜夜夜| av久热| 五月丁香久久久日婷婷久久婷婷日| www,五月天激情| 日本九婷婷| 99热精品免费| 91jiuseshunv| 婷婷基地成人五月天| 久热A| 狼人久草| 日韩人人操| 色色色激情| 婷婷五月天亚洲综合| av在线免费播放| 久久婷婷五月综合色欧美| 一区二区乱码视频| 精品怡红九九九| 婷婷五月AV| 婷婷在线五月综合| 五月天激情综合在线| 六月久久狠狠| www.狠狠操| 国产97色在线 | 日韩| 亭亭色天香| 五月天婷婷av| 888久久久| 五月丁香综合伦理片| 狼人婷婷久久| 99热色综合| 国产色色网址网站| 国产免费AV网站| 在线综合啪| 丁香五月色播中文在线播放| 激情综合九月| 亚洲激情五月| 欧美综合激情五月天| 成人va在线播放| 大香蕉免费9| 久久久久久丁香五月| www.色婷婷| 国产在线黄色| 九九热视频在线观看| 婷婷五月激情黄色| 色婷婷在线视频久| 亚洲成人在线播放| 久热黄色| 婷婷五月天影院| 日韩AV成人电影| 精品成人无码A片观看香草视频| 开心激情婷婷| 91久久99久久91熟女精品| 天天干一干| www99xxxx五月丁| 天天干天天射综合网| 中文字幕丰满孑伦无码专区| 欧美丁香婷婷天天操| 特黄三级片| 日本人人干| 99爱视频| 天天se在线视频| 久久精热| 欧美三级视频下载| 第五色色色婷婷| 久久色吧| 欧美丁香五月夫妻天| 久久九九经典| 狠狠做婷婷| 六月婷婷最新网址| 5五月综合网亚洲| 秋霞少妇毛片| 亚洲男女激情| 在线资源av-超碰中文在线-成人AV| 久久狠狠干| 婷婷欧美激情| 97操操操| 99惹在线精品免费观看| 亚洲天堂99| 狠狠操天天操天天操| 成人做爰黄A片免费看直播室男男| 婷婷丁香高潮了| 最近中文字幕2019视频1| 丁香激情六月天婷婷| 丁香五月激情图片婷婷| 色色色.COM| 国产99久9在线| 久久九九@| 色综合色| 日欧一片内射VA在线影院| 婷婷久久六月费| 在线亚洲综合网| 九色无码| 丁香婷婷人妻| 五月婷婷色在线| 99惹 精品在线| 伊人五月成人| 97色在线观看视频| 99只有精品| 天天狠狠色| 天花AV无码| 国产 亚洲 在线| 欧美激情五月天在线观看| www.丁香黄色五月天人与| 五月丁香婷婷AV| 午夜成人天堂久久无码日韩久久| 日日干日日| WWW.色婷婷.COM| 婷婷网影院| 久久女婷| 色五月综合在线| 91操人视频| 色.五月综合网| 91无码高清| 欧美成人无码一区二区三区| 91碰人人| 日日夜夜婷婷| 夜夜骑福利资源| 九九热视频99| 五月天sesese| 日本超碰在线| 国产色五月| 日韩啪啪视频| 婷婷色综合网日韩国产| 五月婷婷基地| 丁香五月天在线| 开心五月六月婷婷| 伊人大香蕉毛片| 99综合视频| 99在线精品视频在线观看| 丁香五月婷婷狠狠色| 九日日夜夜69| 97热这里只有精品| 五月天狠狠网| 青草视频在线蜜臀| 99激情网| 色444综合网| 久久综合五月天| 色婷婷精品视频| 国产五月婷| 国产67194| 久久9热综合| 国产欧美熟妇另类久久久| 天天肏高清在线| 亚洲九九在线| 久久精品爱爱| 亚洲综合另类| 国产女18毛片多18精品| 超碰人妻在线| 超碰色综合| 停停五月丁香| 亚洲精品性色| 国产Va视频| 婷婷九月色| 538任你爽视频不一样的| 婷婷中合| 国外亚洲成AV人片在线观看| 久久人人看| 色五月五月婷婷| 婷婷综合网站| 色婷婷五月天激情综合| 少妇丁香婷婷| 久久伊人五月天| 成人AV中文字幕| 一起操 91N.com| www.婷婷com| 无码AV免费精品一区二区三区| 五月婷婷激情久久| 伊人玖玖精品| 五月婷婷草| 久久人妻视频| 狠狠草在线观看| 韩国中文字幕91| 99ER热精品视频| 天天日,天天插| 亚洲人妻av| 大香蕉五月天婷婷| 日本不卡中文字幕| 9久国产精品| 中文色婷婷| 综合一区二区三区| 国产三级片91| 久热 91| 亚洲无码另类| 五月天婷婷色| 婷婷欧美| 丁香五月av| 国产美女无遮挡裸体毛片A片 | 色婷婷婷婷| 色婷婷五月天视频网站| www.minyis.com【JT】实力收量可预付QQ2101460746 | 久久婷婷资源| 另类视屏| 综合久久高清| 九九色影院| 秋霞黄色一级久久| 在线VA视频| 六月米奇色综合| 小视频一区| 91人人爽久久涩噜噜噜| 色综合久久五月天| 4399人妻无码久久久| 大香蕉五月天婷婷| 欧美一级色| 丰满少妇乱A片无码| 五月婷婷伊| 中文字幕第四色.999| 激情图片99| 亚洲Va成人| 伊人六月丁香婷婷| 婷婷.com| 久久92| 99视频只有精品| 五月天丁香婷婷视频网址| 九九九九中文字幕| 99干视频| 婷婷舔| 欧美xx激情视频在线观看| 激情丁香九九五月综合网| 色99在线观看| 丁香五月婷婷激情97| 97人妻碰碰碰久久| 这里只有精品视频视频在线观看| 激情5月婷婷狠狠干| 亚洲色综合| 色婷婷成人丁香| 国产成人精品一区二三区熟女在线| 色婷婷丁香五月丁香| 色婷丁香91| 五月在线| 超碰91在线| 色婷婷在线视频| 丁香婷婷色五月天| 综合激情在线观看| 婷婷射丁香| 另类五月婷婷| 99婷五月| 五月天狠狠色| 亚洲综合在线伊人婷| 无码AV免费精品一区二区三区| 天天操天爱综合| 青青日韩| 高清无码视频网址| 久久机只有这里精品| 亚洲热久| 亚洲天天操| 六月丁香婷婷尤物| 九九超碰人人| 亚洲色网络| 好好干av| 91九色视频在线观看| 九九热视频这里只有精品| 日本熟妇人妻在线| 成人在线观看一区| 99热婷婷| 色婷五月| 伊人久久大香线蕉av最新| 激情五月天综合网| 丁香五月激情婷婷婷婷在线观看| 婷婷性爱影院| 综合色五月亭亭| 97色天堂| 五月色丁香婷婷中文字幕| 九草性爱| 第四色首页| 五月丁香| 国产免费av在线| 婷婷五月激情在线| 玖玖色综合| 六月99天天婷婷激情综合| 色综合天天天天做夜夜| 任你艹| 日本久久精品| 婷婷六月天| 97色综合视频| 九六五月天婷婷| 九九色影院| 97精品综合久久| 精品色色| 欧美三级视频下载| 五月天精品综合| 激情五月婷婷| 这里只有精品视频在线观看免费| 丁香六月激情| 五月婷婷婷| 亚洲a色| 九月性爱网| Jh7Uf088VHafNm| 国产精品A成V人在线播放| 婷丁香久综合| 色婷婷五月天在线观看| 天天色天天射天天日| 五月婷婷深深爱| 欧美色碰| 天天色天天操天天射| 久久久香港| 99免费在线| 激情淫乱男女| 色婷婷的五月天| 丁香六月青青草| 久久这里有精品| 日本99视频精品免费播放| 久久99网| 99久操| www.日本91| 九热视频在线精品15| 99热综合色图| 婷婷九九| 欧美丁香婷婷五月| 六月丁香激情综合网| 99久久99九九99九九九| 激情另类综合| A片试看50分钟做受视频| 五月丁香少妇A| 色色三级视频| 丁香婷婷色六月| 日韩AV在线免费| 五月天亚洲色| 69久久99精品久久久久婷婷| 亚洲另类婷婷综合| 开心六月婷| 天堂成人A片永久免费网站| 五月丁香婷色| a性生活久久无| 人人草开心五月天| 欧美在线操| 99热这里只有精品免费| 九热在线这里有精品6| 午夜天天精品视频| 亚州操人在线视频| 色婷婷777狠狠| 可以看的av| 99re这里有精品手机在线| 久久丁香网| 五月丁香六月激情综合| 伊人久久激情图区五月| 日韩少妇内射免费播放| 丁香六月伊人| www.婷婷六月天| 免费看欧美成人A片无码| 日日爽天天| 人伦30P| 99色热| 涩涩涩五月天| 成人在线日韩| 黄色中文字目| 99爱视频| 五月视频日本免费观看| 色婷婷AV久久| 激情四射五月天| 黄页大全十八禁| 亚洲熟女乱色综合亚洲网站| 99爱爱| 精品成人a v无码内射| 久久综合激情| 以及AA大片看看| 激情丁香社区| www.激情五月天| 狠狠综合网| 草榴视频黄色网| 日本一级一级一级一级| 五月婷婷精品无在线| 91成人电影| 色狠狠色噜噜AV天堂五区| 天天日天天舔| 婷婷丁香五月天小说| 中文字幕综合| 五月激情四射网站| 色婷婷丁香五月天| 79色色色色| 色色99色色| 免费看成人747474九号视频在线观看| 中文字幕日产A片在线看| 伊人五月天| 天天色,天天操,天天射| 色五月婷婷av| 五月色情婷婷| 性无码专区无码| 丁香九月婷婷综合| 久色欧美| 深爱激情四射| 97久久草草超级碰碰碰| 九九久久色| www久久久| 99在线热| AAAA网站| 伊人狠狠操| 丁香五月狠狠在线观看| 久久伦乱| yw.av| 丁香五月婷婷激情97| 九九热这里只有精品6| 免费观看大片视频 丁香婷婷 六月欧美| 六月色五月天天婷婷| 九九AV| 黄色激情久久| 久人人操| 婷婷五月天最新网址| 99网| 亚洲五月婷婷| 日韩九区| 在线网黄| 久久思思热| 四月丁香五月婷婷久久| 99久久久国产精品免费蜜乳tv| 夜夜骑日日操| 久久婷婷五月综合| 婷婷色啪| 久久婷婷五月综合色丁香| 一区操| 伊人激情综合| 日本色色影片| 免费看欧美成人A片无码| 亚洲操逼网| 狠狠操综合| a在线观看| 激情综合婷婷| 婷婷深爱五月天| 五月花激情| 青草激情综合| 色激情五月| 五月婷婷激情网| 日日天天干| 99色色视频| 色婷婷亚洲婷婷| 国产67194| 激情婷婷五月天| 中文字幕按摩做爰| 国产真人做爰视频免费| 午夜天堂一区人妻| 99视频| 色色色五月天婷婷| 影音 五月 婷婷 久久| aaaa久久| 婷婷五月激情视频网| 五月婷综合激情| 色www.con| 色情五月丁香| 另类的婷婷| 狠狠999| 97色婷婷五月天| 欧美色色网| 婷婷午夜综合| 五月丁香免费看| 色~性~乱~伦~噜| 亚洲色综合| 热热久久精品视频| 精品九九视频| 欧美成人A片AAA片在线播放| 五月婷婷天天| 久综合网| 九月婷婷久久| www.91五月| 伊人大香蕉在线视频| 操操天堂| 丁香五月婷婷姐| 天天爽综合网| 久久电影4399| 丁香五月婷婷基地| 亚洲成人丁香花| 91ncm视频| 婷婷亚洲激情在线观看视频| 日本成人噜噜| 九九性爱网| 九九成人视频| 九九美女视频| 精品久热| 五月天婷婷久久| 六月丁香啪啪啪| 99色| 婷婷五月天国产传媒| www.99热国产| 激情丁香五月婷婷| 婷婷涩涩五月天| 欧美婷婷九月| 五月婷婷久草在线视频综合| 欧洲色色| 丁香六月婷婷综合激情欧美| 亚洲成人影视在线观看| 99人人操人人爱久久久| 99综合网| 激情九月天天天天婷婷| 日本丁香五月| 人人操操| 婷婷色操| 婷婷欧美激情综合| 免费看成人747474九号视频在线观看| 色久99| 网站免费一站二站| 9热久久| 五月丁香啪| 日本一级特黄大片AAAAA级| 九热免费视频| 激情综合无码| 色色色色色色网站| 无码九九| 国产毛片精品一区二区色欲黄A片| WWW.五月天9999| 大地资源色婷婷视频在线| 夜夜天天久久婷婷| 99热热热99精品婷婷| 亚洲综合色五月| 艹色18p| 久久综合五月天| 91凹凸在线| 亚洲激情AV| 深爱五月婷婷开心中文字幕| 免费看欧美成人A片无码| 天天艹天天色| 人妻在线观看视频| 六月婷婷中文字幕| 久大香蕉| 五月天另类小说| 午夜理论片最新午夜理论剧| 疯狂做受XXXX高潮A片| 日韩精品无码99| 欧美色碰| 五月丁香婷婷啪啪| 日韩成人五月天| 久久久婷婷| 亚洲人人操| 伊人成综合五月婷婷| 中文字幕日韩无码制服诱或| 久操热线| 99热销国产这里有精品| 日本va欧美va欧美va| 成人美女网| 日本的α片xxxwww| 九九Av| 超碰成人电影| 大香蕉久热| 我去色色网五雨天| 婷婷色香六月综合激情| 久久久久er热| 国产精品色一哟哟| 9 1在线视频| 中文av网站| 狠狠狠五月婷婷六月丁香| 久啪欧美| 思思热在线精品视频| 色婷婷色情| 亚洲无aV在线中文字幕| 天天综合色| 激情五月天激情综合网| 亚洲AV日韩无码| 丰满少妇猛烈A片免费看观看 | 深爱激情av| 91九色精品| 午夜精品人妻无码一区二区三区| 综合色五月| 99色6爱9热| 久久九九99.www| 一本久道综合色婷婷五月| 思思热在线精品视频网站| 91九色中文| 日日夜夜干| 日日噜噜夜夜狠狠久久丁香六月| 丁香五月狠狠在线观看| www.刺激色网站www.| av在线资源|