亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

嵌入式內(nèi)存管理實戰(zhàn):從C內(nèi)存布局到內(nèi)存池與泄漏排查 做嵌入式這些年我越發(fā)覺得內(nèi)存在整個嵌入式開發(fā)里是最難講明白、也最值得深挖的一塊。很多人學(xué)完C語言、寫完幾個開發(fā)板例程就開始刷驅(qū)動、調(diào)外設(shè)等到真正碰上隨機死機、設(shè)備重啟、運行久了系統(tǒng)變慢這類問題才發(fā)現(xiàn)自己對內(nèi)存的理解還停留在malloc完了要記得free這種層面。本文想把我實際項目里踩過的內(nèi)存坑、面試中反復(fù)被問到的那幾道內(nèi)存題、以及幾個開源項目里比較成熟的池化思路串起來聊一聊嵌入式內(nèi)存管理的完整圖景——從C內(nèi)存布局到分配器選型從結(jié)構(gòu)體對齊到泄漏排查盡量講清楚每個關(guān)鍵決策背后的為什么。不管你是剛?cè)腴T的學(xué)生、想轉(zhuǎn)嵌入式的工程師還是已經(jīng)在做產(chǎn)品開發(fā)、想系統(tǒng)補一補內(nèi)存這塊短板的開發(fā)者這篇文章都值得耐心看完。我會把每個話題盡量拆得通俗一些用生活里的類比來講原理同時也會給出可以直接落到代碼和工程里的做法。1. 嵌入式內(nèi)存全景為什么這條戰(zhàn)線繞不開1.1 嵌入式內(nèi)存和PC內(nèi)存的最大不同先聊個很根本的問題嵌入式內(nèi)存和PC內(nèi)存到底哪里不一樣PC上你寫代碼基本不用操心物理內(nèi)存長什么樣因為操作系統(tǒng)給你包了一層虛擬內(nèi)存。你的程序以為自己獨享4GB或者32GB的空間背后是操作系統(tǒng)的頁表和缺頁中斷在處理映射關(guān)系。寫崩一個地址最多彈窗報錯進(jìn)程掛掉系統(tǒng)通常沒事。嵌入式環(huán)境就完全是另一套邏輯。大多數(shù)MCU單片機級別的芯片根本沒有MMUMemory Management Unit所有代碼跑在物理地址上。你寫一個野指針訪問到的不是一段非法內(nèi)存而可能是某個外設(shè)寄存器——輕則數(shù)據(jù)被改壞重則直接觸發(fā)硬件錯誤把整個系統(tǒng)打趴。這個差異決定了嵌入式開發(fā)者必須比純應(yīng)用開發(fā)者更敬畏內(nèi)存。在帶MMU的嵌入式Linux平臺上情況介于兩者之間。你確實有虛擬地址空間但資源是受限的。板子可能只有64MB內(nèi)存跑著內(nèi)核、根文件系統(tǒng)和你的業(yè)務(wù)進(jì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)隨機存儲器用來放程序運行時數(shù)據(jù)掉電就丟還有寄存器空間映射到CPU地址空間的特定區(qū)域是操作外設(shè)的入口。以STM32F4為例典型的配置是1MB Flash 192KB SRAM地址空間從0x08000000開始是Flash從0x20000000開始是SRAM。對運行Linux的應(yīng)用處理器來說外部掛的是DDR內(nèi)存容量從幾十MB到幾GB不等地址空間中間還有各種外設(shè)寄存器的映射區(qū)。你在用戶態(tài)寫代碼時malloc到的內(nèi)存實際上是內(nèi)核通過缺頁機制一點點分配給你的物理頁你操作GPIO或者讀取DMA緩沖也得通過/dev/mem或者ioremap來映射物理地址。這里有一個很多新手會忽略的點嵌入式內(nèi)存地圖的每一段都有它的性格。Flash適合存常量字符串但不能頻繁擦寫SRAM速度快但容量小適合放棧和熱點數(shù)據(jù)DDR容量大但時序復(fù)雜帶寬可能成為性能瓶頸。寫代碼時如果對數(shù)據(jù)放哪一段有意識性能差異是能感覺出來的。我見過有人把一個大查找表定義成const數(shù)組放在Flash里比放在RAM里省了一大片空間這就是最簡單的內(nèi)存性格運用。1.3 從內(nèi)存夠用到內(nèi)存省著用第二個觀念上的轉(zhuǎn)變是從內(nèi)存夠不夠用變成內(nèi)存省著用、精準(zhǔn)用。PC應(yīng)用開發(fā)者的思維通常是內(nèi)存不夠加程序運行卡換更好的機器這種思路在嵌入式場景里寸步難行。做產(chǎn)品的時候芯片選型一旦定下來內(nèi)存容量就定死了你還得跟競爭對手比成本、比功耗每一顆多余的DDR顆粒都會增加BOM成本。所以嵌入式內(nèi)存管理的核心命題不是如何讓程序跑得起來而是如何讓程序在給定的內(nèi)存上限里穩(wěn)定、高效、持續(xù)地運行。這種省著用不是讓你寫代碼摳摳搜搜而是要有全局意識哪些數(shù)據(jù)生命周期短可以放棧上哪些要長期保存必須用靜態(tài)區(qū)哪些是臨時緩沖區(qū)可以復(fù)用哪些高頻分配的小對象值得建一個內(nèi)存池。把這些設(shè)計做在前面后期排查問題時你會省出幾十倍的時間。2. 棧、堆、靜態(tài)區(qū)三種內(nèi)存的相處之道2.1 棧區(qū)嵌入式開發(fā)的主戰(zhàn)場與隱藏陷阱C程序的內(nèi)存布局里有三個主角棧、堆、靜態(tài)區(qū)。嵌入式開發(fā)里棧是默認(rèn)的主戰(zhàn)場。函數(shù)調(diào)用、局部變量、函數(shù)參數(shù)、返回地址全在棧上。棧的分配和釋放完全是編譯器生成的代碼在管理速度極快因為它本質(zhì)就是移動一下棧指針。但棧有一個致命的特點大小是有限的。在裸機工程里棧的大小一般由啟動文件或者鏈接腳本指定常見的是1KB到8KB在嵌入式Linux里每個線程的棧默認(rèn)是8MB可以通過ulimit查看和修改但實際物理內(nèi)存不一定支撐你開很多線程。棧溢出的典型癥狀有兩種一是程序飛了表現(xiàn)為PC指針跑到0xFFFFFFFF或者隨機地址二是局部數(shù)組越界寫悄悄改掉了相鄰變量的值出現(xiàn)各種難以解釋的邏輯錯誤。怎么避坑我給自己立了三條規(guī)矩。第一不在棧上放大的數(shù)組比如幾百字節(jié)以上的緩沖區(qū)盡量用靜態(tài)區(qū)或者動態(tài)分配第二遞歸函數(shù)在嵌入式里能不用就不用一層遞歸就是一個棧幀深度不可控第三裸機工程里明確估算每個任務(wù)的棧需求留出至少30%的余量。比如中斷處理函數(shù)如果嵌套層級深前面所有函數(shù)的局部變量都會疊在同一個棧上這種場景特別容易爆棧。2.2 堆區(qū)malloc/free背后的代價堆是大家最熟悉又最容易出問題的地方。malloc、free、new、delete這段自由內(nèi)存看起來很隨意但嵌入式環(huán)境下的堆管理遠(yuǎn)遠(yuǎn)沒有你想象的那么自由。先說說malloc的底層機制。在glibc或者Newlib這類C庫的實現(xiàn)里malloc從操作系統(tǒng)或者裸機的堆區(qū)間一次性申請一大塊內(nèi)存然后在進(jìn)程內(nèi)部用一個空閑鏈表來管理。每次malloc分配器會按某種策略比如first-fit或best-fit從空閑鏈表中切一塊出來free的時候再把塊還回鏈表。這個過程有幾個代價一是鏈表查找有時間開銷頻繁分配釋放會出現(xiàn)性能和碎片問題二是每個分配出去的內(nèi)存塊頭部都要存元信息大小、狀態(tài)、前后指針小對象分配這種開銷占比極高三是碎片積累到一定程度明明總空閑內(nèi)存夠但連續(xù)大塊分配失敗。嵌入式里如果要用堆我的建議是能不用就不用用了就要管住生命周期。特別是長期運行的系統(tǒng)如果分配釋放模式無序碎片會在幾天甚至幾小時內(nèi)把堆搞成一盤散沙。一次典型的事故是設(shè)備連續(xù)運行一周后突然malloc失敗排查發(fā)現(xiàn)網(wǎng)絡(luò)上來的每個請求都分配了一個幾KB的緩沖區(qū)請求結(jié)束后釋放但釋放時機和大小模式不均勻碎片越積越多到最后分不出一個足夠大的連續(xù)塊。這種問題頂多靠定期重啟緩解根治還得改架構(gòu)。2.3 靜態(tài)區(qū)全局變量的代價與收益靜態(tài)區(qū)存放的是全局變量、static變量和字符串常量。這個區(qū)域在程序啟動時就固定好了布局生命周期跟程序一樣長不涉及運行時分配也沒有碎片問題——這是它的好處。但天下沒有免費的午餐。靜態(tài)區(qū)的空間在編譯鏈接時就占了整個程序運行期間都不可能被回收。如果一個系統(tǒng)里全是全局變量、全局緩沖區(qū)內(nèi)存壓力就會變成硬性壓力。更麻煩的是全局變量在多任務(wù)環(huán)境下天然是并發(fā)訪問的溫床你要用鎖、關(guān)中斷、原子操作去保護(hù)稍不留神就會埋下競態(tài)條件的隱患。我的經(jīng)驗是分級使用真正的系統(tǒng)級配置、硬件寄存器映射、以及需要在整個生命周期內(nèi)存活的常量數(shù)據(jù)放到靜態(tài)區(qū)沒問題但那些只在某個業(yè)務(wù)階段才會用到的大塊緩沖完全可以設(shè)計成按需分配用完了釋放掉。比如協(xié)議棧里某個大緩沖區(qū)只在接收突發(fā)數(shù)據(jù)時起作用平時可以釋放或者復(fù)用給其他模塊這樣能顯著壓低系統(tǒng)的常駐內(nèi)存水位線。提示判斷該用哪種內(nèi)存可以問自己三個問題——數(shù)據(jù)需要活多久數(shù)據(jù)大小是否編譯期確定這段代碼的運行頻次和實時性要求如何回答完這三個問題內(nèi)存選型基本就有結(jié)論了。3. 內(nèi)存分配器的選型與內(nèi)存池實現(xiàn)3.1 通用malloc的問題為什么跑著跑著系統(tǒng)變慢嵌入式項目跑到后期很多人會注意到一個現(xiàn)象系統(tǒng)剛上電時一切正常越往后響應(yīng)越慢甚至卡頓。這往往不是CPU性能不夠而是內(nèi)存分配路徑上出了問題。通用malloc的慢主要體現(xiàn)在幾方面。第一分配路徑可能有系統(tǒng)調(diào)用。Linux的glibc malloc在小塊分配時走brk大塊才走mmap但mmap和munmap涉及內(nèi)核態(tài)的頁表操作開銷比純用戶態(tài)操作高一個數(shù)量級。第二空閑鏈表的遍歷和合并需要時間特別是經(jīng)過大量分配釋放后鏈表碎片化導(dǎo)致每次分配要掃描更多節(jié)點。第三多線程環(huán)境下malloc內(nèi)部有鎖競爭多個線程同時分配時會互相阻塞RTOS里如果中斷和任務(wù)都在調(diào)malloc還要考慮臨界區(qū)保護(hù)。實時性要求高的場景下這種不確定性是致命的。音頻處理里的一個緩沖如果在運行過程中出現(xiàn)幾毫秒的分配延遲輸出的聲音就會爆音控制環(huán)路里一個高頻任務(wù)如果因為分配內(nèi)存被阻塞就可能造成嚴(yán)重的控制偏差。所以我一直強調(diào)實時關(guān)鍵路徑里的內(nèi)存分配必須提前準(zhǔn)備好不能在運行時才現(xiàn)摘現(xiàn)用。3.2 內(nèi)存池把分配變成取塊內(nèi)存池的思路其實特別樸素預(yù)先從堆或者靜態(tài)區(qū)里切出一大塊連續(xù)內(nèi)存劃分成若干個大小固定的塊用鏈表串起來。分配時從空閑鏈表頭取一個塊釋放時再掛回鏈表頭。因為塊大小固定不需要維護(hù)元信息分配釋放都是O(1)復(fù)雜度而且不會產(chǎn)生碎片。我用一個可控稍微復(fù)雜一點的例子說明。假設(shè)你要管理一個池子總共有N個塊每塊大小BLOCK_SIZE。可以用一個數(shù)組做底層存儲再用一個空閑塊索引棧來記錄哪些塊是空的typedef struct { uint8_t *pool; // 內(nèi)存池起始地址 uint32_t block_size; // 每個塊大小 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í)行時間完全確定。這在實時系統(tǒng)里很受歡迎——你用塊大小固定換來了分配時間確定、無碎片、開銷極小。但是內(nèi)存池也有它的局限性。塊大小固定意味著不夠靈活如果某類對象遠(yuǎn)小于塊大小內(nèi)部碎片率會比較高如果某個需求突然超過塊大小池就派不上用場了。所以實際項目里往往不是單一池子而是分層設(shè)計小塊池、中塊池、大塊池各管一種規(guī)格再加上隊列消息、DMA描述符這些專用池子。3.3 常用分配器方案的橫向?qū)Ρ惹度胧筋I(lǐng)域常用的分配器方案我整理成一張對比表供參考方案優(yōu)點缺點適用場景標(biāo)準(zhǔn)庫malloc通用、兼容性好時間不確定、有碎片開發(fā)期、非實時路徑固定大小內(nèi)存池O(1)、無碎片、實時性好塊大小固定、靈活性差高頻小對象、實時關(guān)鍵路徑伙伴分配器大塊管理高效、支持任意大小實現(xiàn)復(fù)雜、小塊有內(nèi)部碎片嵌入式Linux內(nèi)核、大緩存管理slab分配器按對象類型緩存、效率高依賴復(fù)雜內(nèi)核機制Linux內(nèi)核中常用TLSF分配器時間確定性好、支持任意大小實現(xiàn)難度中等需要實時性又需要靈活大小的場景我自己在裸機工程里用得最多的是固定池上了Linux用戶態(tài)高實時任務(wù)里也會自己搭TLSF或者固定池普通后臺任務(wù)才撒手用glibc的malloc。做選型的時候別貪心沒有銀彈關(guān)鍵是想清楚你的需求到底是實時性碎片控制還是靈活性抓住主要矛盾就行。4. 結(jié)構(gòu)體、字節(jié)對齊與內(nèi)存布局優(yōu)化4.1 結(jié)構(gòu)體對齊看起來省下的空間其實沒省結(jié)構(gòu)體是嵌入式C開發(fā)里最常用的數(shù)據(jù)容器但很多人對結(jié)構(gòu)體的內(nèi)存布局完全沒有概念。你以為寫了個int8_t、int32_t、int8_t的成員結(jié)構(gòu)體大小就是6字節(jié)實際上編譯器為了保證對齊會在成員之間和結(jié)構(gòu)體末尾插入填充字節(jié)這個結(jié)構(gòu)體的大小很可能是12字節(jié)。對齊的規(guī)則可以簡化成一句每個成員變量的地址必須是其自身對齊值的整數(shù)倍。int32_t對齊值是4結(jié)構(gòu)體的整體大小必須是對齊值最大成員的整數(shù)倍。所以成員順序會影響結(jié)構(gòu)體大小。舉個實際例子同樣的三個成員// 方案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)容僅僅因為成員排列順序不同內(nèi)存占用就從12字節(jié)降到8字節(jié)省了33%。如果這個結(jié)構(gòu)體類型要被創(chuàng)建成千上萬次或者通過網(wǎng)絡(luò)/存儲批量寫入這個差異會直接放大成非??捎^的節(jié)省。4.2 位域、packed與硬件的咬合協(xié)議棧和驅(qū)動開發(fā)里我們經(jīng)常需要把多個標(biāo)志位打包進(jìn)一個字節(jié)或者跟硬件寄存器的位定義一一對應(yīng)這時候可以用位域bit-field。但位域的布局在不同編譯器和平臺上沒有統(tǒng)一標(biāo)準(zhǔn)跨平臺移植時很容易踩坑。我的做法比較保守能用位運算和掩碼處理寄存器的就盡量不用位域位域只用在編譯器和平臺都固定的內(nèi)部代碼里。至于#pragma pack(1)或者_(dá)_attribute__((packed))這招能取消對齊填充讓結(jié)構(gòu)體按緊湊方式排列但代價是訪問未對齊成員時可能觸發(fā)總線錯誤或者性能懲罰。我在ARM Cortex-M系列上實測過訪問packed結(jié)構(gòu)體里的int32_t成員編譯器會生成多字節(jié)拼接的代碼效率明顯下降。所以packed只適合用在需要精確匹配協(xié)議報文、或者內(nèi)存極度緊缺的場景并且要注意涉及DMA傳輸?shù)慕Y(jié)構(gòu)體對齊要求尤其敏感不要輕易packed。結(jié)構(gòu)體字段排列的順序還應(yīng)該考慮實際讀寫模式。把高頻訪問的字段放在同一緩存行內(nèi)可以減少緩存失效把互斥訪問的字段分開可以降低偽共享。這些在嵌入式Linux多核場景下尤其重要單核裸機時代不用太在意但一旦上了多核布局問題可能直接影響性能和并發(fā)正確性。4.3 編譯選項與鏈接腳本最后一道省內(nèi)存的閘門代碼層面的優(yōu)化只是前半程編譯鏈接階段還有兩道閘門可以控制內(nèi)存占用。第一道是編譯器優(yōu)化選項。-Osoptimize for size在嵌入式里通常比-O2更常用因為它傾向于生成更小的代碼。實測下來同一段代碼用-Os編譯Flash占用可能比-O2少10%到20%代價是部分場景性能輕微下降。如果你的產(chǎn)品Flash資源緊張-Os幾乎是必選的。第二道是鏈接腳本。鏈接腳本決定了代碼段、數(shù)據(jù)段、BSS段未初始化數(shù)據(jù)放在哪里、按什么順序排布。很多MCU工程里可以在鏈接腳本里把只讀數(shù)據(jù)放到Flash、把變量放到SRAM還可以用__attribute__((section(...)))把某個大模塊的數(shù)據(jù)放到獨立的段里。這樣做的意義在于你可以精確控制內(nèi)存映射把熱點數(shù)據(jù)放到更快的內(nèi)存區(qū)域把冷數(shù)據(jù)放到大容量但更慢的區(qū)域。還有一個很實用的小技巧是-fdata-sections -ffunction-sections配合--gc-sections。這兩個選項讓編譯器和鏈接器把每個函數(shù)、每個全局?jǐn)?shù)據(jù)拆分成獨立段鏈接時自動丟棄沒有引用到的段。很多項目的Flash占用能因此降低5%到15%尤其適合用HAL庫或SDK帶了大量你用不上的函數(shù)時。我在一個使用STM32的工程里開過這個組合Flash用量從96KB降到81KB非??捎^。5. 內(nèi)存泄漏、踩內(nèi)存與實戰(zhàn)排查5.1 嵌入式內(nèi)存問題的四種典型癥狀嵌入式內(nèi)存問題的癥狀千奇百怪但歸根結(jié)底可以歸成四類一是內(nèi)存泄漏。內(nèi)存持續(xù)分配但不釋放表現(xiàn)為系統(tǒng)的空閑內(nèi)存不斷下降最終malloc失敗。特點是溫水煮青蛙可能運行幾小時甚至幾天才爆發(fā)。二是踩內(nèi)存buffer overflow/underflow。數(shù)組越界寫、指針指向了錯誤地址、釋放后再使用use-after-free這類問題最隱蔽因為它破壞的可能是你完全意料之外的變量。三是棧溢出。??臻g不夠用函數(shù)調(diào)用時壓棧把棧指針推過了棧區(qū)邊界程序飛掉或者行為異常。IAR、Keil里調(diào)試時如果看到PC飆到異常地址第一個要懷疑的就是棧。四是堆碎片??臻e內(nèi)存總量充足但無法分配出足夠大的連續(xù)塊。前面討論過這類問題通常在malloc失敗的那一瞬間才被發(fā)現(xiàn)而現(xiàn)場大概率已經(jīng)無法復(fù)現(xiàn)。5.2 靜態(tài)分析與動態(tài)檢測工具排查嵌入式內(nèi)存問題工具鏈的配合是必需的。我強烈建議所有嵌入式C/C項目在開發(fā)階段就把一些靜態(tài)檢查工具納入CI流程。靜態(tài)分析方面cppcheck是免費的輕量選手能發(fā)現(xiàn)很多數(shù)組越界、空指針解引用、資源泄漏問題clang-tidy和Coverity這類更強的工具能做的更深但對嵌入式交叉編譯環(huán)境的配置要求也更高。我實際用下來的感受是靜態(tài)工具能幫你掃掉五六類的低級錯誤但別指望它搞定所有內(nèi)存問題很多問題只有在運行時才能暴露。動態(tài)檢測方面不同平臺的工具路徑不太一樣嵌入式Linux平臺最經(jīng)典的是Valgrind memcheck能檢測內(nèi)存泄漏、越界訪問、使用未初始化內(nèi)存等問題。部署到板子上跑測試用例配合--leak-checkfull和--error-limitno能揪出非常多隱藏問題。缺點是Valgrind會大幅拖慢運行速度5-20倍不適合所有場景但用來做回歸測試非常值得。裸機/MCU平臺可以用編譯器自帶的sanitizerARM GCC支持-fsanitizeaddress的實驗性功能但可能影響運行性能更通用的做法是自己寫一個簡單的內(nèi)存監(jiān)視模塊在所有malloc/free調(diào)用處記錄指針、大小、調(diào)用點啟動后定期打印分配統(tǒng)計。嵌入式RTOS平臺FreeRTOS有heap_4里自帶的統(tǒng)計接口xPortGetFreeHeapSizeRT-Thread則自帶內(nèi)存堆檢查功能。這些都可以做水位線監(jiān)測我在產(chǎn)品里跑一個周期性任務(wù)每30秒采集一次剩余堆內(nèi)存發(fā)到日志系統(tǒng)能快速發(fā)現(xiàn)泄漏趨勢。5.3 一次典型的排查實錄分享一個我做車載項目時遇到的實際案例。設(shè)備跑的是嵌入式Linux客戶反饋連續(xù)運行一周后設(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觀察增長曲線同時抓了一遍/proc/[pid]/maps看看虛擬內(nèi)存分布。發(fā)現(xiàn)一個可疑點VmSize漲得比VmRSS還快說明除了實際物理內(nèi)存增長還有一個虛擬地址段在膨脹。順著可疑的映射塊找最后鎖定了問題出在一個第三方庫的消息隊列處理模塊——每次收到一條消息它都malloc一塊緩沖區(qū)但處理失敗時沒有釋放導(dǎo)致泄漏。修復(fù)其實只有一行free但排查過程花了整整兩天。這次經(jīng)歷讓我養(yǎng)成了一個習(xí)慣所有長期運行的嵌入式設(shè)備不管看起來多穩(wěn)定都要在設(shè)計和測試階段就內(nèi)置內(nèi)存監(jiān)控能力。否則真出了問題在現(xiàn)場復(fù)現(xiàn)的成本是實驗室里的十倍以上。提示排查時的關(guān)鍵心態(tài)是不要猜要測。每一次判斷都要有工具輸出的數(shù)據(jù)支撐否則你在排查過程中做的很多假設(shè)最后都會被證明是錯的。6. 嵌入式面試中的內(nèi)存八股與項目經(jīng)驗6.1 高頻面試題從背答案到講原理結(jié)合熱搜詞里的嵌入式面試題嵌入式八股文我把實際面試?yán)锍霈F(xiàn)頻率最高的內(nèi)存類題目梳理了一下。注意面試官問這些題多半不是想聽你背標(biāo)準(zhǔn)答案而是想通過追問判斷你實際踩過多少坑。第一道高頻題是說說C程序的內(nèi)存布局?;A(chǔ)答案是棧、堆、BSS、數(shù)據(jù)段、代碼段但加分答案是能講清楚BSS和數(shù)據(jù)段的區(qū)別未初始化的全局變量放在BSS程序加載時清零不占磁盤空間已初始化的全局變量放在數(shù)據(jù)段在磁盤上占空間加載時拷貝到內(nèi)存。還要能結(jié)合嵌入式場景講出const變量放在只讀段定義在Flash里這種實際工程理解。第二道高頻題是malloc和free為什么不適合實時系統(tǒng)。面試官想聽的不是因為會碎片而是更深入的回答分配時間復(fù)雜度不確定、底層可能涉及內(nèi)核系統(tǒng)調(diào)用、多線程鎖競爭、以及嵌入式實時任務(wù)里如何用內(nèi)存池代替。第三道高頻題是如何檢測內(nèi)存泄漏。理想回答會分層次編譯期用靜態(tài)分析工具、運行期用Valgrind/ASan、裸機自研分配計數(shù)、系統(tǒng)級通過監(jiān)控/proc/meminfo和VmRSS。能把工具和場景匹配起來的人明顯是真正做過項目的。第四道是struct對齊問題。除了講規(guī)則最好能現(xiàn)場舉例說明重排成員順序能節(jié)省多少空間再多說一句packed的代價就能和背道題的人拉開差距。6.2 項目經(jīng)驗怎么講不露怯面試?yán)锉缺嘲斯筛匾氖侵v項目里的內(nèi)存處理經(jīng)驗。我見過很多候選人簡歷上都寫著熟悉嵌入式Linux但問起來就說不清楚自己項目里內(nèi)存占用多少、峰值多少、泄漏問題遇到過沒有。我的建議是準(zhǔn)備項目經(jīng)驗時死死盯住幾個具體數(shù)字整個系統(tǒng)的RAM占用總量、程序最大棧深度、堆峰值使用量、池化前后的分配延遲對比。比如你可以這樣講我負(fù)責(zé)的音頻采集模塊原來每個音頻幀都malloc緩沖區(qū)后來改成環(huán)形緩沖雙緩沖池分配延遲從平均50微秒降到接近0幀率還提升了10%。這種描述比優(yōu)化了內(nèi)存管理有說服力得多。另外把自己踩過的坑整理成事故復(fù)盤講給面試官往往比報一堆技術(shù)名詞更有含金量。我面試別人時最愿意聽的就是候選人在項目中遇到了什么詭異問題、通過什么手段定位、最后怎么根治、以及從中學(xué)到了什么。這種敘事自帶真實性比任何背出來的答案都可信。6.3 給新人的一條學(xué)習(xí)路徑如果你現(xiàn)在還是學(xué)生或者剛?cè)胄邢胂到y(tǒng)地補一補嵌入式內(nèi)存這堂課我給一條自己驗證過的路線第一先把C語言里的指針、數(shù)組、結(jié)構(gòu)體徹底學(xué)通透最好把《C和指針》或者《深入理解計算機系統(tǒng)》的內(nèi)存相關(guān)章節(jié)啃一遍第二在開發(fā)板上跑FreeRTOS或者RT-Thread親手配置堆棧、寫內(nèi)存池第三把一個開源項目比如一些RTOS內(nèi)核、TinyUSB、LwIP的源碼下下來重點看它們怎么管理緩沖區(qū)、怎么處理DMA描述符、怎么在ISR和任務(wù)間共享消息第四總結(jié)一套適合自己的調(diào)試方法論把工具用熟。這條路線走下來你會發(fā)現(xiàn)自己看代碼的習(xí)慣都會變——不再只盯著功能邏輯而是會自動在心里畫出每個變量的內(nèi)存生命周期圖。這大概就是內(nèi)存課真正想教給你的東西。7. 內(nèi)存優(yōu)化的底層心法從修問題到設(shè)計問題7.1 三個優(yōu)化維度峰值、均值、確定性做嵌入式內(nèi)存管理久了你會發(fā)現(xiàn)優(yōu)化這件事要同時盯住三個維度峰值內(nèi)存、平均內(nèi)存、分配確定性和穩(wěn)定性。峰值內(nèi)存決定了你需要多少物理內(nèi)存直接關(guān)系芯片選型和成本。降低峰值的方法包括把大塊緩沖改成按需分配、錯峰使用不同模塊復(fù)用同一塊緩沖區(qū)、把部分?jǐn)?shù)據(jù)處理流水分塊而不是一次性加載。平均內(nèi)存代表系統(tǒng)運行的水位降低均值可以有效延長設(shè)備的穩(wěn)定運行時間減少碎片觸頂概率。而分配確定性是我們前面反復(fù)強調(diào)的實時性來源關(guān)鍵路徑上必須用O(1)的分配器。實際優(yōu)化的時候我會先做內(nèi)存畫像memory profiling統(tǒng)計系統(tǒng)在冷啟動、穩(wěn)態(tài)、高峰期、異常情況下的內(nèi)存使用曲線。只有把基線數(shù)據(jù)摸清楚了后續(xù)所有優(yōu)化動作才能有的放矢。7.2 從內(nèi)存省著用到內(nèi)存高效用最后想聊一個觀念層面的東西。很多初學(xué)者覺得內(nèi)存優(yōu)化等于省著用能用char絕不用int能用bit絕不用byte。但我覺得真正的高效不是拼命壓省每一個字節(jié)而是讓每一塊內(nèi)存都在它的生命周期里發(fā)揮最大價值。比如你為了省內(nèi)存把一個本來該用uint32_t的計數(shù)器改成uint8_t結(jié)果計數(shù)溢出導(dǎo)致邏輯錯亂為了排查這個bug花掉的成本可能比省下的那3個字節(jié)寶貴得多。反過來如果一段緩沖區(qū)生命周期很短且只在一個模塊內(nèi)部使用那它完全可以在棧上分配既快又不需要管理——這是合理用勝于省著用的典型場景。我在實際項目中體會最深的一點是內(nèi)存優(yōu)化的終極目標(biāo)是系統(tǒng)的確定性和安全性不只是省空間。一個內(nèi)存占用偏高但邊界清晰、分配模式可控的系統(tǒng)往往比一個省到極限但處處是隱藏風(fēng)險的系統(tǒng)更容易維護(hù)。做內(nèi)存設(shè)計時永遠(yuǎn)先考慮這個系統(tǒng)能不能穩(wěn)定跑一年不宕機再考慮能不能省下那幾十KB。7.3 后續(xù)可以繼續(xù)深挖的擴展方向這篇文章講的主要內(nèi)容偏裸機和嵌入式Linux用戶態(tài)如果你還想繼續(xù)深入有幾個方向值得花時間一是內(nèi)核態(tài)內(nèi)存管理。掌握kmalloc、vmalloc、slab、頁面分配器以及不同內(nèi)存分配API的適用場景是成為內(nèi)核開發(fā)者繞不開的路。二是C的RAII與智能指針在嵌入式里的應(yīng)用。很多人覺得嵌入式不用C實際上隨著MCU算力提升基于現(xiàn)代C的嵌入式項目越來越多。理解std::unique_ptr、std::shared_ptr和內(nèi)存池的結(jié)合方式能幫你寫出更安全的代碼。三是異構(gòu)計算場景下的內(nèi)存管理。NPU、GPU這類加速器的內(nèi)存分配和主機側(cè)不同涉及ion/dma-buf這類跨設(shè)備內(nèi)存共享機制這是當(dāng)前AIoT設(shè)備開發(fā)的熱門方向。根據(jù)我個人的體會做嵌入式內(nèi)存這堂課其實沒有捷徑。只有多寫代碼、多踩坑、多復(fù)盤才可能把內(nèi)存從敵人變成朋友。希望這篇分享能給你的嵌入式開發(fā)路提供一點地圖至少讓你在遇到內(nèi)存問題時知道該往哪個方向去排查。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99无码精品| 日本高清_区二区三区| 操九九九九九九| 久久78| 久久久九97| 久久av无码| 超碰 国产熟女精品一区| 另类视频在线| 免费中文在线| 欧美一级A一级a爱片久久| 狠狠夜色午夜久久综合在线| 日本中文字幕在线视频| 国产日韩精品suv| 综合激情二| 国产精品在线一区二区| 青青草原狼av| 91丝袜美女国产| 国产无码成人无码| 91熟女丨老女人| 亚洲揄拍网| 日本大片日本一区二区免费高清| 看大黄色大片原件| yw尤物av无码点击进入麻豆| 亚洲男人的天堂网| 国产精品肉丝自拍| 久操精品网| 久久久一区二区三区三州| 亚洲男人天堂视频| 欧美性生活内射| www.婷婷六月天| 成人a大片在线观看| 日韩成人性日韩成人性爱视频在线免费观看 | 午夜亚洲WWW湿好大| 精品久久97观看在线视频| 伊人丝袜美腿高跟在线观看高清| 国产成人自拍视频在线| 欧美日韩香蕉| 日本色色色视频| 91 欧美| 97在线公开视频| 成人性爱视频在线看| 天美传媒婬乱在| 天天在线91| 亚洲污污网站| 五十路人妻在线| 91在线美女| 久久天堂婷婷网| 天天干天天拍| 精品国产少妇高潮视频| 欧美日韩m| 九色97| 日韩一级欧美一级在线观看| 一区二区三区 日韩欧美| 日本一道在线播放高清| 欧美天天| 国产狂喷潮在线精品| 另类图片综合| 91天美| 91人妻在线视频| 九t超碰| 深夜激情| 日韩在线观看三级电影| 一中国女人毛片水真多| 黄色AAAAA欧美| 欧美性爱日韩性爱| 久操热| 精品v日韩欧美国产| 色官网在线| 美女黄频a美女大全免费皮| 精品九九九九九九九九九| 日夜干射色啊| 麻豆色99999| 亚洲图片小说欧洲| 亚洲成人美女无吗| 另类视频在线| 久草大| 殴美牲| 青青草日本中文字幕| 黑人干亚洲| 啊啊啊好多水| 日韩人成网站在线播放| 色婷婷蜜臀av| 干B网| 亚洲欧美另类图片| 最新的亚洲无吗| 色色婷婷五月| 人妻内射一区二区在线视频| 99久久久久久亚洲精品不卡| 探花一区在线| 亚洲s在线观看| 色偷综合| 日韩综合无码一区久久92| 操逼操逼逼操操逼91 | 大香蕉一级黄色片久久| 国产色呦呦| 性色一线| 色香综合天天影视综合 | 欧美九九九| 欧美日韩另类在线播放| 青娱乐导航AV| 91大学精品激情戏| 久热99999| 伊人天天久久动态图| 欧美激情性爱视频网站| 青青草久草AV| 亚洲自拍偷拍视频在线| 丁香五月久久| 青青伊人加勒比海| 欧美亚洲一级在线观看| 日韩av乱伦| 久湿久久| 人人操人人操人人人操| 超AV色女| 男女国产精品| 欧美特大黄一级片片免费| 久久日韩毛| 天天舔九色婷婷| 啊啊啊慢点| 亚洲成人久久一区二区| 天天天天做夜夜夜夜做| 久久综合九色综合欧洲98| 97自拍视频在线| 亚洲欧美校园| 入口操逼网站| 色97国产69香蕉| 人妻丰满熟妇一区二区三| 黄色AV影视| 搞中出视频在线观看| 91福利网在线观看| 国产女上位好爽在线| 中文字幕成人| 日韩欧美性爱电影在线观看| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 美女超碰978| 欧美热图99| 久久久无码av精| 亚洲 欧美 另类 日韩 人妻一区| ji熟女.com| 日日夜夜草草草| 被窝影院午夜看片无码| 久久99草| 成人aⅴ一区二区三区| 操逼999| 国产精品久久久久久久AV大片 | 伊人久久88国产女| 99999国产精品| 五月丁香啪啪| 男人天堂电影院| 欧美性爱一内片一区二区三区| 黄骗免费网站| 热久日综合| 色视频蜜乳| 欧美狠狠弄| 成人无遮挡毛片免费看| 丁香五月影院| 一级片视频啪啪| 亚洲自拍欧美国产首页网曝| 人人操人人摸人| 精品无av| 丝袜制服字幕在线| 免费看欧美美女黄色大片 | 欧美强奸一区二区诱惑| 9 1果冻精品视频| 五月天激情综合网| 亚洲AV无码乱码| 91天射| 青娱乐久久艹| 婷婷综合久久| 欧美福利视频啊啊啊啊| 国产AV线| 日韩AV色图| 国产乱码精品一区二区三区四川| 日韩青久久| 久久欧美1卡2卡3| 国产日韩精品人妻久久久久色欲网站| 2017天天透天天通天天擦| 国产日韩欧美三级片| 色网亚洲人| 婷婷情色综合网| 人妻aa| 亚洲在线a| 欲色影视综合吧| 免费A V在线| 91在线精品一区二区三区| 丰满人妻一区| 另类图片五月| 超碰av在线| 免费的黄片有限公司| 亚洲色天堂九9| 欧中日成人免费影视| 丁香五月天激情网站| 99久在线精品99re8蜜桃| 亚洲精品天天影视综合网 | 91伊人大香蕉| 97精品国产97久久久久久| 操逼视频免费日韩无码| 欧美成人四级在线播放| 秋霞Av理论一级在线| av草草在线电影| 欧美成人精品一区二区三区| 婷婷丁香五月综合| 六月婷婷一区二区三区| 青苹果影院男人的天堂| 99热久| 免费簧片在线观看| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久久亚洲天天做| 国产99久久99热这里只有精品15| av无线看| 国产成人精品无码久久| 91影库| 肏逼视频日本| 久久亚洲AV无码专区首页| 无码区蜜乳| 欧美图片校园春色| 日本亚洲嫩草影院啪啪| 在线洲亚线| 国产精品高朝久久久久久久| 亚洲色图 综合| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 日本视频一区二区三区| 日本免费中文字幕在线| 中文字幕一区二区日韩网| 久久久久久久性爱| 91久久九九精品国产综合| 国产精品熟女一区二区三区| 好属操| 男女啊啊啊| 91天天爱| 女人18精品一区二区三区| 欧美中文字幕日韩在线| 91天天综合日韩欧美| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲 欧美 日韩另类 麻豆| 成人在线午夜视频一区| 天天综合网亚洲综合网| 蜜桃臀一区二区三区久久| 91强在线播放| 97超碰9| 精品欧美老熟女一二区| 综合久久久久久久综合网| 男女性感激情网站| 性爱Av免费| 93人人操人人| 国产亚洲在线观看| 91女人的网站| 亚洲性猛| 91日产桃蜜| 91青青在线| 婷婷涩嫩草鲁丝久久午夜精品| 起碰97| 日韩黄片视频试看| 国产AV精久久| 五月丁香六月| 高潮综合网| 欧美永久激情一区二区| 一区二区不卡免费| 97精品网| 久久男人精品| 国产亚洲精品av一区| 嫖老熟女A片一二三区| 天天干少妇| 丁香五月天久久精品视频一区二区三区| 岛国免费视频在线| 国产亚洲精品自在线亚洲情侣| 国产丝袜视频| 欧美 青青草| 超碰 欧美| 极品色| 首页中文字幕中文字幕免费| 欧美日韩222| 亚洲鸥美色图| 日本欧美一区二区三区视频麻豆| 精品成人av一区二区三区在线| 99热婷婷| 精品人妻一区二区乱码一区二区| 久草免费在线视频| 自拍偷拍 高清无码| 你操综合| 少妇淫妇久久久久久久| 欧美性爱一级操| 97久久超碰国产网站| 98福利在线视频| 亚洲综合91| 日本成人电影资源网| 精品久久久无码| 亚熟hd视频在线| 9色国产精品一区粉嫩| 日本三级大片| 亚洲熟女诱惑| 色色99| 啊啊啊啊啊啊啊好爽不要| 亚洲欧美综合网站| 神马久久午夜| 亚洲精品成人激情在线| 日本一久是| 91精品久久久久五月天精品| 91美女视频| 无码久久亚洲高清,| 色五月激情综合网| 绑缚麻绳人妻寝取完整版| 2017天天插| 午夜大香蕉| 亚洲97网站| 亚洲第一狼人丝袜美女另类 | 亚洲色图20p| 91狠狠| 久久久无码国精品无码三区三区| 操淫穴亚洲五月丁香 | 色阁阁AV综合网| 无码外流操逼视频| 欧美日韩97在线| 日本三级网页| 久久的网站啊啊啊啊啊| 日韩欧无码一区二区三区免费不卡| 黄片视频,下载| 综合网久久| 97精品免费视频网站| 亚洲人妻一区二区三区| 日韩欧美天堂| 激情五月天综合网| 亚洲欧美日韩偷拍色图| 亚洲城人男人的天堂| 欧美Ⅴ性爱| 爱干爱射网啊啊啊| 久久久久久日韩| 91综合国产精品| 欧美一级特黄淫片在线观看| 91男人综合| 伊人久久88国产女| 超碰导航97| 日产狠狠干| 日韩啊V| 韩国三级三级BD在线| 99久久无码| 久久久∴| 激情接吻视频久久久久久| 色网1| 99综合视频一体| 亚洲动态色图| 男人久久精品| 97人人操人人摸| 91亚洲狠狠色| 亚洲天堂女优在线| 日韩成人综合网| 久久春色| 91亚洲丝袜| 天天做日日爱夜夜爽| 自拍六区| 天天色怡春院| 日本精品人妻少妇一区二区| 黄色视频60分钟| 久久 亚洲 日韩 人妻| 爱做久久久久久| 人人爱人人乐人人操| 9 9无尺码天堂网| 伊人网av| 国产一级做a爰大片免费久久| 亚洲欲| 蜜臀久久久久久999| 99色热国产视频精品| 日本在线999| 少妇同性| 婷婷六月色| 精品性爱一二三区| 为用户提供免费看黄网址在线观看| 久久噜噜噜精品国产亚洲综合| 91色久| 天天看夜夜看日日干| 97色欧洲| 少妇专区一二三四五| 鲁鲁色综合网| 97久久久| 国产精品久久久三级无码| 亚洲激情在线观看一区| 一区二区视频在看| 欧洲亚洲人妻无码久久三区四区| 91爱看| 日本精品88888888| 天天干2019| 婷婷丁香六月| 国产一区在线免费播放| 免费精品中文字幕| 国产无码高清操逼视频| 国产精品盗摄 偷窥盗摄| 美女91在线| 精品无码产区一区二| 俺去久久| 志村玲子视频一区二区| 欧美日韩性爱无码| 国产精品免费视频人成| 天天做日日爱夜夜爽| 一级aaaaa欧美中文字幕录像片| 国产乱伦视频污| 日本二区不卡| 超碰久久精品| 97久久久精品| 四虎在线播放| 9超碰免费| 中文字幕 av v| 激情自拍 校园春色| 婷婷激情五月天小说网| 青娱乐日韩无码| 欧美精品自慰系列寂寞少妇| 亚洲综合中文字幕有码| 国产成人网址| 欧美美女啪啪视频| 96AV精品| 国产综合久久久鬼色| 天天日天天射天天干| 久久超碰亚洲人| 亚洲AV无码天美传媒一区| 久久极品伊人| 97综合在线观看| 男人天堂2019亚洲| 一区麻豆 高清中文字幕| 九九热在线精品视频| 日韩熟妇二区| 老女人爆菊| 人人透人人操| 九九九九九九亚洲| 青青草亚洲一区| 东北操逼| 日韩不卡一二三四| 亚洲精品少妇| 最新亚洲人成网站在线影院| 日本免费中文字幕在线| 国产亚洲精品自在线亚洲情侣| 超碰九色| 欧美亚洲涩涩| 91美女视频直播| 日韩无码AB| 日韩三级av片| 久久夜夜| 巨爆乳一区二区爆乳区| 日本女人操逼| 狠狠操一区二区| 日韩精品资源| 国产乱色国产精品免费视| 蜜桃无码AV一区二区| 欧美成人9797| 天天操熟妇| 欧美日本成人一区二区| 日本在线不卡一二区| 熟妇在线视频一区二区| 人妻黑丝袜电影| 正宗无毛一线天嫩逼| 91精品无码久久久久久久| 久久99午夜精品一区人妻| 欧美性生活综合| 欧日韩在线观看| AV中亚| 日韩人妻有码免费视频| 国内91熟女人妻丝袜天天精品视频在线| 欧美性爱一区| 老司机天天操| 人妻酒店出差被中出免费在线播放| 精品九九九九| 午夜福利久久久噜久噜久久综合| 丰满人妻一区二区三区四区| 大色综合网| 欧美性爱一区| 国产精品人妻免费精品| 啊啊啊操一区| 美女性91| 婷色五月| 欧美色图在线视频少妇| 福利操逼| 欧美夜夜骑视频| 精品国产乱码久久久| 欧洲一级性爱视频在线观看| 亚洲男人天堂2013| 欧美日韩国产三级黄色| 97 国产一区| 黄色大片视频在线免费看| 日韩精品碰碰| 福利在线视频一区二区| 久久精品美女一区| 天天狂操夜夜狂日| 75大香蕉| 看日韩操逼| 欧美日韩亚洲少妇寂寞影院正在播放| 91久久久久久| 成人精品在线免费视频| 97超级欧美| 精品偷拍13p欧美dodk视频| 九九九草| 女色视频社区| 国产美女裸体秘 永久无遮挡| 极品久久久久久久久久久久久久| 韩国午夜理伦三级好看| 蜜臀Av一区二区三区| 亚州情色j区| 天堂69亚洲精品中文字| a人片中文字幕一区二区| 日韩一级片在线看| 色综合一区二区三区| 97视频620| 欧美日韩国内不卡| 精品视频一二三中文| 亚洲av热热色| 国产成人网址| 99re热有精品视频国产| 综合色区偷拍| 91熟女综合| a在线观看| 亚洲AV成人精品网站在AV| 精品一二三区女同 | 蜜臀99久久国产| 欧美 亚洲 大香| 午夜精品探花| 国产日韩欧美中文在线播放| 欧美高清16| 淫骚熟女一区二区三区| 99这里都是精品| 色五天伊人| 亚洲日韩天堂| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 黄页18禁| 成人av免费观看| 操逼大黄片| 亚洲有码视频二区| 日本熟妇自慰性高潮一区二区三区| 久久9久9久99久9久9| 成人乱码一区二区三少妇| 日本阿v天堂在线观看| 欧美色亚洲色| 肉丝无码中文高清| 999 久久久| 欧美激情亚洲色图| 亚洲天堂综合AV| 九九综合久久| 69精品久久久久中文字幕| 热无码中文亚洲H一道本一区二区| 青娱乐黄色录像| 囯产精品强| 蜜桃视频一区二区三区在线观看| 无码免费一区二区三区啪啪| 久久东京国产精品视频| 国产亚洲日韩在线三区黑人| 色av中文字| 99碰碰| 粉嫩不卡一区二区性爱 | 久久鲁夜| 久久九七| 97天天弄| 亚洲性猛| 欧美熟女逼久久久久久| 操淫穴亚洲五月丁香| 99re69综合| 东京成人一区| 做爱福利视频一区二区| 国模不卡一本二本三电影| 97超碰色屌| 在线黄色污污网站| 亚洲日韩东京热一区| 啊啊啊好大好湿| 久9久精品视频| 久色99999| 在线观看 99热| 九99久久| 深喉吞精| 夜夜欢天天干| 97在线免费视频| 一级性爱网| 翔田千里Av在线| 中文字幕一区二区日韩网| 岛国网址国产| 日韩成人电影AV| 超碰人人妻| 动漫片子网站3黄| 欧美A√综合网| 熟女乱伦A| 人妻 欧美亚洲| 九九九九免费高| 久久精品国产96精品亚洲拳交| 欧亚性爱在线视频| 在线无码操| 色婷婷狠狠| 小草精彩毛片| 制服中出中文人人精品| 午夜福利 成人 91| 亚洲国产美女久久久久| 亚洲精品国产无码高清| 男男H黄动漫啪啪无遮挡网站| 丁香五月激情综合| 久久综合日韩亚洲欧美| 欧美色综合图片| 啊啊啊啊好疼| 免费?级毛片无码?∨蜜芽试看| A V视频日本| 丁香六月婷| 久久97资源 网| 亚洲日本天堂| 亚洲无线观看久久| 操逼操逼逼操操逼91| 天天干天天做| 精品美女久久一二三| 97视频在线视频| 综合网亚洲| 免费av大片| 成年男人的天堂| 国产乱不卡| 少妇熟女1区2区3区| 伦理片秋霞免费影院| 蜜桃中文字日产乱幕4区| 婷婷激情五月综合| 国产亚洲女v在线观看| 一区二区日韩欧美久久| 国产外初女出血视频| 97超碰人人模人人拍人人| 免费黄色A片| 久久深夜无码| 欧美色999| 男人的天堂一区三区| 亚洲男人的天堂AV| 97亚洲综合| 自拍鲍鱼一区在线高清观看免费| 男人的天堂VA在线| 日韩啊V| AV综合中文字幕干| 亚洲天天精品| 插穴性爱视频在线观看| 人人污日韩一区二区| 日韩99999| 操婷婷逼| 99在线精品观看视频中文| 思思热久久成人| 久久久性爱视频| 婷婷色色五月天福利| 成人 日韩欧美一区| 大香蕉性欧美| 日韩午夜啪啪视频| 九九九九一区| 久99久视频| 又黄又硬又粗又长国产视频| 久久久久国产精品片区无码直播| s片在线观看| 老熟女乱子伦中文字幕一区二区| 日韩精品人妻中文字幕久久久| 精品免费视频国产一区| 97久精品| 1000部熟女视频在线观看| 天天淫人人妻日日色| 97天天摸天天爽| 爱射综合| 欧美精品69性爱| 久久av网| 亚洲 自拍偷拍 欧美| 一本大道综合伊人精品热热| 亚洲国产成人福利在线观看| 亚洲日韩少妇一道本视频| 日韩人妻播放| 伊人嫩草| 伊人AAA| 东京热一区二区中文字幕| 麻豆2区1区天美| 成人a v在线播放免费| 中 文字幕一区二区三四 五 区日 日 骚| 小说区 图片区色 综合区| 蜜桃在线观看一区二区三区| 国产操逼视频在线观看| 国产欧洲精品亚洲午夜拍精品| 啪啪啪精品视频| 色色97爱| 大香蕉十区| 欧美成人四级在线播放| 亚洲中字慕不卡| 日本免费中文一区二区三区四区| 亚洲阿v天堂在线| 伊人伊人LD| 日韩av乱伦| 人人搞人人插人人操| 国产天美传媒精品| 人妻人人操| 久久精品国产精品一区| 一区二区三区色综合| 久久五月天婷婷| 高清无码久操视频| 男人的天堂三级| 超碰97综合在线| 97免费在线视频在线观看| 97在线视频观看网站| www.人人摸在线视频| 亚洲男人的天堂一区二区| 操高情无码| 97免费在线观看视频| 韩国女主播青草在线| 91粉嫩萝控精品福利网站_精品影音先锋国 | 午夜寂寞欧美| av黄图片在线观看| 熟妇一区,二区,三区。| 后入内射蜜桃臀| 黄片www.| 亚洲激情在线观看一区| 欧美亚洲天天| 婷婷15月天青娱乐| 夜夜夜久久| 日本护士高潮| 99老司机精品视频在线观看| 国产三级片在线观看| 色拍偷亚洲| 色女综合| 99国内精品| 国产热RE99久久6国产精品首| 日本操逼aaaaa| 欧美熟妇精品黑人巨大91| 久久久久国产| 美女淫穴| 中文伊人大香蕉视频| 激情五月天丁香社区| 欧美日韩电影成人在线| 成人国产视频在线观看| 久夜操| 韩国国产欧美情侣视频在线| 自拍盗摄一区| 精品妇女一区二区三区| 大香蕉丝袜一级片| 福利在线黄片| 性爱乱伦网址| 日韩av在线免费网站| 为用户提供免费看黄网址在线观看| 蜜臀久久99精品久久久久| 超碰色大香蕉| 日韩欧美~中文字| 亚洲美女黄色| 亚洲熟久久| 亚州色图欧美| 蜜桃精品视频一区| 伊人国产视频| 色九九九综合| 伊人久久亚洲中文字幕不卡| 加勒比日本在线| laoshunv91| 日本999精品| 操亚州| 色拍偷亚洲| 劲爆欧美人妖三区91| 亚洲国产青青| 日韩干B| 91M一社| 久久精品区| 亚洲综合网91| 国产亚洲在线观看| 香蕉在线一区二区三区| 欧美性爱97超碰| 怡红院怡春院| 人人超碰在线观看黄| 日韩78m视频| 射丝袜大香蕉| 国产视频97| 国产老女人久久毛| 免费久久一级毛片大黄| 韩日性爱av| 美女黄频a美女大全免费皮| 操逼操操操91| 亚殴在线| 一区二区视频你懂的| 玖玖爱伊人玖玖爱| 大鸡巴久久| 9色国产精品一区粉嫩| 国产一区二区在线播放量| 中文字幕亚洲永久精品| 精品一区二区成人动漫| 亚洲色人妻综合| av一区二区三区四区五区久草臀| 骚逼自拍99| 草草草草视频| 岛国免费黄色网址| 色情五月丁香| 日本中文字幕高跟| 大香蕉日亚洲日本亚大| 久久久96| 黑人嘿嘿嘿超爽免费视频| 日韩精品一二三四| 精品人妻一区春色| 精品对白久久不卡| 在线免费观看日韩一区| 五月婷婷大香蕉| 三级网站超变态精品| 天天综合网~91| 免费少妇一区二区| 狠狠狠狠狠| 香蕉色网| 亚洲影院365| 无码国产精品午夜不卡(| 精品久久久久黄少妇| 中文字幕一二三av| 1级午夜影院费免区| 亚洲九区| 偷拍色图| 欧美人人操人人插| 亚洲另类在线观看| 骚人妻少妇视频| 在线视频 亚洲精品| 欧美成va视频网站| 91 综合 色| 日韩成人性日韩成人性爱视频在线免费观看 | 色婷婷丁香五月| 日本精品久久久久久久| 日本人妻最新在线中| 日韩精品一区二区三区色欲 | 日韩精品人妻一| 久久久久久久久久久人妻| 国产极品一区二区三区三州| 色五91| 大香蕉99re| 精品一区二区综合熟妇| 东北女人的毛片| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 天天操夜夜操| 久久精品综合| 波多野结衣先锋影音| 综合激情97 | 中文字幕 国产 精品| 精品久久大胆人体| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 天堂av最新电影网| 在线欧美69V免费观看视频| 中文字幕版| 精品国产一区探花在线观看| 欧美黑人XXXⅩ高潮交| 色吊丝 日日骚 清纯唯美| 在线性黄高清免费视频| 日韩人妻丝袜美腿中文| 成人精品一区二区91毛片不卡| 日本精品人妻少妇一区二区| 亚洲图片欧美色图| 日本天天吊| 97这里只有精品| 色av中文字| 国产捆绑一区| 日韩二级| 人人贴人人摸| 日本欧美色| 国产精品成人无码a v毛片| 九九热视频这里只有精品| 欧美区亚洲区偷拍区| 人妻大相焦在线| 欧洲亚洲国产综合在线| 在线黄色污污网站| 亚洲AV秘 精品久久老牛影视| 欧美熟女丝袜| 91精品伊人久久久大香线蕉91 | 大香蕉九九| 欧在线一二区| 夜夜高潮夜夜爽高清视频一| 老子午夜伦不卡影院| 蜜桃久久精品一区二区三区| 性久久| 五月天AV资源| 国产精品交换一区二区| 91综合色噜噜| 啊啊啊啊操死我了| 被体育老师抱着c到高潮| 亚洲美女高潮喷水视频| 3571色综合一区二区二区| 国产操逼网站亚洲一级黄色| 熟妇一区二区三区| 久久激情亚洲精品无码?V| 色偷偷2020免费视频播放| 黑丝少妇| 欧美偷拍区| 超碰 国产熟女精品一区| 99综合免费视频| 欧美成人性爱视频在线播放| 久久久久久久六六| 超碰99在线观看| 亚洲āv网址在线观看| 91男同| 色五月婷婷麻豆在| 免费一级a毛片久久久久久鸭绿欲| 久久久久久久久国产| 91国产精品在线看| 人人操人人干网页| 欧美 亚洲| 伊人玖玖网| 99精品热| av在线不卡一区二区三区| 亚洲中文字幕av | 一二三区精品视频| www.91欧美| 亚洲 日韩 欧美 国产综合体| 亚洲欧洲中文日韩女优乱码| 亚洲激情欧美色图 | 91站街按摩店老熟女熟女| 男插女青青影院| 久久大香蕉97| 国产久久一区二区| 青青青操| 婷婷五月天av| 亚洲第2页| 国产精品不卡高清在线观看| 四虎影视 亚洲无码| 色五月69夫妻| 亚洲人人操| 围产精品一区二区三区视频播放| 黄色大片视频在线免费看| 爱丝福利| 老司机午夜福利视频一区二区| 久久久久13| 99久久精品国产高潮| 秋霞成人一级在线观看| a级免费在线观看| 欧美 亚洲精品首页| 肉丝无码中文高清| 亚洲综合图色在线| 国产视频一区二区在线观看| 97人人射| 717影院理论午夜伦八戒| 伊人久久大香线蕉无码| 亚洲欧洲中文日韩女优乱码| 国产深夜福利| 美女91| 天美传媒麻豆一区二区三区国产精| 亚洲人妖网| 久久久穴999| 久久人人爽爽爽人久久久| 亚洲欧美激情另类色图| 在线只有精品| 激情小说五月天| 凹凸视频特色日本特黄| 日韩av不卡在线观看| 免费作爱一级视频| 草莓精品视频在线免费观看| 1769一区| 午夜福利国产欧美日韩夜夜| 国产真实子伦对白| 国产精品美女视频诱惑| 精品九九| 精品人妻中文字幕高清| 超碰免费97| 蜜臀一区二区三区在线| 97亚洲综合影院| 夜草网站| 成人性爱AV在线免费观看| 免费αV在线视频| 在线岛国新天堂8| 无遮挡一级毛片视频免费的| 黑人美精品 A片| 久操com| 婷婷激情五月天小说网| 欧美日韩国产色图在线| 无码国产精品96久久久久孕妇| 欧美性生活综合| 国产女人视频三四五区| 九九九九9999| 亚洲婷婷综合网| AA级电影三区| 中日韩久久久| 麻豆国产免费影片| 九九九九久久久| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日韩综合无码一区久久92| 91大神精品长腿在线观看网站| 亚洲AV无码乱码| 99re公开精品免费视频| 亚洲一区二区中文字幕| 1024日韩| 中文一区二区婷婷视频| 97国产色图 | 91精品丝袜在线观看| 激情第四色| 丝袜狠狠草尤物人妻av91| 亚洲中文电影| 亚洲色天堂九9| 超碰97网站| 人人看人人插| 精品一二三区久久AAA片| 久久乐| 天天弄欧美| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲综合九九| 操逼片国产| 大香交伊人网| 蜜桃色院一区久久 | 在线观看AV不卡| 日本久久综合| 久久αⅴ| 欧美大香蕉同搞| 激情自拍 校园春色| 97 九色| 一区二区三区高清 | 97超碰伊人| 欧美十八禁视频| 色5月婷婷| 国产熟女二区| 国产白丝av| 国模少妇一区二区三区| 密臀在线免费观看| 久久九九97| 乱伦av麻豆| 亚洲国产剧情少妇激情| 伊人欧美大香蕉视频| 国产又色又粗又黄又爽| 99热精品在线在线| 精品视频久久区| 强被迫伦姧在线观看无码网站| 日韩AV熟女乱伦| 99精品伊人| 亚洲成人激情小说视频| 97色婷| 加勒比色综合| 欧美一区二区三区四区综合| 啊啊啊好爽快点啊啊啊嗯嗯| 久久久久久裸体| 91精品久久久| 精品v1区| 亚洲AV无码乱码| 开心五月激情网| 国产精品动态一区二区三区四四| 亚洲av综合伊人久久| 日本三级久| 国产精品久久久亚洲第一牛牛_在线观看| 色综合天天| 久久六六| 日本人体九九九九九九| 中文字幕一区二区三区人妻不卡| 久久亚洲AV成人精品无码| 日日夜夜青青草母狗| 日韩av性爱在线播放| 99青草| 中文字幕制服诱惑| 深爱激情五月天| 亚洲 欧美 日本 国内 首页| 亚洲九月丁香| 美女网站黄页| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 日本最新免费韩国1区2区视频播放| 亚洲欧美综合| 久久精品人体| 91色色网站| 日本一二区免费| 国产在线综合网| 欧美性战999| 亚洲本色精品一区二区久久| 人人喜人人妻| 91精品国产91久久青草| 久久久久久久久久久97| 97精品久久| 国产精品久久久视频| 国产成年女黄特黄| 亚洲精品欧美专业| 亚洲精品尤物yw在线影院| 亚洲区限制级| 黑人无码一区二区| 偷拍亚洲视频一区二区三区四区| 久久精品性| 午夜一区| 人妻天天爽夜夜爽精品2| 精品日韩人妻精品一二三区| 99蜜桃臀亚洲成人在线观看| 日韩中文字幕人妻视频| 青青草女人天天干| 色五月激情综合网| 久久久久国产精品久久久| 歐美一級亂黃99在綫精品| 吖在线不卡一区二区国产剧情| 国产一区二区三区,在线观看观看| 亚洲成人日韩小说| 欧美少妇高潮视频| 久操99| 岛国黄| 青青五月天| 国产久久视频| 强奸乱伦大香蕉网| 麻豆成人影音在线| 又黄又粗又硬又长又大| 亚欧Av| 日本色日夜干| 青青草大香蕉在线视频| 欧美日韩中文亚洲v在线综合| 欧美色网络| 亚州人妻| 九九精品热| 天天谢天天干| 久久久涩| 久久久中文版| 无码伊人久久大杳蕉中文无码| 性夜影院爽黄A爽免费动漫| 欧美一级专区免费大片| 青青草中文-久久青草精品一区二区三| 久久永久无码人妻视频| 蜜臀av中文字幕| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 国产欧美第五页| 亚洲无码太久| 欧美激情高清性猛交| 超碰中文字幕人妻草一区| 国产亚洲99久久精品| 国产精品女生av| 天天亚洲| 97久久国产亚洲精品超碰热| 天天干天天操天天拍| 在线v中文字幕一区二区三区| 日产操逼| 久久久精精精| 午夜精品久久久99热蜜桃的功能特点| 操九九九九九九| 99久久婷婷国产综合| 国产精品一区二区校花| 九九碰九九爱97超| www.acm成人黄色毛片| 91国产大片| 久操黄色视频| 丁香五月天堂| 日本人人操人人操| 亚洲天堂五月天国产| 78超碰| 精品一区二区2| 色男人色天堂东京热| 欧美18禁91| 久久久久久久久久久六六| 丁香五月激情综合国产| 精品人体无圣光凹凸| 中国操逼无码| 日韩欧美日韩| 97伊人网| 欧美草草高清日韩视频| 亚洲麻豆18发?| 老熟妇一区二区三区啪啪| 欧美美女在线高潮999| 熟女啪啪视频| 插入综合网| 青娱乐 成人娱乐在线| 激情文学小说一区二区| 亚洲人91| 青青草五月天| 欧美熟妇精品黑人巨大一二三区| 嗯嗯啊啊视频在线看| 99精品网| 涩五月婷婷| 久久久com| 99热在线播放| 婷婷五月天丁香| 色激情五月天| 99这里只有精品| 尹人大香蕉视频在线| 人妻熟女午夜精品在线| AV中文在线可看| 亚洲一区深夜| 亚洲欲色9532548967一区| 极品五月天噜噜| 99久久无色码| 亚洲宗合电影| 蜜臀AV成人精品蜜臀| 中文一区在线日| 亚洲欧美日韩中文久久自慰| 香蕉色网| 欧美少妇高潮视频| 久久久91| 国产区日韩区在线观看| 亚洲 中文字幕 精品| 人妻啪| 国产AV激情无码久久无码 | 人妻天天爽夜夜爽精品2| 欧美日韩电影一区二区| 日韩精品电影| 素人伊尹大香蕉免费下载视频| 理论久久婷婷网8|