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

ARTICLE DETAIL

資訊詳情

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

嵌入式Linux驅(qū)動(dòng)開發(fā):軟硬件邊界、中斷并發(fā)與DMA避坑指南

嵌入式Linux驅(qū)動(dòng)開發(fā):軟硬件邊界、中斷并發(fā)與DMA避坑指南 做嵌入式開發(fā)這些年我見過太多從單片機(jī)裸機(jī)編程轉(zhuǎn)過來的人第一反應(yīng)都是驅(qū)動(dòng)開發(fā)不就是照著芯片手冊(cè)配置寄存器嘛。直到第一次碰上內(nèi)核崩潰、第一次被中斷上下文搞到懷疑人生、第一次發(fā)現(xiàn)DMA拿到的數(shù)據(jù)是舊的才明白這行真正的門檻在哪里。這篇文章想借著我這些年寫驅(qū)動(dòng)、調(diào)驅(qū)動(dòng)的經(jīng)歷聊聊嵌入式驅(qū)動(dòng)開發(fā)里那些真正值錢的經(jīng)驗(yàn)——不是某顆芯片的寄存器表而是處理軟硬件邊界問題的方法論以及那些常規(guī)文檔里根本不會(huì)寫的坑。內(nèi)容主要面向兩類人一是剛?cè)腴TLinux驅(qū)動(dòng)、想系統(tǒng)建立認(rèn)知的開發(fā)者二是已經(jīng)寫過一些驅(qū)動(dòng)但總覺得能跑就行、一查就廢的工程師。文章不會(huì)逐行帶讀內(nèi)核源碼而是把驅(qū)動(dòng)開發(fā)拆成邊界認(rèn)知、代碼分層、并發(fā)處理、調(diào)試手段、面試進(jìn)階五個(gè)板塊每一塊都是我在實(shí)際項(xiàng)目里反復(fù)踩過、最后沉淀下來的東西。1. 驅(qū)動(dòng)開發(fā)真正的門檻不是查寄存器而是理解軟硬件邊界1.1 一份驅(qū)動(dòng)其實(shí)是在維護(hù)三方契約很多人對(duì)驅(qū)動(dòng)的理解是操作硬件的那段代碼這個(gè)說法沒錯(cuò)但它把問題想簡(jiǎn)單了。驅(qū)動(dòng)真正做的事情是在硬件廠商、內(nèi)核框架、上層應(yīng)用這三方之間維護(hù)一份隱形的契約。硬件廠商給你的是數(shù)據(jù)手冊(cè)和寄存器表它關(guān)心的是時(shí)序、電平、地址、DMA通道這些物理層面的約束。內(nèi)核框架給你的是platform_driver、file_operations、中斷注冊(cè)這些標(biāo)準(zhǔn)接口它關(guān)心的是進(jìn)程調(diào)度、內(nèi)存管理、并發(fā)安全這些軟件層面的規(guī)則。上層應(yīng)用則只會(huì)調(diào)用open、read、ioctl它根本不關(guān)心你底層是I2C還是SPI。驅(qū)動(dòng)工程師就是那個(gè)夾在中間傳話的人。你得懂硬件的脾氣比如某顆傳感器在片選拉低之后必須等至少10微秒才能讀數(shù)據(jù)否則返回全零你也得懂內(nèi)核的規(guī)矩比如中斷上下文里不能用會(huì)睡眠的函數(shù)否則整個(gè)系統(tǒng)都可能僵住。我見過不少?gòu)穆銠C(jī)轉(zhuǎn)過來的同事他們最擅長(zhǎng)的就是對(duì)著數(shù)據(jù)手冊(cè)一個(gè)寄存器一個(gè)寄存器地配驅(qū)動(dòng)也很快能跑起來。但一旦遇到跑幾天偶發(fā)死機(jī)數(shù)據(jù)偶爾錯(cuò)一幀換一顆主控就啟動(dòng)不了這種問題就完全抓瞎了。原因很簡(jiǎn)單裸機(jī)開發(fā)面對(duì)的是單一執(zhí)行流所有事情都是你說了算而Linux驅(qū)動(dòng)面對(duì)的是多進(jìn)程、多中斷、多核并發(fā)你在寄存器和內(nèi)核接口之間填的每一行代碼都是在跟一個(gè)巨大的并發(fā)系統(tǒng)打交道。1.2 為什么照著例程改的路子走不遠(yuǎn)嵌入式圈子里最普遍的學(xué)習(xí)方式是找一塊開發(fā)板、抄一份廠家例程、改幾個(gè)引腳配置然后就覺得自己會(huì)了。我對(duì)這種路徑本身沒有意見——快速建立正反饋很重要。但如果你想靠這行走得遠(yuǎn)就一定要意識(shí)到例程能給你的是能跑的最小路徑它不會(huì)告訴你為什么必須這么寫。舉一個(gè)最常見的例子。很多人在注冊(cè)字符設(shè)備時(shí)會(huì)照著例程用register_chrdev注冊(cè)一個(gè)設(shè)備號(hào)再用class_create和device_create在/dev下生成節(jié)點(diǎn)。這套流程本身沒錯(cuò)但如果你不理解主設(shè)備號(hào)和次設(shè)備號(hào)的分配機(jī)制不理解miscdevice和真正的字符設(shè)備驅(qū)動(dòng)模型之間有什么區(qū)別那后面遇到設(shè)備號(hào)沖突動(dòng)態(tài)分配設(shè)備號(hào)后udev不生成節(jié)點(diǎn)設(shè)備樹里reg屬性怎么對(duì)應(yīng)這些問題時(shí)你只能繼續(xù)去網(wǎng)上搜別人的代碼而不是自己判斷。驅(qū)動(dòng)開發(fā)里最關(guān)鍵的三種能力——時(shí)序判斷、并發(fā)分析、問題定位——都是例程給不了你的。例程是在理想條件下、由芯片原廠工程師調(diào)試好的路徑它默認(rèn)你會(huì)正確使用也默認(rèn)你背后有全套調(diào)試工具。等你到了真實(shí)的項(xiàng)目里硬件可能有改版、晶振可能有偏差、外設(shè)可能有errata勘誤表這時(shí)候照抄例程就是在給自己埋雷。1.3 軟硬件邊界到底指什么我總結(jié)下來驅(qū)動(dòng)工程師日常打交道的軟硬件邊界無外乎四類。一是時(shí)序約束。任何外設(shè)都有時(shí)序要求比如I2C的建立時(shí)間、保持時(shí)間SPI的時(shí)鐘極性和相位Flash的頁(yè)編程時(shí)間。驅(qū)動(dòng)里那些看似莫名其妙的udelay、ndelay背后全是硬件的物理約束。這個(gè)邊界如果踩了癥狀通常很詭異——十次讀有八次對(duì)兩次錯(cuò)用示波器才能抓得到。二是并發(fā)約束。硬件中斷和進(jìn)程上下文會(huì)同時(shí)訪問你的驅(qū)動(dòng)數(shù)據(jù)多核CPU上兩個(gè)核同時(shí)執(zhí)行你的驅(qū)動(dòng)代碼這在裸機(jī)時(shí)代根本不會(huì)發(fā)生。驅(qū)動(dòng)里上半部分處理中斷、下半部分處理數(shù)據(jù)、進(jìn)程需要訪問狀態(tài)這些路徑之間怎么互斥是邊界問題的重災(zāi)區(qū)。三是資源邊界。你操作的內(nèi)存必須是DMA可達(dá)的你映射的寄存器必須在ioport或iomem范圍內(nèi)你申請(qǐng)的中斷號(hào)必須和硬件實(shí)際觸發(fā)的中斷線對(duì)應(yīng)。這些資源看似是配置一下就行實(shí)際背后連著IOMMU、內(nèi)存管理、中斷控制器一整條鏈路。四是接口契約。file_operations里的函數(shù)簽名、ioctl的命令編碼規(guī)則、驅(qū)動(dòng)的probe/remove流程這些是內(nèi)核和驅(qū)動(dòng)之間的契約。違反契約的代碼通常不會(huì)立刻崩而是在某個(gè)特定條件下以最難查的方式崩給你看。把驅(qū)動(dòng)開發(fā)當(dāng)成軟硬件邊界的翻譯工作很多疑惑就能想通了。那些為什么驅(qū)動(dòng)要這么寫的問題答案往往不在代碼里而在某一側(cè)的約束里。2. 從點(diǎn)燈到平臺(tái)驅(qū)動(dòng)我一直在用的驅(qū)動(dòng)代碼分層方法2.1 分層不是炫技是被現(xiàn)實(shí)逼出來的我剛寫驅(qū)動(dòng)的時(shí)候習(xí)慣一個(gè)文件搞定一切寄存器操作、中斷處理、ioctl、sysfs屬性全部堆在一起。剛開始覺得挺爽代碼量看起來很大好像很有成就感。直到項(xiàng)目做到第二個(gè)版本需求變了三次我才發(fā)現(xiàn)這種寫法有多坑。第一次坑是換內(nèi)核版本。廠商給的BSP從內(nèi)核4.9升到5.10file_operations里的一些接口變了、設(shè)備樹解析函數(shù)改名了我那個(gè)大雜燴驅(qū)動(dòng)里到處都用了舊接口改起來牽一發(fā)動(dòng)全身。第二次坑是換硬件平臺(tái)。項(xiàng)目從A芯片切到B芯片雖然外設(shè)接口差不多但寄存器完全兩碼事而我的業(yè)務(wù)邏輯代碼和寄存器操作纏在一起根本拆不開。第三次坑是測(cè)試。我想給驅(qū)動(dòng)的業(yè)務(wù)邏輯寫單元測(cè)試結(jié)果發(fā)現(xiàn)邏輯和硬件操作綁得死死的在PC上根本跑不起來。后來我痛定思痛參考了內(nèi)核自己推薦的驅(qū)動(dòng)架構(gòu)、也參考了一些老牌驅(qū)動(dòng)的寫法總結(jié)出一套適合絕大多數(shù)外設(shè)驅(qū)動(dòng)的三層結(jié)構(gòu)。它不是內(nèi)核強(qiáng)制要求的但按這個(gè)思路寫的驅(qū)動(dòng)后期維護(hù)成本能低一半以上。2.2 一套能落地的三層結(jié)構(gòu)我的分層思路很簡(jiǎn)單硬件操作往死里收斂業(yè)務(wù)邏輯往外分離中間留一個(gè)穩(wěn)定的接口面。第一層叫硬件抽象層也叫寄存器層。這一層只做一件事——直接操作硬件向上提供hw_init、hw_read_reg、hw_write_reg、hw_start等函數(shù)。每個(gè)函數(shù)內(nèi)部就是讀寄存器、寫寄存器、ufudelay不許有任何業(yè)務(wù)判斷。換平臺(tái)的時(shí)候改這一層就完了。第二層叫驅(qū)動(dòng)核心層。這一層實(shí)現(xiàn)內(nèi)核框架要求的那一堆東西platform_driver的probe/remove、file_operations里的read/write/ioctl、中斷處理、等待隊(duì)列、鎖。它負(fù)責(zé)把內(nèi)核的規(guī)矩和第一層的物理操作接在一起但這里不應(yīng)該出現(xiàn)具體業(yè)務(wù)邏輯。第三層叫業(yè)務(wù)策略層。這一層處理這個(gè)設(shè)備到底是干什么用的比如一個(gè)溫濕度傳感器驅(qū)動(dòng)業(yè)務(wù)層決定數(shù)據(jù)是每10秒采一次還是每1秒采一次、數(shù)據(jù)超閾值時(shí)上報(bào)還是直接丟棄。你可以通過ioctl、sysfs或者輸入子系統(tǒng)把這一層的能力暴露給用戶態(tài)。舉個(gè)例子同樣是做一個(gè)GPIO按鍵驅(qū)動(dòng)如果按三層結(jié)構(gòu)來寫硬件層只負(fù)責(zé)gpio_request、gpio_direction_input、gpio_get_value這幾個(gè)操作核心層負(fù)責(zé)把按鍵這個(gè)輸入設(shè)備注冊(cè)成input子系統(tǒng)設(shè)備維護(hù)消抖定時(shí)器和等待隊(duì)列業(yè)務(wù)層則決定長(zhǎng)按3秒是關(guān)機(jī)指令還是恢復(fù)出廠設(shè)置這類策略。這么一分你就能非常清楚地知道改按鍵閾值是改業(yè)務(wù)層換GPIO引腳是改硬件層調(diào)整上報(bào)機(jī)制是改核心層。互不牽連。2.3 用平臺(tái)驅(qū)動(dòng)模型和設(shè)備樹串起來說完分層還要說說驅(qū)動(dòng)怎么和設(shè)備綁定?,F(xiàn)代Linux內(nèi)核里絕大多數(shù)設(shè)備驅(qū)動(dòng)都采用平臺(tái)設(shè)備模型platform bus配合設(shè)備樹來工作。簡(jiǎn)單解釋一下設(shè)備樹相當(dāng)于一份給內(nèi)核看的硬件資產(chǎn)清單它描述的是板子上有哪些設(shè)備、各設(shè)備掛在哪個(gè)總線、用哪組寄存器地址、哪個(gè)中斷、哪個(gè)GPIO、哪個(gè)時(shí)鐘。驅(qū)動(dòng)則是通過compatible字符串來聲明我支持哪些設(shè)備內(nèi)核啟動(dòng)時(shí)拿設(shè)備樹里的節(jié)點(diǎn)去匹配驅(qū)動(dòng)的compatible匹配上了就調(diào)用你的probe。這里有一個(gè)經(jīng)常被忽略的細(xì)節(jié)compatible字符串必須和設(shè)備樹里的完全一致包括大小寫和逗號(hào)后綴。我曾經(jīng)在一個(gè)項(xiàng)目里設(shè)備樹里寫的是ti,ads1015驅(qū)動(dòng)的of_match_table里寫的是ads1015結(jié)果驅(qū)動(dòng)死活不probe排查了大半天才在dts里發(fā)現(xiàn)少了個(gè)前綴。這種錯(cuò)誤不會(huì)報(bào)編譯錯(cuò)誤只會(huì)表現(xiàn)為設(shè)備不工作非??印R粋€(gè)標(biāo)準(zhǔn)的platform_driver骨架大致長(zhǎng)這樣static const struct of_device_id mydev_of_match[] { { .compatible vendor,mydev, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, mydev_of_match); static int mydev_probe(struct platform_device *pdev) { struct resource *res; void __iomem *base; res platform_get_resource(pdev, IORESOURCE_MEM, 0); base devm_ioremap_resource(pdev-dev, res); if (IS_ERR(base)) return PTR_ERR(base); /* 初始化硬件層、注冊(cè)字符設(shè)備、申請(qǐng)中斷等 */ return 0; } static int mydev_remove(struct platform_device *pdev) { /* 釋放資源、注銷設(shè)備 */ return 0; } static struct platform_driver mydev_driver { .probe mydev_probe, .remove mydev_remove, .driver { .name mydev, .of_match_table mydev_of_match, }, }; module_platform_driver(mydev_driver);注意我用了devm開頭的資源管理函數(shù)。這也是個(gè)經(jīng)驗(yàn)之談能用devm_xxx就用devm_xxx它在probe失敗或remove的時(shí)候會(huì)自動(dòng)幫你釋放資源省掉無數(shù)手動(dòng)清理的麻煩。我見過太多人手動(dòng)iounmap、kfree、unregister結(jié)果在某個(gè)error path上漏了一個(gè)釋放卸載模塊的時(shí)候直接內(nèi)核崩潰。2.4 一個(gè)非阻塞按鍵驅(qū)動(dòng)的分層示例既然熱搜詞里有人專門搜嵌入式按鍵非阻塞掃描我就拿一個(gè)真實(shí)的按鍵驅(qū)動(dòng)設(shè)計(jì)說一下分層的好處。裸機(jī)時(shí)代做按鍵無非就是輪詢GPIO讀到電平變化就認(rèn)為是鍵按下再延時(shí)消抖。但在Linux驅(qū)動(dòng)里輪詢是最不推薦的方式——它浪費(fèi)CPU還會(huì)拖慢系統(tǒng)的實(shí)時(shí)響應(yīng)。正確的做法是GPIO配置成中斷觸發(fā)中斷到來之后調(diào)度一個(gè)定時(shí)器做消抖消抖確認(rèn)后在進(jìn)程上下文里讀取鍵值再通過輸入子系統(tǒng)上報(bào)給用戶空間。這里面的分層邏輯是這樣的硬件層提供key_gpio_init、key_gpio_read、key_gpio_irq_request全部是對(duì)GPIO子系統(tǒng)的封裝核心層注冊(cè)中斷處理函數(shù)中斷里只做兩件事——禁用當(dāng)前觸發(fā)、啟動(dòng)消抖定時(shí)器然后立即返回。定時(shí)器回調(diào)函數(shù)在軟中斷上下文執(zhí)行里面讀GPIO、確認(rèn)狀態(tài)、調(diào)用input_event上報(bào)業(yè)務(wù)層通過設(shè)備樹屬性或者ioctl配置長(zhǎng)按多久算快捷操作雙鍵組合是什么意思。非阻塞的思想貫穿始終中斷處理函數(shù)不睡眠、定時(shí)器回調(diào)不睡眠、沒有任何一個(gè)路徑會(huì)占著CPU輪詢。整個(gè)驅(qū)動(dòng)的CPU開銷趨近于零按鍵響應(yīng)卻非常即時(shí)。這個(gè)結(jié)構(gòu)如果放在大雜燴寫法里很容易演變成中斷里直接做消抖延時(shí)然后在中斷上下文里睡眠最后被殺進(jìn)程或者內(nèi)核報(bào)BUG。3. 最容易翻車的四個(gè)技術(shù)點(diǎn)中斷、并發(fā)、阻塞與DMA3.1 中斷上下文哪些函數(shù)碰都不能碰驅(qū)動(dòng)開發(fā)里翻車率最高的點(diǎn)就是中斷上下文。很多從裸機(jī)轉(zhuǎn)過來的人覺得中斷來了我就處理處理完就返回這有什么難的。但在Linux里中斷處理函數(shù)運(yùn)行在特殊上下文它不能睡眠、不能被調(diào)度所以凡是可能阻塞的函數(shù)都不能調(diào)用。具體來說下面這些操作在中斷上下文里都是雷區(qū)調(diào)用kmalloc(GFP_KERNEL)——這個(gè)標(biāo)志允許睡眠必須改成GFP_ATOMIC調(diào)用mutex_lock——mutex在競(jìng)爭(zhēng)時(shí)會(huì)睡眠必須改用自旋鎖調(diào)用copy_from_user/copy_to_user——這兩個(gè)函數(shù)可能訪問用戶頁(yè)表并觸發(fā)缺頁(yè)可能睡眠調(diào)用某些可能在內(nèi)部睡眠的標(biāo)準(zhǔn)API比如msleep、wait_event想都不要想。我剛?cè)腴T時(shí)有過一次血淚教訓(xùn)在一個(gè)GPIO中斷里直接調(diào)用i2c_transfer去讀外設(shè)寄存器當(dāng)時(shí)想的是反正快得很。確實(shí)大部分時(shí)候很快但I(xiàn)2C總線在極端情況下會(huì)被別的設(shè)備占用或者重試i2c_transfer一旦進(jìn)入等待我的中斷就睡在那了。內(nèi)核在那個(gè)上下文里調(diào)用睡眠函數(shù)輕則lockdep報(bào)BUG: sleeping function called from invalid context重則直接死機(jī)。后來我把那部分邏輯改成了工作隊(duì)列在進(jìn)程上下文里跑I2C訪問問題徹底消失?,F(xiàn)在內(nèi)核里解決這類問題的主流做法是中斷線程化request_threaded_irq配合thread_fn把中斷處理的主體放到一個(gè)內(nèi)核線程里這個(gè)線程可以被調(diào)度、可以睡眠安全性高得多。我的建議是中斷回調(diào)里只做最快的硬件響應(yīng)比如清除中斷標(biāo)志、讀取FIFO里的數(shù)據(jù)、置一個(gè)標(biāo)志位其余一切交給中斷下半部tasklet、工作隊(duì)列或線程化中斷去處理。3.2 鎖的選擇自旋鎖、信號(hào)量還是mutex并發(fā)問題是驅(qū)動(dòng)開發(fā)和裸機(jī)開發(fā)最大的分水嶺。多核時(shí)代同一個(gè)驅(qū)動(dòng)代碼可能同時(shí)在兩個(gè)CPU上運(yùn)行就算只有一個(gè)核中斷也可能打斷進(jìn)程的執(zhí)行流。如果你不保護(hù)共享數(shù)據(jù)最后的表現(xiàn)就是偶發(fā)錯(cuò)亂極難復(fù)現(xiàn)。內(nèi)核里可用的鎖很多但真正需要你決策的其實(shí)就是三種自旋鎖、互斥鎖mutex、讀寫鎖。選擇邏輯其實(shí)很簡(jiǎn)單就兩條如果你的臨界區(qū)很短幾十條指令且這個(gè)臨界區(qū)可能在中斷上下文或原子上下文里執(zhí)行那就只能用自旋鎖。自旋鎖的語義是原地打轉(zhuǎn)等待不會(huì)睡眠但代價(jià)是忙等所以臨界區(qū)里絕對(duì)不能有耗時(shí)操作。如果臨界區(qū)在進(jìn)程上下文并且可能會(huì)執(zhí)行耗時(shí)操作比如I2C通信、大量的數(shù)據(jù)拷貝那就應(yīng)該用mutex。它的語義是拿不到鎖就睡一覺等鎖可用再醒不浪費(fèi)CPU但可能在睡眠中被信號(hào)打斷需要處理返回值。在我的經(jīng)驗(yàn)里大部分驅(qū)動(dòng)數(shù)據(jù)可以拆成兩種一種是很小的狀態(tài)變量和標(biāo)志位用原子操作或者自旋鎖保護(hù)就夠了另一種是描述設(shè)備狀態(tài)的大結(jié)構(gòu)體用mutex保護(hù)。千萬不要迷信全用自旋鎖——曾經(jīng)有人在中斷里調(diào)用一個(gè)用自旋鎖保護(hù)的、內(nèi)部帶msleep的函數(shù)當(dāng)場(chǎng)panic。還要特別提一下鎖的順序。如果你的驅(qū)動(dòng)里有兩把鎖并且代碼路徑A先拿鎖1再拿鎖2路徑B先拿鎖2再拿鎖1那么恭喜你死鎖向你招手了。內(nèi)核的lockdep機(jī)制就是為了抓這個(gè)問題設(shè)計(jì)的它會(huì)跟蹤鎖獲取順序一旦發(fā)現(xiàn)潛在死鎖就報(bào)警。所以我的建議是測(cè)試階段一定打開CONFIG_PROVE_LOCKINGlockdep報(bào)的任何警告都不要無視它不是在跟你開玩笑。3.3 阻塞與非阻塞IO等待隊(duì)列是核心用戶態(tài)的read、write阻塞不阻塞取決于驅(qū)動(dòng)的file_operations怎么實(shí)現(xiàn)。驅(qū)動(dòng)里實(shí)現(xiàn)阻塞語義的核心機(jī)制叫等待隊(duì)列wait queue。它的思路是當(dāng)沒有數(shù)據(jù)可讀時(shí)進(jìn)程把自己掛到等待隊(duì)列上主動(dòng)讓出CPU硬件數(shù)據(jù)來了之后中斷處理函數(shù)里把等待隊(duì)列上的人喚醒。這套機(jī)制里最常見的坑是喚醒丟失。比如進(jìn)程剛檢查完沒有數(shù)據(jù)準(zhǔn)備睡眠這時(shí)候中斷來了數(shù)據(jù)到貨喚醒被觸發(fā)——但此時(shí)進(jìn)程還沒真正睡下去于是喚醒就丟了進(jìn)程一直睡到天荒地老。內(nèi)核的機(jī)制幫你處理了這個(gè)問題wait_event_interruptible宏會(huì)保證檢查和睡眠之間不被打斷這也是為什么內(nèi)核一直推薦用標(biāo)準(zhǔn)宏而不是自己判斷加sleep。另一個(gè)常見問題是偽喚醒。等待隊(duì)列可能被信號(hào)喚醒、被spurious wakeup虛假喚醒喚醒所以被喚醒之后必須重新檢查條件是否為真再?zèng)Q定繼續(xù)睡還是真起來干活。這也是wait_event宏內(nèi)部做條件循環(huán)的原因——條件不滿足就重新睡。非阻塞IO則要實(shí)現(xiàn)poll接口。你需要在poll函數(shù)里調(diào)用poll_wait把當(dāng)前進(jìn)程加到設(shè)備的等待隊(duì)列上同時(shí)返回當(dāng)前可讀寫的掩碼。用戶態(tài)用select/poll/epoll時(shí)內(nèi)核會(huì)調(diào)用你的poll函數(shù)來查詢狀態(tài)。很多新手driver只做poll_wait卻不返回掩碼結(jié)果select永遠(yuǎn)說沒有事件這是典型的能編過、在跑、全錯(cuò)的問題。3.4 DMA與緩存一致性的坑只要你的驅(qū)動(dòng)涉及大塊數(shù)據(jù)傳輸就一定要碰DMA。DMA的坑不在DMA本身而在CPU cache。CPU讀寫數(shù)據(jù)時(shí)會(huì)經(jīng)過cache而DMA引擎直接讀寫物理內(nèi)存兩者看到的數(shù)據(jù)可能不一致——CPU改了數(shù)據(jù)但還沒刷回內(nèi)存DMA讀走的還是舊數(shù)據(jù)或者DMA寫入了新數(shù)據(jù)但CPU的cache里還留著舊值。內(nèi)核針對(duì)DMA提供了完善的API但你必須正確選擇使用方式使用dma_alloc_coherent分配一塊一致性DMA緩沖區(qū)。它保證cache和內(nèi)存始終同步適合控制結(jié)構(gòu)、描述符表這類CPU和DMA頻繁共享訪問的數(shù)據(jù)。代價(jià)是分配和訪問它的效率偏低因?yàn)槊看蜟PU訪問都可能觸發(fā)cache操作。使用dma_map_single/dma_unmap_single做流式映射streaming mapping。適合大塊數(shù)據(jù)的一次性傳輸通過dma_sync_single_for_cpu和dma_sync_single_for_device來手動(dòng)維護(hù)cache一致性。我的實(shí)際經(jīng)驗(yàn)是能預(yù)先知道方向的傳輸盡量用流式映射并且嚴(yán)格按順序——寫數(shù)據(jù)、sync_for_device、啟動(dòng)DMADMA完成后、讀數(shù)據(jù)前必須sync_for_cpu。順序搞反的典型癥狀是第一次數(shù)據(jù)是好的第二次開始出錯(cuò)因?yàn)閏ache在第一次傳輸后已經(jīng)把舊值刷進(jìn)去了。這個(gè)問題我在調(diào)一個(gè)音頻驅(qū)動(dòng)時(shí)花了兩天才定位到最后排查方式是在DMA完成中斷里加打印比對(duì)每次讀到的第一個(gè)字節(jié)才發(fā)現(xiàn)cache回寫的順序問題。4. 驅(qū)動(dòng)調(diào)試三板斧日志、寄存器實(shí)錘、Oops回溯4.1 printk的正確打開方式驅(qū)動(dòng)調(diào)試和純應(yīng)用調(diào)試不一樣你不能隨手開一個(gè)gdb斷點(diǎn)。內(nèi)核是跑在目標(biāo)機(jī)上的操作系統(tǒng)最樸素也最可靠的調(diào)試工具依然是printk。但printk不是隨便打打就完了。很多新手驅(qū)動(dòng)一開打印就刷屏整個(gè)控制臺(tái)跟流水一樣連系統(tǒng)實(shí)時(shí)性都被拖垮了。我的經(jīng)驗(yàn)是遵循三級(jí)策略第一級(jí)開發(fā)階段用pr_info和pr_debug把關(guān)鍵路徑全部打出來比如probe成功、中斷觸發(fā)、數(shù)據(jù)讀取。這時(shí)候盡量把打印做成動(dòng)態(tài)的不要寫死方便后續(xù)關(guān)閉。第二級(jí)功能驗(yàn)證階段只保留真正有信息量的log比如寄存器版本的讀取值、狀態(tài)機(jī)的跳轉(zhuǎn)條件。每一條打印都要問自己一句如果它出現(xiàn)了我能不能根據(jù)它判斷問題方向第三級(jí)發(fā)布前把不必要的打印全部改成pr_debug或者用dynamic_debug控制。內(nèi)核的動(dòng)態(tài)調(diào)試機(jī)制可以讓你在運(yùn)行時(shí)按模塊、按函數(shù)、按行號(hào)單獨(dú)開關(guān)某條打印不需要重新編譯。# 打開某模塊內(nèi)所有動(dòng)態(tài)調(diào)試打印 echo module mydriver p /sys/kernel/debug/dynamic_debug/control這個(gè)技巧太實(shí)用了。我調(diào)過一個(gè)USB轉(zhuǎn)串口驅(qū)動(dòng)平時(shí)一條log都不能留出問題的時(shí)候遠(yuǎn)程把動(dòng)態(tài)調(diào)試打開日志瞬間出來了問題定位完一關(guān)零負(fù)擔(dān)。4.2 devmem與寄存器實(shí)測(cè)硬件問題一錘定音驅(qū)動(dòng)不工作的原因一半在軟件一半在硬件。當(dāng)你懷疑是硬件問題時(shí)最快的驗(yàn)證方式是繞過驅(qū)動(dòng)直接讀寄存器。此時(shí)devmem是最趁手的工具——它能直接操作物理地址映射的寄存器。在開發(fā)板的uboot里或者busybox環(huán)境中# 讀物理地址0x01c20000處的32位寄存器值 devmem 0x01c20000 32 # 寫一個(gè)值到該地址小心破壞系統(tǒng) devmem 0x01c20000 32 0x12345678實(shí)際調(diào)外部總線設(shè)備時(shí)我?guī)缀趺看味际窍炔閿?shù)據(jù)手冊(cè)確定期望值再用devmem讀寫對(duì)比。比如某個(gè)外設(shè)的ID寄存器應(yīng)該讀到0x2490如果讀到0xffffffff基本說明片選沒拉對(duì)或者地址線接錯(cuò)了如果讀到0x00000000可能是外設(shè)沒有上電復(fù)位。這些判斷在驅(qū)動(dòng)代碼層面再做就慢了十倍不止。另外記住devmem讀寫的是物理地址不是驅(qū)動(dòng)里的虛擬地址。驅(qū)動(dòng)里ioremap出來的虛擬地址可以通過/proc/iomem查看物理地址映射關(guān)系對(duì)照devmem地址前先確認(rèn)這兩個(gè)地址是同一個(gè)寄存器。4.3 內(nèi)核Oops怎么看從call trace定位代碼位置內(nèi)核崩潰的那一刻你會(huì)在終端或者串口上看到一大段Unable to handle kernel paging request或者Oops信息。不懂的人覺得是天書會(huì)看的人能從中讀出問題坐標(biāo)。首先要讀的就是PC指針?biāo)诘哪且恍蠵C is at mydev_read0x34/0x4c [mydriver]。這一行告訴我們崩潰發(fā)生在mydriver模塊里函數(shù)是mydev_read距離函數(shù)開頭第0x34字節(jié)的位置函數(shù)總長(zhǎng)度0x4c字節(jié)。這還不夠關(guān)鍵是要把0x34轉(zhuǎn)換成源碼行號(hào)。如果你的驅(qū)動(dòng)編譯時(shí)帶了調(diào)試信息-g可以用addr2lineaddr2line -e mydriver.ko -f 0x34但這里有個(gè)坑addr2line算的是模塊加載后的地址而Oops里的偏移是相對(duì)函數(shù)起點(diǎn)的你需要知道模塊在內(nèi)核地址空間里的實(shí)際基址。實(shí)際操作中我更推薦先看call trace里的上一級(jí)調(diào)用確認(rèn)是哪個(gè)調(diào)用路徑觸發(fā)了崩潰。call trace才是真正定位問題的關(guān)鍵。它會(huì)打印出從系統(tǒng)啟動(dòng)到崩潰那一刻的函數(shù)調(diào)用鏈路你的驅(qū)動(dòng)函數(shù)、內(nèi)核的VFS調(diào)用、系統(tǒng)調(diào)用的入口會(huì)一層層列出來。我遇到過一次驅(qū)動(dòng)崩潰第一眼看PC定位在我的ioctl函數(shù)里我以為是參數(shù)校驗(yàn)的問題結(jié)果看了call trace才發(fā)現(xiàn)是VFS層在release階段調(diào)用了我已經(jīng)注銷的函數(shù)——真正的坑是設(shè)備節(jié)點(diǎn)已經(jīng)關(guān)閉但我的設(shè)備結(jié)構(gòu)體已經(jīng)被free了。另外寄存器dump里最有價(jià)值的是LR寄存器。ARM架構(gòu)里L(fēng)R保存著函數(shù)返回地址如果崩潰在某個(gè)被調(diào)用的函數(shù)里L(fēng)R會(huì)告訴你它是從哪個(gè)位置跳到崩潰點(diǎn)的相當(dāng)于另一個(gè)定位坐標(biāo)。最后一個(gè)建議開啟CONFIG_DEBUG_KERNEL和CONFIG_DEBUG_INFO把panic_on_oops設(shè)為1。雖然看起來有點(diǎn)極端但在測(cè)試階段與其讓系統(tǒng)帶著錯(cuò)誤狀態(tài)繼續(xù)運(yùn)行產(chǎn)生更多亂象不如讓它當(dāng)場(chǎng)停下來把現(xiàn)場(chǎng)完整留給你分析。4.4 示波器、邏輯分析儀與trace工具代碼層面排查完之后總有一些問題要落到物理層面。示波器看電源紋波、看時(shí)鐘質(zhì)量、看時(shí)序邊沿邏輯分析儀抓地址線、數(shù)據(jù)線、片選信號(hào)的關(guān)系。這不是EE的活驅(qū)動(dòng)工程師也必須會(huì)用否則你永遠(yuǎn)不知道驅(qū)動(dòng)寫對(duì)了但硬件就是給不了正確響應(yīng)到底是哪一方的鍋。我調(diào)SPI Flash等待時(shí)間時(shí)就是靠邏輯分析儀抓到片選信號(hào)太短——驅(qū)動(dòng)在等待狀態(tài)判斷上少處理了一個(gè)字節(jié)的時(shí)序。這種事printk和devmem都幫不了你因?yàn)閱栴}出在物理信號(hào)層面。除此之外還有一些在線的內(nèi)核跟蹤工具值得掌握。ftrace可以trace函數(shù)的調(diào)用能看驅(qū)動(dòng)里面誰在什么時(shí)候被調(diào)用了多少次tracepoint在關(guān)鍵事件點(diǎn)有預(yù)埋的探針比如irq_handler_entry可以看中斷觸發(fā)頻率perf用來分析性能熱點(diǎn)比如你的read為啥慢是拷貝慢還是硬件等待慢。這些工具不需要重新編譯內(nèi)核在主流嵌入式發(fā)行版里都內(nèi)置了學(xué)會(huì)它們能省大量瞎猜的時(shí)間。5. 從面試到實(shí)戰(zhàn)嵌入式驅(qū)動(dòng)工程師的核心競(jìng)爭(zhēng)力5.1 面試官問八股文其實(shí)在問這四件事嵌入式圈子這兩年八股文文化很重很多人背了一堆概念卻一問細(xì)節(jié)就露餡。其實(shí)面試官問那些經(jīng)典問題背后想考察的就四件能力內(nèi)存理解、并發(fā)意識(shí)、內(nèi)核機(jī)制掌握度、排查問題的思路。比如他問自旋鎖能不能在中斷上下文使用不是要你回答能或不能——能但要注意臨界區(qū)不能睡眠而是想看你有沒有真正理解自旋鎖的底層語義忙等、禁止搶占、可能觸發(fā)死鎖的前提。他問kmalloc(GFP_KERNEL)為什么不能在中斷上下文用也是在考察你有沒有把內(nèi)存管理和原子上下文串起來GFP_KERNEL可能觸發(fā)直接回收然后睡眠。以我的經(jīng)驗(yàn)面試?yán)镒钣袇^(qū)分度的題目不是那些要背定義的概念而是給你一個(gè)偶發(fā)死機(jī)的現(xiàn)象說說你的排查思路。這題沒有標(biāo)準(zhǔn)答案但好的回答會(huì)從復(fù)現(xiàn)、縮小范圍、打印增強(qiáng)、邏輯分析、按層次排查展開差點(diǎn)的回答就是加打印、看日志兩句話。5.2 我推薦的驅(qū)動(dòng)學(xué)習(xí)路線結(jié)合嵌入式學(xué)習(xí)路線這個(gè)熱搜詞我說說成年人學(xué)驅(qū)動(dòng)開發(fā)的務(wù)實(shí)路徑。先不要碰內(nèi)核源碼那是最后的閱讀理解材料不是起點(diǎn)。第一步把C語言和計(jì)算機(jī)基礎(chǔ)扎牢指針、結(jié)構(gòu)體、內(nèi)存布局、編譯鏈接過程、棧和堆。再把Linux應(yīng)用編程過一遍文件IO、多線程、進(jìn)程間通信、select/epoll。這一步是為了讓你理解用戶態(tài)怎么跟驅(qū)動(dòng)打交道理解open/read/write背后的系統(tǒng)調(diào)用鏈路。第二步學(xué)內(nèi)核的三大核心機(jī)制進(jìn)程管理特別是調(diào)度和上下文切換、內(nèi)存管理頁(yè)表、進(jìn)程地址空間、malloc到頁(yè)表的映射過程、中斷處理上半部下半部、中斷線程化。這三塊是驅(qū)動(dòng)開發(fā)的地基。第三步找一塊主流開發(fā)板寫一個(gè)真正的字符設(shè)備驅(qū)動(dòng)配上設(shè)備樹、platform_driver、中斷和等待隊(duì)列。不要停留在點(diǎn)亮LED——那個(gè)連驅(qū)動(dòng)都算不上只能叫GPIO操作。第四步做一個(gè)復(fù)合外設(shè)的項(xiàng)目比如帶DMA的采集驅(qū)動(dòng)、帶中斷的輸入設(shè)備、一個(gè)完整的SPI/I2C從設(shè)備驅(qū)動(dòng)。重點(diǎn)不是功能跑通而是把并發(fā)、阻塞、資源管理的經(jīng)驗(yàn)練扎實(shí)。5.3 一個(gè)拿得出手的驅(qū)動(dòng)項(xiàng)目怎么攢很多人面試時(shí)簡(jiǎn)歷上寫著熟悉Linux驅(qū)動(dòng)開發(fā)但項(xiàng)目經(jīng)歷只有在開發(fā)板上寫了LED和按鍵驅(qū)動(dòng)。這種項(xiàng)目在面試官眼里等于沒有。真正有說服力的項(xiàng)目至少要體現(xiàn)三個(gè)層次。第一層是復(fù)雜度你的驅(qū)動(dòng)不只是一堆寄存器操作它包含了中斷、DMA、并發(fā)保護(hù)、阻塞IO、設(shè)備樹適配這些元素。比如做一個(gè)音頻采集驅(qū)動(dòng)SPI接口、DMA傳輸、環(huán)形緩沖區(qū)、用戶態(tài)通過ALSA或字符設(shè)備讀取數(shù)據(jù)。這個(gè)項(xiàng)目天然就涉及緩存一致性、數(shù)據(jù)完整性、并發(fā)邊界。第二層是工程化代碼有分層結(jié)構(gòu)、錯(cuò)誤處理路徑完整、支持動(dòng)態(tài)調(diào)試、有明確的并發(fā)設(shè)計(jì)說明。能讓面試官看出你不是寫完能跑就行的人而是考慮過卸載模塊會(huì)不會(huì)崩并發(fā)訪問會(huì)不會(huì)錯(cuò)的人。第三層是遷移能力你能把一個(gè)現(xiàn)有驅(qū)動(dòng)從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)并且說明過程中踩過哪些坑。這種跨平臺(tái)移植的經(jīng)歷最能體現(xiàn)對(duì)軟硬件邊界理解是否透徹。5.4 驅(qū)動(dòng)開發(fā)的終局能力是系統(tǒng)思維走到后面你會(huì)發(fā)現(xiàn)單純寫一個(gè)外設(shè)驅(qū)動(dòng)越來越不是重點(diǎn)真正拉開差距的是你能不能從系統(tǒng)的角度看問題。一個(gè)看起來很簡(jiǎn)單的USB設(shè)備驅(qū)動(dòng)往上要適配USB棧、設(shè)備模型、電源管理往下要處理控制器寄存器、DMA、中斷。你要能快速看懂內(nèi)核里相關(guān)子系統(tǒng)的框架代碼能利用內(nèi)核提供的框架而不是繞過框架。suspend/resume你寫不寫pinctrl和gpio子系統(tǒng)怎么協(xié)同設(shè)備運(yùn)行時(shí)電源管理runtime PM該不該引入IOMMU要不要配置時(shí)鐘框架怎么調(diào)頻這些問題在簡(jiǎn)單的example驅(qū)動(dòng)里永遠(yuǎn)不存在但在真實(shí)產(chǎn)品里每一項(xiàng)都可能成為問題。我見過太多人驅(qū)動(dòng)本身寫得挺快但一涉及低功耗喚醒、涉及系統(tǒng)休眠恢復(fù)就亂了陣腳——因?yàn)槟切r(shí)刻驅(qū)動(dòng)不再是孤立的代碼而是整個(gè)電源域和時(shí)鐘域的一部分。所以我的建議很明確驅(qū)動(dòng)開發(fā)的經(jīng)驗(yàn)前期拼的是對(duì)硬件和內(nèi)核接口的熟悉程度后期拼的是對(duì)整個(gè)系統(tǒng)框架的理解深度。后者沒有速成路徑只能靠一個(gè)個(gè)項(xiàng)目喂出來。最近圈子里聊AI寫代碼聊得很熱鬧也有人問我驅(qū)動(dòng)能不能讓AI來寫。我的看法是模板代碼、常見外設(shè)的驅(qū)動(dòng)骨架、設(shè)備樹的常規(guī)寫法AI確實(shí)能幫上忙但驅(qū)動(dòng)開發(fā)真正值錢的部分——判斷并發(fā)風(fēng)險(xiǎn)、理解硬件時(shí)序、在call trace里幾小時(shí)內(nèi)定位問題——恰恰是AI最不擅長(zhǎng)的。那些都是經(jīng)驗(yàn)不是語法。所以我給新人的建議始終不變把中斷、并發(fā)、DMA這三塊硬骨頭啃明白比抄一百遍例程都管用。等你真正被客戶現(xiàn)場(chǎng)的偶發(fā)故障折磨過幾回再回頭看這篇文章里說的每一句話大概都會(huì)有一種原來當(dāng)初的鍋出在這里的恍然。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品一区二区人妖| 亚洲交换| 亚洲精品一区中文字幕乱码| 精品人妻中文字幕4399| 人妻丝袜美腿中文字幕| 97超碰欧美手机在线| 东京热男人的天堂网| 国产精品永久免费10000| 亚洲色狠| 好色综合| 亚洲动态色图| 玖玖资源视频一区二区三区| 国产第11页| 天天综合影院91| 亚洲福利中文字幕在线| 黄片免费看黄片免费看| 日本123区操B视频| 丰满人妻av一区二区三区| 日韩操逼性鲍| 欧美性爽xyxOOOO| 日韩有码中文字幕女同性恋| 中文字幕一区二区三区四五区| 日本A级视频| 日韩欧美麻豆大片| 99蜜桃臀亚洲成人在线观看| 操操操操操操| 97在线无精品| 日韩天天本| 伊人久久亚洲中文字幕| 狠狠躁日日躁夜夜躁A| 久热伊人99re| 67194无码不卡| 九九久久久久久爱| 久久久久9999妇女| 人妻激情在线视频| 在线啊啊啊| 台湾佬中文娱乐网久久久久久久久久com| 91色黑人少妇| 天天情欲宗合网| 嗯嗯啊啊的视频| 后入式视频国产自| www.成人无码| 欧美96在线|欧| 啊啊啊爽爽| 国产成人精品亚洲日本| 婷婷中文网| 午夜欧美女人操逼| 日韩三级一区| 成人色女网| 香港日本韩国人妇99www.wccm20| 伊人亚洲综合| 久久久新亚洲AV| 日日爱99| 永久免费发布性爱网| 一,爱啪啪,在线免费视频| 国产精品久久久久久久黄无码| 国产人伦a片信息免费片| 日韩性爱免费视频在线网站| 中文字幕在线观看网页| 麻豆 亚洲 97| 麻豆天美在线| 超碰97人人cao| 国产福利影视| 欧美大码在线视频| 久久久久婷婷精品av电影| 少妇高潮九九九九九九九| 久久岛国| xxx0国产在线播放| 亚洲欧美天堂在线| 国产精品夜夜夜| 丰满人妻一区二区三区蜜桃视频| 韩国三级三级BD在线| 神马久久69| 一卡二卡三卡| 精品午夜福利国产一区二区在线观看 | 青草伊人久久| 欧美亚洲天堂| 啪啪啪大香蕉| 美女干逼2| 蜜屁av| 精品人妻1区| www.狠狠操| 欧美狠狠弄| 九草九九九| 精品欧美不卡在线播放| 婷婷色导航| 天天插夜夜爽| 国产 亚洲 一二三四| 天天日B夜夜干B时时操B| 欧美夜夜狠| 蜜臀99999| 国产美女高潮| 一色网男人的天堂| 一区二区影视| 亚洲欧美精品福利在线| 久久噜| 少妇高潮流水av免费| 欧美亚洲日韩人妻在线观看| 嗯嗯嗯啊啊在线观看| 国产9 9在线 | 亚洲| 大香蕉综合在线| 久久国产精品熟女人妻| 日本羞羞的视频在线播放 | 一区二区三区一亚洲中文字幕、综合区灬 | 日本一二三免费久久| 亚洲小电影免费涩涩成人在线高清| 色一情一乱一乱一区91Av| 超碰在线97国产| 亚洲欧美高清无码| 中文字幕91综合| 久久久久久久人妻丝袜| 久7色| 大香蕉人妻久久| 国产熟女乱论| 日本高清一本二本免费不卡| 都市激情人妻一区二区青青操视频| 国产久久久久久| 丁香五月成人| 99婷婷一区二区| 在线啊啊啊啊| 99老司机精品视频在线观看| 精品无码一二三四区| 亚洲AV麻豆Aⅴ无码电影一| 超碰久热| 极品销魂美女一区二区| 超硑97精品| 国产精品国产亚洲区艳妇糸列| 理论久久婷婷网 8| 天天做日日做天天欢。| 色区97| 欧美综合站| 亚洲欲色| 欧美97日韩| 九九干| 激情小说亚洲视频| 亚洲18禁| 五月丁香六月婷| 青草一区二区| 夜夜高潮夜夜爽高清视频一| www.黄色在线| 久久久久久综合久久伊人蜜月| 玖色AV| 97爱| 精品人妻一区二区三区视频| 亚洲se电影| 激情综合婷婷| 性爱综合一区二区| 中文字幕视频二区| 色亚州人久干视频在线观看免费版| 欧美性爱十八禁| 丝袜 中出 制服 人妻 美腿 中文字幕| 久久久久久国产精品| 国产深夜福利| 丝袜色综合| 亚洲第一页色| 大香蕉一区二区在线观看.| 人妻天天爽夜夜爽2| 久久,精品一二三| 9久在线视频只有精品| 天天澡天天爽日日av| 日韩欧美亚洲一区二区三区影院| 白嫩少妇| 91热| 中文字幕免费在线观看| 亚洲五区熟女| 天天干天天干天天| 欧美一级黄片视频在线| 人人操人人摸超碰| 国产精品第一页国产大屁股视频免费区i| 婷婷五月天激情网| 色欲Av人妻精品一区二| 欧美Ⅴ性爱| 操一对老熟妇爽上天视频| 草草电影院| 91视频综合在线| 天天干一区二区| 日本国产欧美高清在线| 永久电影三级在线观看| 外国91| 亚洲人妻色图| 黑人粗大V S日韩女优视频| 亚洲色偷偷色噜噜狠狠99网| 久操大香蕉手机视频在线看| 无码自拍SM| 日逼视频日本| 久久性生大片免费观看性| 狠狠操狠狠燥| 国产一区二区精品在线视频| 天天日天天舔东京热| 久久午夜伦| 天美麻花大全视频| 日韩AV色图| 日韩丰满熟妇| 久久婷婷在线观看视频| 中文字幕成人| 动漫爆乳3D奶水一区在线观看 | 国产AV超爽| 日韩免费一级性爱视频| 激情小说亚洲| 亚洲综合影院| 天天噜| 女人18精品一区二区三区| 1204金沙人妻懂旧版免费| 97 亚洲 日韩 欧美 在线| 99无码精品| 中文字幕性感少妇av| 人妻乱仑一区二区三区| 日韩一级特黄av毛片| 熟妇xxxxx性春色| 亚洲不卡三级手机播放| 97超碰磁| 国产精品嫩草影院免费| 深爱五月天| 亚洲AV无码久久久国产精品| 9色在线| 99热这里只有精品8| 亚洲男人的天堂亚洲| 天天日夜夜爽| 91男女啊啊啊| 日本中文字幕一区| 亚洲素人综合| 天天天肏屄肏屄肏屄欧美欧美| 青青草依人大香蕉| 国产精品久久久久久久久久久久久久吹 | 草草影院在线视频| 日韩av三四区| 老熟女中文字幕高清| 欧美体内射精| 黑人在线91| 91激情| 国产精品国产亚洲区艳妇糸列| 91国产操逼视频| 丰满岳乱妇一区二区三区| 亚洲天堂人妻熟妇视频| 91久久精品国产| 欧美亚洲厕所精品偷拍91| 夜夜嗨免费视频| 超碰色图| 操逼逼中文字幕| 久久这里只精品99re66图| 激情五月天网站| 香蕉一区二区三区在线视频| 日韩一级二级三级| 狠狠中文字幕| 激情第四色| 欧美性爱一区二区三区四区| 99在线精品观看视频中文| 天美传媒婬乱在| a片在线播放| 国产精品久久久久亚洲av| 9色在线| 禁十八久久| 黄色交缠性感爆操91国产精品免费一区二区三区| 东京热,男人的天堂| 无码人妻精品酒店| 99热亚洲| 亚洲有薄码区久久在线一区| 88xx成人精品视频| 九九热精品在线| 青青伊人久久| 97干97色| 人人扣人人操| 农村妇女精品一区二区| 26uuu久久| 婷色五月| 久久综合久色欧美综合狠狠 | 国产精品爱欲| 中文字幕黑人大片| 夜夜夜夜久久久久| 久久一区二区三区入口| 日本超碰97日韩精品人妻| AV女资源| 成人在线视频网| 骚女高跟AV在线| 国产精品分类在线观看| 另类图片五月天| 极品一区二区三区免费| 欧亚性爱在线视频| 大香蕉国产中文自拍| 啊啊啊啊啊啊在线| 久99热| 亚洲AV色图一区| 一区二区三区亚洲| 超碰97男人| 一级毛片电影免费看| 亚洲精品视频在线播放| 亚洲欧美校园| 99久久婷婷国产综合| 天海翼久久| 9丨亚洲一区二区在线| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 成人国产二区三区在线,男女精品。| 成全在线观看免费观看| 欧美伦乱爱| 俄罗斯一区二区视频在线观看 | 狠狠色狠狠色狠狠五月| 九九九草| 欧美黄色片AAAAA| 日本 情色 1区2区3区| 国产三级多多影院2022国产AA一级毛片无码 | 超碰成人公开| 天天舔天天日天天射| 免费观看国产小粉嫩喷水精品午| 国产偷仑| www.黄色在线| 久久线上视频免费看| 国产一区二区啪啪视频| 91精品人妻一品二品三品| 婷婷五月天福利| 91bbbbbb| 中文一区二区婷婷视频| 亚洲国产av中文字幕久久| 91性高| 国产精品久久久久久照片| 色九九九综合| 99热综合| 成人免费视瓶| 欧美图片色五月天| 九九九九九九九九九九九免费国产| 搡老熟女免费视频| 自拍第一页| 97色色色| 日韩黄片影院| 亚洲久久天堂| 97青青操视频| 国产日韩欧美亚洲精品95 | 澳门黄片一香蕉视频| 欧美成人色| 国产成人无码高清| se..亚洲欧美| se,,,亚洲欧美| 日韩免费看黄片| 国产丝袜啪啪| 夜夜综合| 欧美后进式| 99老司机精品视频在线观看| 欧美自拍网| 欧洲射精91| 国产色精品午夜大片| 97天天日| 公司1区2区3区精产精| 男人的天堂2018东京热啪啪啪| 91亚洲色人| 精品一区二区三区18| 麻豆九九九| 2024人人操人人摸| 免费在线黄片视频| 欧美操人视频| 国产熟女精品一区二区| 97 国产精品| 亚洲限制级| 好淫网一二三视区| 五月婷婷AV| 欧美一级久久久丰满| 亚洲人天堂| 久久熟女嫩草成人片免费| 夜夜狼人妻| 婷婷五月综合激情| A片三级无码| 久久av无码| 亚洲97在线观看| 9久9久| 嗯~啊~快点 死我视频免费看网站| 在线啊啊啊啊| 一本道综合色图| 精品一区二区成人动漫| 久久性爱免费送| 26uuu欧美日韩| 色吧91| 色约约一区=区三区| 中文字幕精品三级久久久| 97精品第3页| 人人操天天爽| 欧美日韩人人精品| 伊人久久亚洲中文字幕| 97超碰美国| 人妻久久久久久| 日本岛国黄色网址| 亚洲精品亚洲人成人网| 99久久婷婷国产综合精品草原| 欧美大香蕉专区网| 欧美日本一区二区a人| 丰满人妻一区二区三区大胸懂色 | 日韩精品熟妇| 怡红院成人av| 九九国产| 蜜桃精品一区二区三区久在线| 性色av一区二区| 亚洲欧美一区二区不卡视频播放| 色综合99999| 亚洲人码13| 九99久久| 欧美日韩人妻精品系列一区二区三区| 性生活性生大爱77AV国产| 日本精品一区二区三| 91精品人妻啪啪间| 暴力av在线| 欧美人妻制服| 亚洲一区日韩精品中文字幕| 熟女五十路一区二区三| A 天堂在线观看视频| 九九香蕉网| 亚洲综合另类| 欧美性战999| 亚洲人91| 久久这里只精品99re66图| 性做久久久久久免费观看软件| 立川理惠无码一区二区| 亚洲AV无码天美传媒一区| 亚洲AV资源| 久久久久密臀一区二区| 精品二区三四区五电影 | 免费1级a做爰片观看| 黑人操一区二区| 亚洲久热| 九九国产热| 欧美色97| 97在线精品观看视频| 91动漫操逼视频| 深夜操逼网| 97er欧美性| 欧美色综合网| 香蕉久久AⅤ...| 另类在线| 在线亚洲丝袜视频网站| 好爽要喷了| 日韩超碰97| 午夜福利精品| 鸥美精品一区二区久久婷婷| 99草精| 日本高清免费一本视频在线观看| 天天精品| 五月天综合网| 亚欧色图在线激情| 天天干人妇| 禁十八久久| 国语精品av| 2018天天干在线视频| 3571色综合一区二区二区| 91九九九小逼| 国产精品九九九| 激情综合二| 性生活久久久久久久久久| 久草这里只有精品| 国产女生在线| 色网综合网| 极品综合| 日韩激情电影中文字幕| 开心五月深爱五月| 久久久久成人网| 国产欧美日韩精品中文| 日韩精品99久久久久久中文字幕| 九九AV| 丁香九月婷婷| 偷拍盗拍亚洲色图图片| 桃花色涩综合影院| 天天舔日美女视频| 女人被添高潮免费视频| 麻豆区久久久久亚| 偷拍 欧美 日韩| 日韩一级片在线看| 97国产综合欧美| 91精品国产日韩欧美综合| 嗯嗯嗯,草死我| 亲子敌伦对白在线播放| 国产欧美精品日韩区二区麻豆天美| 丰满少妇精品一区二区| 超碰人人超在线观看| 午夜精品久久久99热蜜桃的功能特点| 在线无码网站| 99蜜桃臀久久久欧美精品网站| 91久久免费视频互動交流| 精品久久久久黄少妇| 日韩无码极品| 91丝袜美腿网站| 岛国1区2区3区在线观看| 人妻出轨一区二区三区| 国产一区二区在线播放量| 日韩av熟女一区二区三区成人| 国产午夜在线观看| 麻豆性爱视频在线播放| 最新中文字幕精品在线| 国产夫妻性生活视频| 十八禁视频网站| 91性网| 91丨国产丨白浆秘 洗澡动漫| 色女女女导航| 五月天久久综合网| 久草毛片| 人妻久久久久久久久久久久久久久 | 欧美色图97| 成人av免费观看| 2017天天拍大香蕉| 亚洲第91页| 人人干人人搞人人摸| www.人人摸在线视频| 九九色色| 三级激情网站| 欧美综合综合| 91熟女综合| 亚洲四虎熟女精品| 久操91视频| 亚洲日韩东京热一区| 色情五月综合婷婷| 国产无码精品无码| 亚洲另类色综合网站| 91爽啪| 狠狠中文字幕| 99re久久| 9精品久久| 色婷婷综合网| 国产91乱伦| 欧美碰碰综合色| 日韩精品9999| 大香蕉伊人色偷偷在线| 欧美日韩操操操| 日日骚AV| aV中文麻| 亚av顶级裸体一区二区三区四区五区| 91久久久久免| 欧美成人一级免费电影| 婷婷色色五月天福利| 91热色| 九月AV| 九九热精品| 大香蕉99热| 色九区| 成人a大片在线观看| 啊啊啊免费视频| 亚洲清纯唯美| 久日91在线| 久久色一区| 婷婷五月天色| 激情五月天婷婷| 日本性爱少妇| 日韩欧美中文日韩欧美色| 成人免费性爱视视| 啊啊啊好多水| 夜色综合| 人人操人人肉久久精品| 欧美日韩亚洲少妇寂寞影院正在播放| 91天射| 久久水蜜臀亚洲AV无码精品| 狼人综合婷婷激情四射 | 丝袜综合色图| 人妻啊啊人妻啊啊| 天天干少妇| 99在线精品观看99| 五月丁香激情综合网| 日韩性爱电影一区| 欧美日韩性爱无码| 亚洲欧美在线观看2021| 亚洲九月丁香| 亚洲一区二区精品福利| 三级三级三级a级全黄三| 福利社区午夜一区二区| 伊人丁香五月婷婷| 性爱视频啪啪啪啪| 免费看国产曰批40分钟怎么下载| 亚洲欧洲综合av在线| 18啪啪手机免费性爱| 丁香九月 婷婷| 中文字幕高清精品一区| 99久久久无码精品国产人| 人人做天天爱| 一级黄色视频网| 久久九九视频九九视频| 亚洲色图欧美视频| 97人人射| 日语五十路和六十路亚洲国产精品 | 啊啊啊好大好深| 性91| 永久免费av无码网站国产app| 伊人久久综合影院精品久久久| 午夜福利1区2区3区| 国产精品区在线12p| 特级毛片特黄久久免费看| 99久久久er直播网址| 成视频在线观看免费看| 亚洲,欧美,春色,另类| 大香蕉综合在线| 国产黄色av大片网站| 五月婷婷激情综合| 欧美日韩免费专区在线| 色香伊人| 亚洲97超碰| ,成人免费啪啪视频| 亚洲成人一区二区精品| 五月天大香蕉| 亚洲第一页欧美| 久久久久久久久久久久欧美日| 欧美综合亚洲| 天天看精品动漫视频一区| 天天操天天干一区二区| 激情五月婷婷| 蜜桃精品视频一区| 97亚洲综合在线| 国产精品视频内谢女人| 囯产乱伦一区二区三女 | 美女91| 成全在线观看免费观看| 人妻嗯啊啊在线播放| 婷婷丁香一区二区三区| 亚洲国产天堂| 色嗨嗨在线| 熟妇人妻一区二区三区| 久久精品国产97欧美精品亚洲 | 色香阁在线| 老女人老91妇女老热女| 国产精品剧情| 日本精品高清一二区一本到| 老师充足的奶水小说| 精品十八在线观看| 最新日日夜夜天天干干| 97精品在线| 日韩乱伦影音先锋| 97欧美| 免费日韩黄片| 五月天色图影视| 久久噜| 日韩欧美操逼xxx| 长长久久免费视频| www.acm成人黄色毛片| 国产高清视频无码在线| 天天舔天天 | 精品国产自在在线99| 欧美天天在线| 一类无码操逼视频| 久久久久久91香蕉国产| 91老熟妇| 麻豆精品久久久久久久| 国产久久天堂资源| 国产精品免费视频不卡| 午夜精品久久久99热蜜桃的功能特点| 欧美特大AA级黄片| 一道本东京热加勒比一区二区三区| 国产农村妇女毛片精品久久| 国产 丝袜 欧美中文 另类| 亚洲色图伊人网| 日韩乱伦AⅤ| 91麻豆天美传媒HD| 蜜乳AV免费观看| 肉丝网站91| A 天堂| 2025亚洲男人天堂| 成人性爱免费播放| 国产黄色动态精品| 久久 国产 无码| 天天射夜夜操| 蜜色网色哟哟| 100啪啪视频大全| 97国产亚洲中文在线| 精品久久久av无码免费| 日本三级日本三级三级人妇四虎| 看日韩黄片| 欧洲一区二区三区免费| 午夜电影在线观看无码专区| 国产91专区| 啊视频在线| 青娱乐91| 91国产大片| 国产精品成人福利在线| 天天在线91| 丁香激情网| 探花视频免费观看国产专区| 精品久久久久黄少妇| 人妻丰满熟妇一区二区三| 黑人精品久久97| 日韩性爱视频免费在线| 三级色影综合网| 蜜桃精品一区二区三区ww| 美日韩男女操屄视频| 骚熟女吞| 婷婷99狠狠| 欧美视频一| 久久久久久久久久久久欧美日| 免费一级视频特黄色大片| 久久超碰97| 欲香欲色天天天综合和网| 精品区国产区一区二区三区| 欧美人妻制服| 玖玖资源中文字幕制服丝袜| 一区二区三区 日韩欧美| 久久久久熟女| 黄网站黄视频网站进入口| 亚洲成熟国产精品美女| 亚洲一二三四区| 欧美日韩婷婷中文| 99在线免费视频| 免费福利视频中文字幕| 亚洲综合伊人无码久久| 一区二区三区蜜桃成人撸久久东京热 | 躁躁躁日日躁2020| 亚洲诱惑| 日韩97超碰中文字幕| 欧美一级国产一级| 黄骗免费网站| 中文字幕一品色图| 亚洲精品骚逼| 资源在线观一 二| 插穴性爱视频在线观看| 蜜臀久久99精品久久久久久无删减 | 久超碰这里只有精品| 久久伊人网视频一区二区三区 | 色哟哟av| 男生女生啊啊啊啊| 小少妇| 牛牛aV| 超碰色男人操熟女| 白丝一区| 久久精品电影在线| 日韩人妻精品| 性性欧美| 成人老鸭窝人人在线视频| 久久ww| 国产一级作爱毛片| 久久性爱精品一区| 国产无码精品无码| 欧美性第一页| 天天cao在线| 88在线一区二区三区| 中国熟女网站| 国产成自自拍在线观看| 三级片大波波| 色一射色一射| 欧插网站| 色综合美国| 五月激情天| 亚洲中文字幕网| 簧片免费看视频| 国产69精品久久久久99尤物| 大黄片做爱的大的| 国产欧美精选激情视频| 蜜乳AV免费观看| 国产日韩精品suv| 亚洲黑人在线| 欧美性xxxxx狂欢| 麻豆久久一区二区三区| 综合 亚洲 欧美| 天天色欧美| 日本久久超碰| 国产精品香蕉| 视频一区二区免费在线| 秋霞怕怕片| 无码不卡亚洲成?人片| 亚洲综合第一页| 欧美激情激情xxxx欧美专区| av影片在线观看不卡| 男女无套 免费网站| 亚洲影院成人| 精品日韩人妻精品一二三区| 欧美特大AA级黄片| 日韩卡一卡二卡三在线| 日本欧美亚洲高清在线看| 成人性爱高清视频免费看| 你懂得91| 天天影视综合网欧美精品| 内射日韩大臀美女| 91中文精品日韩欧美在线| 久操在97| 久久精品六区| 欧美爱爱97| 无码高清操逼网址| 久久性爱网站| 免费观看的av| 中美日韩毛片| 亚洲清纯唯美| 黄页av| 韩日色费| 国产92麻豆天美精品色欲5| 91操人视频| 综合干干干av久久久综合网| 豆1无夜无码| 日韩精品一二三| 欧美性爱日韩高清| 果冻国产精品麻豆成人av| 亚洲激情综合| 亚洲男人的天堂AV| 婷婷10月天青娱乐| 无码操逼视频一下| 探花精品视频| 中文97国产| 天堂网亚洲区手机版| 不卡中文字幕aⅴ在线| 国产 v乱码一区二| 中文一区二区婷婷视频| 另类成人首页一区| 最新无码国产| 综合五月婷婷| 久久久九九九九| 97超碰色色| 亚洲色图亚洲无码强奸乱伦| 任我爽视频在线观看| 超碰在线综合97| 你懂的在线观看区国产| 综合色色婷婷| 欧美变态激情网| 亚洲另类天堂| 亚洲精品成人激情在线| 欧美激情一区二区| 亚洲天天更新| 日韩黄色成人性爱| 99国产精品久久久久久久成人热| 欧美伊人电影| 亚洲成人久久一区二区| www.一本大99| 超碰2017| 色五月婷婷色| 99在线啪| 超碰国产精品久| 老熟女91av| 91性片| 麻豆这里只有精品| 97超碰免费生活| 91人精品妻入口| 久久熟女人| 热热色中文无码| 亚洲aV性爱| 久偷拍欧美日韩三区| 黑人精品XXX一区一二区| 一二三四日本视频高清| 国产一线二线三线av| 亚洲欧美国产成人综合不卡| 极品后入免费视频| 九九精品99| 亚洲色性情三级| 亚洲日韩精品久久久久一区壹牛| 久久国产精品一级二级三级| 少妇高潮一区二区三区在线| 亚洲九月丁香| 蜜桃视频一区二区三区| 亚洲小电影免费涩涩成人在线高清| 韩国轻伦国内自拍一区| 亚洲高清自拍| 伊人久久青青草| 色综合av综合久久| 亚洲成人一二三区| 国产婷婷综合在线观看| 国产天天骚| 情趣丝袜无码操逼视频| 1204av韩国| 天天躁日日躁xxxxx| 久久精9| 欧美日本中字另类在线| 欧美亚洲国产日本在线,久久精品国产| av在线播放国产一区| 色大香蕉97N| 免费一级特黄特色大片在线观看看| 久久亚码| 亚欧国产无码精品在线| 97久久久久| 999日韩中文精品观看视频。| 精品一区二区三区国产 | 国产一级特黄大片处女| 久久久久国产| 熟女突然公开看18禁影片| 色色97爱| 黄色小说亚洲| 午夜精品五区| 综合自拍| 天堂日本亚洲欧美| 国产欧美精选激情视频| 欧美人妻一区二区| 开心五月激情网| 襙一襙| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 一区二区三区激情在线观看| 日本幼女18+| 俺去久久| 激情网色| 777超碰| 亚av顶级裸体一区二区三区四区五区 | 久久性爱视频免费看| 久久久专区| 97久久视频| 天天干天天舔| 亚洲日精品| 精久久久91| 国产精品熟女乱伦| 国产主播福利| 玖玖大干人妻| 亚洲综合影视| 久久九九综合| 午夜.DJ高清在线观看免费7| 少妇精品| 淫乱图区 | 亚洲男人天堂网久久| 亚洲成?V人片在线观看福利| 超碰97护士| 亚州大图综合色图| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 99热官网| 一区二区三区免费岛国片| 久久男人的天堂| 久久9精品网站| 欧美爆操91| 99精品网| 92午夜免费福利视频| 亚洲 小说 欧美 激情 另类| 深喉吞精| 亚洲情色综合网| 精品一区二区三区四区女| 五月开心网| 成人免费福利在线观看| 久久无码一区二区二三区性色| 欧美色97| 亚欧操逼片在线观看| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 国产又黄又爽又刺激久久久久久| 97干在线视频| 人妻人久久精品中文字幕| 1204金沙人妻懂旧版免费| 99热亚洲天堂| 九九热在线精品视频| 性爱边摸边日免费AV| 国产真乱mangent| 五月婷亚洲精品天堂| 欧美 亚洲精品首页| 日本精品一区二区三| 情侣操 逼视频99| 欧美一二在线| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 神马久久中文字幕| 91女人的网站| 美女露胸露尿口| 精品国产乱码久久久久久影片| 99色在线视频| 91狠狠综合久久| 国内自拍 日韩激情 99| 色婷婷九月天天综合| 性久久| 免费伦费视频在线观看| 多毛小伙内射老太婆| 宅男影院久久久,99| 欧洲综合无码| 日本熟女免费視颖| 欧美黄片免费在线观看视频| 一区二区三区亚洲| 亚洲阿v天堂无码z2018| 中国一级特黄大片护士| 思思热免费在线视频| 免费精品中文字幕| 欧美系列在线一区二区| 黄色欧美性爱视频| 九九无码视频| 激情五月丁香五月| 92福利社视频| 成人AV素股で擦久久| 亚洲男人天堂2012| 久久伊人青青草| 热的中文 热的有码 热的国产| 黄色十八禁| 亚洲色婷婷综合久久一区二区三区| 风间由美日韩欧美久久| 蜜臀AV午夜精品久| 在线日韩日本亚洲国产| www.99色| 国产精品久久久久久片| 久久久夜夜嗨免费视频| 五月天婷婷成人网| 校园春色亚洲欧洲| 国产高清在线观看欧美| 久久精品店| 婷婷五月天色色| 老女人日韩美91| 伊人991| 色天天野狼综合社区| 亚洲欧美情色| 性爱乱伦视频免费| 第一高清av中文字幕| 99热97| 亚洲熟女乱色一区二区三区久久久| 无码精品啪啪啪一区二区三区三州| 亚洲综合在线91| 少妇一级无码精品| 五月天丁香婷婷综合网站| 激情五月丁香五月| 99操| 青青久草| 综合伊人激情| 91人妻Pr| 国产传媒一区日韩| 国产一区二区精品久久久不卡蜜臀| 好爽视频在线观看视频 | 狠肏骚人妻| 久久九精品| 精品免费囯产一区二区三区| 伊人操你| 九九在线精品| 麻豆 亚洲 97| 亚洲另类天堂| 国产精品久久伊人| 天天综合影院91| 91热| 强奸乱伦麻豆| 欧美亚洲丝袜美女电影| 国产伊人精品在线| 国产成人一级av88| 国产乱码久久| 亚洲97网站| 人妻啪| 日韩女优在线| 久久久精品九| 国产精品久久久久久无码红治院| 亚洲欧美一区二区三区在钱蜜桃| 九九人妻| 亚洲精品毛片在线观看| 96AV精品| 久久久91| 中文字幕亚洲在线一区| 淫乱图区| 久久成人国产精品| www.狠狠干.coom| com 首页 18岁 禁区 女优 免费 精选 同城| 日本性爱视频一级| 国产欧美伊人| 九九九九AV| av资源在线播放天堂| 成人黄页| 欧美自拍偷拍综合图片| 无码一区二区三区四区五区六区七区八区九区十区视频 | 妇女一区二区三区| 静品嫩模一区二区| 九九免费影片| 天天视频黄网站| 中文一区在线日| 强奸乱伦AV网址| 九九热超碰97亚洲最新香蕉| 国产精品人妻免费精品| 97九色人妻| 少妇精品久久| 国产免费一区二区三区最新不卡 | 一区二区日韩欧美久久| 97视频一区| 免费精品福利在线观看| 精品国产www久久| 色偷偷人人玩人人舔人人操人人摸人人爽| 人人看人人插| 人人澡人人弄| 国产免a费看黄片在线| 一本一首道人妻少妇免费久久| 国产又色又粗又黄又爽| 一区二区精品更新提醒| 五月天婷婷在线看| 日逼五月天| 精品九九国产无码| 日本中文字幕一区| 精品一啪| 亚洲情色 自拍| 日本三级韩国三级99| 亚洲情欲| 欧美亚洲第1页| 一级特黄aaa大片在线观看成人一级片在线观看| 蜜臀精品1区2区| 欧美五十路熟| 中文字幕伊人| 激情久久av一区av二区av| 四虎精品永久在线观看| 亚洲人妻一区二区三区| 久久久久久久强迫| 色欲色香天天天综合网www-亚洲综合国| 高潮的A片激情扒开一区| A男人的天堂| 五月天色色网站| 97超碰人妻| 久久超碰98| 亚洲精品三| 激情综合网亚洲| 操亚州| 日韩av乱伦| 青春草莓视频在线观看网址| 操一区| 中文字幕 码精品视频网站| 欧美中文综合| surenchaopeng| 成人午夜无码视频| 亚洲啪啪综合?v一区综合精品区| 99青青草国产视频| 欧美做爰无码A片视频| 性色亚洲| 色亚州人久干视频在线观看免费版| 亚洲欧美经典一区二区| 你懂的在线观看区国产| 欧美性五月| 夜夜操老骚逼视频网站| 欧美日本一区二区a人| 欧美在线天堂| 97一本大道亚洲一区| 亚洲操操操| 国产精品点击进入在线影院| 黑人精品欧美一区二区蜜桃| 久久色激情一区二区三区| 日本一区二区成人在线| 欧美精品三区| 人妻色情天天操| 蜜臀AV一区二区三区激情综合| 岛国艾薇凹凸视频天堂| 日韩欧美日韩| 四虎免费在线播放| 台湾大香蕉99热| 3571色综合一区二区二区| 嫩草一区二区在线观看| 国产高清成人免费视频| 精久久久| 欧美日韩国产男人| 2020中文字幕| 18禁超污无遮挡无码免费网| 日韩福利电影网| 情色大香蕉| 2026国产精品视频| 99999无码| 天天日天天爽| 亚洲AV成人无码久久精品播放| A一区片| 色香AV| 78操B| 久久一二三四五六七八九区| 日本人妻天堂网站在线播放| 人妻啊啊人妻啊啊| 久久婷婷热| 五月天婷精品激情| av强奸乱轮| 日本中文字幕不卡视频| 人人操人人肉久久精品| av橘色网站| 997色在线| 日韩不卡一二三四| 亚洲欧洲无码97久久精品| 18精品一区| 91人人看| 91亚洲黑人| 日韩AV片| 国产原创自拍| 天天综合官网| 亚洲欧美综合网| 夜夜嗨一区| 色婷婷日韩精品一区二区三区| 久久人体一区二区| 91国产丝袜美女| 97超色| av草草在线电影| 亚欧美色图| 久久久性少妇| 欧美色91| 色九久| 丰满人妻一区二区三区四区| 中文字幕人妻丝袜乱一区三区| 成人AV在线网站| 大鸡巴久久| 熟妇一区二区| 中文字幕99999| 极品国产内射| 国产亚洲日韩欧| av天堂天堂av日韩| 中国东北熟女老太婆内谢| 亚洲欧洲日韩国产自在线| 1024人妻熟女一区二区三区| 婷婷视频在线免费观看| 激情久久久| 色播五月丁香|