《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > ISA總線的DMA技術
ISA總線的DMA技術
摘要: DMA概述DMA是外設與主存之間的一種數據傳輸機制。一般來說,外設與主存之間存在兩種數據傳輸方法:(1)PragrammedI/O(PIO)方法,也即由CPU通過內存讀寫指令或I/O指令來持續地讀寫外設的內存單元(8位、16位或32
關鍵詞: 數據傳輸 DMA ISA總線
Abstract:
Key words :

1.DMA概述

  DMA是外設與主存之間的一種數據傳輸機制。一般來說,外設與主存之間存在兩種數據傳輸方法:(1)Pragrammed I/O(PIO)方法,也即由CPU通過內存讀寫指令或I/O指令來持續地讀寫外設的內存單元(8位、16位或32位),直到整個數據傳輸過程完成。(2)DMA,即由DMA控制器(DMA Controller,簡稱DMAC)來完成整個數據傳輸過程。在此期間,CPU可以并發地執行其他任務,當DMA結束后,DMAC通過中斷通知CPU數據傳輸已經結束,然后由CPU執行相應的ISR進行后處理。

  DMA技術產生時正是ISA總線在PC中流行的時侯。因此,ISA卡的DMA數據傳輸是通過ISA總線控制芯片組中的兩個級聯8237 DMAC來實現的。這種DMA機制也稱為“標準DMA”(standard DMA)。標準DMA有時也稱為“第三方DMA”(third-party DMA),這是因為:系統DMAC完成實際的傳輸過程,所以它相對于傳輸過程的“前兩方”(傳輸的發送者和接收者)來說是“第三方”。

  標準DMA技術主要有兩個缺點:(1)8237 DMAC的數據傳輸速度太慢,不能與更高速的總線(如PCI)配合使用。(2)兩個8237 DMAC一起只提供了8個DMA通道,這也成為了限制系統I/O吞吐率提升的瓶頸。

  鑒于上述兩個原因,PCI總線體系結構設計一種成為“第一方DMA”(first-party DMA)的DMA機制,也稱為“Bus Mastering”(總線主控)。在這種情況下,進行傳輸的PCI卡必須取得系統總線的主控權后才能進行數據傳輸。實際的傳輸也不借助慢速的ISA DMAC來進行,而是由內嵌在PCI卡中的DMA電路(比傳統的ISA DMAC要快)來完成。Bus Mastering方式的DMA可以讓PCI外設得到它們想要的傳輸帶寬,因此它比標準DMA功能滿足現代高性能外設的要求。

  隨著計算機外設技術的不斷發展,現代能提供更快傳輸速率的Ultra DMA(UDMA)也已經被廣泛使用了。本為隨后的篇幅只討論ISA總線的標準DMA技術在Linux中的實現。記住:ISA卡幾乎不使用Bus Mastering模式的DMA;而PCI卡只使用Bus Mastering模式的DMA,它從不使用標準DMA。

  2.Intel 8237 DMAC

  最初的IBM PC/XT中只有一個8237 DMAC,它提供了4個8位的DMA通道(DMA channel 0-3)。從IBM AT開始,又增加了一個8237 DMAC(提供4個16位的DMA通道,DMA channel 4-7)。兩個8237 DMAC一起為系統提供8個DMA通道。與中斷控制器8259的級聯方式相反,第一個DMAC被級聯到第二個DMAC上,通道4被用于DMAC級聯,因此它對外設來說是不可用的。第一個DMAC也稱為“slave DAMC”,第二個DMAC也稱為“Master DMAC”。

  下面我們來詳細敘述一下Intel 8237這個DMAC的結構。

  每個8237 DMAC都提供4個DMA通道,每個DMA通道都有各自的寄存器,而8237本身也有一組控制寄存器,用以控制它所提供的所有DMA通道。

  2.1 DMA通道的寄存器

  8237 DMAC中的每個DMA通道都有5個寄存器,分別是:當前地址寄存器、當前計數寄存器、地址寄存器(也稱為偏移寄存器)、計數寄存器和頁寄存器。其中,前兩個是8237的內部寄存器,對外部是不可見的。

  (1)當前地址寄存器(Current Address Register):每個DMA通道都有一個16位的當前地址寄存器,表示一個DMA傳輸事務(Transfer Transaction)期間當前DMA傳輸操作的DMA物理內存地址。在每個DMA傳輸開始前,8237都會自動地用該通道的Address Register中的值來初始化這個寄存器;在傳輸事務期間的每次DMA傳輸操作之后該寄存器的值都會被自動地增加或減小。

  (2)當前計數寄存器(Current Count Register):每個每個DMA通道都有一個16位的當前計數寄存器,表示當前DMA傳輸事務還剩下多少未傳輸的數據。在每個DMA傳輸事務開始之前,8237都會自動地用該通道的Count Register中的值來初始化這個寄存器。在傳輸事務期間的每次DMA傳輸操作之后該寄存器的值都會被自動地增加或減小(步長為1)。

  (3)地址寄存器(Address Register)或偏移寄存器(Offset Register):每個DMA通道都有一個16位的地址寄存器,表示系統RAM中的DMA緩沖區的起始位置在頁內的偏移。

  (4)計數寄存器(Count Register):每個DMA通道都有一個16位的計數寄存器,表示DMA緩沖區的大小。

  (5)頁寄存器(Page Register):該寄存器定義了DMA緩沖區的起始位置所在物理頁的基地址,即頁號。頁寄存器有點類似于PC中的段基址寄存器。

  2.2 8237 DAMC的控制寄存器

  (1)命令寄存器(Command Register)

  這個8位的寄存器用來控制8237芯片的操作。其各位的定義如下圖所示:

  (2)模式寄存器(Mode Register)

  用于控制各DMA通道的傳輸模式,如下所示:

  (3)請求寄存器(Request Register)

  用于向各DMA通道發出DMA請求。各位的定義如下:

  (4)屏蔽寄存器(Mask Register)用來屏蔽

   某個DMA通道。當一個DMA通道被屏蔽后,它就不能在服務于DMA請求,直到通道的屏蔽碼被清除。各位的定義如下:

  上述屏蔽寄存器也稱為“單通道屏蔽寄存器”(Single Channel Mask Register),因為它一次只能屏蔽一個通道。此外含有一個屏蔽寄存器,可以實現一次屏蔽所有4個DMA通道,如下:

  (5)狀態寄存器(Status Register)

  一個只讀的8位寄存器,表示各DMA通道的當前狀態。比如:DMA通道是否正服務于一個DMA請求,或者某個DMA通道上的DMA傳輸事務已經完成。

  2.3 8237 DMAC的I/O端口地址

  主、從8237 DMAC的各個寄存器都是編址在I/O端口空間的。而且其中有些I/O端口地址對于I/O讀、寫操作有不同的表示含義。如下表示所示:

  Slave DMAC’s I/O port Master DMAC’sI/O port read write

  0x000 0x0c0 Channel 0/4 的Address Register

  0x001 0x0c1 Channel 0/4的Count Register

  0x002 0x0c2 Channel 1/5 的Address Register

  0x003 0x0c3 Channel 1/5的Count Register

  0x004 0x0c4 Channel 2/6的Address Register

  0x005 0x0c5 Channel 2/6的Count Register

  0x006 0x0c6 Channel 3/7的Address Register

  0x007 0x0c7 Channel 3/7的Count Register

  0x008 0x0d0 Status Register Command Register

  0x009 0x0d2 Request Register

  0x00a 0x0d4 Single Channel Mask Register

  0x00b 0x0d6 Mode Register

  0x00c 0x0d8 Clear Flip-Flop Register

  0x00d 0x0da Temporary Register Reset DMA controller

  0x00e 0x0dc Reset all channel masks

  0x00f 0x0de all-channels Mask Register

  各DMA通道的Page Register在I/O端口空間中的地址如下:

  DMA channel Page Register’sI/O port address

  0 0x087

  1 0x083

  2 0x081

  3 0x082

  4 0x08f

  5 0x08b

  6 0x089

  7 0x08a

  注意兩點:

  1. 各DMA通道的Address Register是一個16位的寄存器,但其對應的I/O端口是8位寬,因此對這個寄存器的讀寫就需要兩次連續的I/O端口讀寫操作,低8位首先被發送,然后緊接著發送高8位。

  2. 各DMA通道的Count Register:這也是一個16位寬的寄存器(無論對于8位DMA還是16位DMA),但相對應的I/O端口也是8位寬,因此讀寫這個寄存器同樣需要兩次連續的I/O端口讀寫操作,而且同樣是先發送低8位,再發送高8位。往這個寄存器中寫入的值應該是實際要傳輸的數據長度減1后的值。在DMA傳輸事務期間,這個寄存器中的值在每次DMA傳輸操作后都會被減1,因此讀取這個寄存器所得到的值將是當前DMA事務所剩余的未傳輸數據長度減1后的值。當DMA傳輸事務結束時,該寄存器中的值應該被置為0。

  2.4 DMA通道的典型使用

  在一個典型的PC機中,某些DMA通道通常被固定地用于一些PC機中的標準外設,如下所示:

  Channel Size Usage

  0 8-bit Memory Refresh

  1 8-bit Free

  2 8-bit Floppy Disk Controller

  3 8-bit Free

  4 16-bit Cascading

  5 16-bit Fr

  ee

  6 16-bit Free

  7 16-bit Free

  2.5 啟動一個DMA傳輸事務的步驟

  要啟動一個DMA傳輸事務必須對8237進行編程,其典型步驟如下:

  1.通過CLI指令關閉中斷。

  2.Disable那個將被用于此次DMA傳輸事務的DMA通道。

  3.向Flip-Flop寄存器中寫入0值,以重置它。

  4.設置Mode Register。

  5.設置Page Register。

  6.設置Address Register。

  7.設置Count Register。

  8.Enable那個將被用于此次DMA傳輸事務的DMA通道。

  9.用STI指令開中斷。

  3.3 對DMAC的保護

  DMAC是一種全局的共享資源,為了保證設備驅動程序對它的獨占訪問,Linux在kernel/dma.c文件中定義了自旋鎖dma_spin_lock來保護它(實際上是保護DMAC的I/O端口資源)。任何想要訪問DMAC的設備驅動程序都首先必須先持有自旋鎖dma_spin_lock。如下:

  static __inline__ unsigned long claim_dma_lock(void)

  {

  unsigned long flags;

  spin_lock_irqsave(&dma_spin_lock, flags); /* 關中斷,加鎖*/

  return flags;

  }

  static __inline__ void release_dma_lock(unsigned long flags)

  {

  spin_unlock_irqrestore(&dma_spin_lock, flags);/* 開中斷,開鎖*/

  }4 Linux對ISA DMA通道資源的管理

   DMA通道是一種系統全局資源。任何ISA外設想要進行DMA傳輸,首先都必須取得某個DMA通道資源的使用權,并在傳輸結束后釋放所使用DMA通道資源。從這個角度看,DMA通道資源是一種共享的獨占型資源。

  Linux在kernel/Dma.c文件中實現了對DMA通道資源的管理。

  4.1 對DMA通道資源的描述

  Linux在kernel/Dma.c文件中定義了數據結構dma_chan來描述DMA通道資源。該結構類型的定義如下:

  struct dma_chan {

  int lock;

  const char *device_id;

  };

  其中,如果成員lock!=0則表示DMA通道正被某個設備所使用;否則該DMA通道就處于free狀態。而成員device_id就指向使用該DMA通道的設備名字字符串。

  基于上述結構類型dma_chan,Linux定義了全局數組dma_chan_busy[],以分別描述8個DMA通道資源各自的使用狀態。如下:

  static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = {

  { 0, 0 },

  { 0, 0 },

  { 0, 0 },

  { 0, 0 },

  { 1, "cascade" },

  { 0, 0 },

  { 0, 0 },

  { 0, 0 }

  };

  顯然,在初始狀態時除了DMA通道4外,其余DMA通道皆處于free狀態。

  4.2 DMA通道資源的申請

  任何ISA卡在使用某個DMA通道進行DMA傳輸之前,其設備驅動程序都必須向內核提出DMA通道資源的申請。只有申請獲得成功后才能使用相應的DMA通道。否則就會發生資源沖突。

  函數request_dma()實現DMA通道資源的申請。其源碼如下:

  int request_dma(unsigned int dmanr, const char * device_id)

  {

  if (dmanr >= MAX_DMA_CHANNELS)

  return -EINVAL;

  if (xchg(&dma_chan_busy[dmanr].lock, 1) != 0)

  return -EBUSY;

  dma_chan_busy[dmanr].device_id = device_id;

  /* old flag was 0, now contains 1 to indicate busy */

  return 0;

  }

  上述函數的核心實現就是用原子操作xchg()讓成員變量dma_chan_busy[dmanr].lock和值1進行交換操作,xchg()將返回lock成員在交換操作之前的值。因此:如果xchg()返回非0值,這說明dmanr所指定的DMA通道已被其他設備所占用,所以request_dma()函數返回錯誤值-EBUSY表示指定DMA通道正忙;否則,如果xchg()返回0值,說明dmanr所指定的DMA通道正處于free狀態,于是xchg()將其lock成員設置為1,取得資源的使用權。

  4.3 釋放DMA通道資源

  DMA傳輸事務完成后,設備驅動程序一定要記得釋放所占用的DMA通道資源。否則別的外設將一直無法使用該DMA通道。

  函數free_dma()釋放指定的DMA通道資源。如下:

  void free_dma(unsigned int dmanr)

  {

  if (dmanr >= MAX_DMA_CHANNELS) {

  printk("Trying to free DMA%d

  ", dmanr);

  return;

  }

  if (xchg(&dma_chan_busy[dmanr].lock, 0) == 0) {

  printk("Trying to free free DMA%d

  ", dmanr);

  return;

  }

  } /* free_dma */

  顯然,上述函數的核心實現就是用原子操作xchg()將lock成員清零。

  4.4 對/proc/dma文件的實現

  文件/proc/dma將列出當前8個DMA通道的使用狀況。Linux在kernel/Dma.c文件中實現了函數個get_dma_list()函數來至此/proc/dma文件的實現。函數get_dma_list()的實現比較簡單。主要就是遍歷數組dma_chan_busy[],并將那些lock成員為非零值的數組元素輸出到列表中即可。如下:

  int get_dma_list(char *buf)

  {

  int i, len = 0;

  for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {

  if (dma_chan_busy.lock) {

  len += sprintf(buf+len, "%2d: %s

  ",

  i,

  dma_chan_busy.device_id);

  }

  }

  return len;

  } /* get_dma_list */

  5 使用DMA的ISA設備驅動程序

  DMA雖然是一種硬件機制,但它離不開軟件(尤其是設備驅動程序)的配合。任何使用DMA進行數據傳輸的ISA設備驅動程序都必須遵循一定的框架。5.1 DMA通道資源的申請與釋放

   同I/O端口資源類似,設備驅動程序必須在一開始就調用request_dma()函數來向內核申請DMA通道資源的使用權。而且,最好在設備驅動程序的open()方法中完成這個操作,而不是在模塊的初始化例程中調用這個函數。因為這在一定程度上可以讓多個設備共享DMA通道資源(只要多個設備不同時使用一個DMA通道)。這種共享有點類似于進程對CPU的分時共享。

  設備使用完DMA通道后,其驅動程序應該記得調用free_dma()函數來釋放所占用的DMA通道資源。通常,最好再驅動程序的release()方法中調用該函數,而不是在模塊的卸載例程中進行調用。

  還需要注意的一個問題是:資源的申請順序。為了避免死鎖(deadlock),驅動程序一定要在申請了中斷號資源后才申請DMA通道資源。釋放時則要先釋放DMA通道,然后再釋放中斷號資源。

  使用DMA的ISA設備驅動程序的open()方法的如下:

  int xxx_open(struct inode * inode, struct file * filp)

  {

  ┆

  if((err = request_irq(irq,xxx_ISR,SA_INTERRUPT,”YourDeviceName”,NULL))

  return err;

  if((err = request_dma(dmanr, “YourDeviceName”)){

  free_irq(irq, NULL);

  return err;

  }

  ┆

  return 0;

  }

  release()方法的范例代碼如下:

  void xxx_release(struct inode * inode, struct file * filp)

  {

  ┆

  free_dma(dmanr);

  free_irq(irq,NULL);

  ┆

  }

  5.2 申請DMA緩沖區

  由于8237 DMAC只能尋址系統RAM中低16MB物理內存,因此:ISA設備驅動程序在申請DMA緩沖區時,一定要以GFP_DMA標志來調用kmalloc()函數或get_free_pages()函數,以便在系統內存的DMA區中分配物理內存。

  5.3 編程DMAC

  設備驅動程序可以在他的read()方法、write()方法或ISR中對DMAC進行編程,以便準備啟動一個DMA傳輸事務。一個DMA傳輸事務有兩種典型的過程:(1)用戶請求設備進行DMA傳輸;(2)硬件異步地將外部數據寫道系統中。

  用戶通過I/O請求觸發設備進行DMA傳輸的步驟如下:

  1.用戶進程通過系統調用read()/write()來調用設備驅動程序的read()方法或write()方法,然后由設備驅動程序read/write方法負責申請DMA緩沖區,對DMAC進行編程,以準備啟動一個DMA傳輸事務,最后正確地設置設備(setup device),并將用戶進程投入睡眠。

  2.DMAC負責在DMA緩沖區和I/O外設之間進行數據傳輸,并在結束后觸發一個中斷。

  3.設備的ISR檢查DMA傳輸事務是否成功地結束,并將數據從DMA緩沖區中拷貝到驅動程序的其他內核緩沖區中(對于I/O device to memory的情況)。然后喚醒睡眠的用戶進程。

  硬件異步地將外部數據寫到系統中的步驟如下:

  1.外設觸發一個中斷通知系統有新數據到達。

  2.ISR申請一個DMA緩沖區,并對DMAC進行編程,以準備啟動一個DMA傳輸事務,最后正確地設置好外設。

  3.硬件將外部數據寫到DMA緩沖區中,DMA傳輸事務結束后,觸發一個中斷。

  4. ISR檢查DMA傳輸事務是否成功地結束,然后將DMA緩沖區中的數據拷貝驅動程序的其他內核緩沖區中,最后喚醒相關的等待進程。

  網卡就是上述過程的一個典型例子。

  為準備一個DMA傳輸事務而對DMAC進行編程的典型代碼段如下:

  unsigned long flags;

  flags = claim_dma_lock();

  disable_dma(dmanr);

  clear_dma_ff(dmanr);

  set_dma_mode(dmanr,mode);

  set_dma_addr(dmanr, virt_to_bus(buf));

  set_dma_count(dmanr, count);

  enable_dma(dmanr);

  release_dma_lock(flags);

  檢查一個DMA傳輸事務是否成功地結束的代碼段如下:

  int residue;

  unsigned long flags = claim_dma_lock();

  residue = get_dma_residue(dmanr);

  release_dma_lock(flags);

  ASSERT(residue == 0);

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产精品一区二区久激情瑜伽| 亚洲精品视频啊美女在线直播| 久久国产主播精品| 性色av一区二区三区| 亚洲午夜精品福利| 六月婷婷一区| 亚洲欧洲精品一区二区| 亚洲国产一区视频| 日韩午夜精品视频| 国产九九精品视频| 亚洲国产小视频在线观看| 欧美日韩国产小视频| 亚洲毛片在线观看| 欧美日韩的一区二区| 欧美精品免费观看二区| 在线观看视频日韩| 亚洲第一色在线| 亚洲人成网站影音先锋播放| 亚洲免费网站| 久久久久久久999精品视频| 国产精品一区视频网站| 国产亚洲美州欧州综合国| 久久一区精品| 欧美岛国在线观看| 亚洲福利视频网站| 亚洲免费电影在线观看| 久久久免费av| 亚洲人成人一区二区在线观看| 国产三区精品| 伊人久久亚洲美女图片| 欧美黑人在线播放| 原创国产精品91| 亚洲欧美日韩视频二区| 国产一级揄自揄精品视频| 久久综合网hezyo| 欧美www视频| 美女网站久久| 亚洲欧美精品在线| 久久视频精品在线| 欧美色图麻豆| 欲香欲色天天天综合和网| 美女黄毛**国产精品啪啪| 麻豆国产精品777777在线| 亚洲视频一区二区在线观看| 欧美日韩成人一区| 国产精品久久久久久妇女6080| 在线观看国产精品网站| 国产精品爱久久久久久久| 欧美性生交xxxxx久久久| 亚洲电影天堂av| 亚洲专区在线| 老司机aⅴ在线精品导航| 国产精品亚洲视频| 99精品国产热久久91蜜凸| 亚洲一区二区在线观看视频| 亚洲肉体裸体xxxx137| 亚洲欧美日韩国产综合精品二区| 久久av一区二区| 亚洲视频免费看| 欧美久久婷婷综合色| 欧美日韩国产91| 国产精品制服诱惑| 久久综合影音| 日韩亚洲在线观看| 欧美福利小视频| 亚洲欧美视频在线观看| 欧美日韩18| 亚洲精品一区在线观看香蕉| 99国产精品久久久久久久| 伊人久久亚洲美女图片| 国产在线一区二区三区四区| 亚洲风情亚aⅴ在线发布| 国产欧美精品在线| 一级成人国产| 国产精品亚洲综合色区韩国| 久久亚洲综合色一区二区三区| 在线观看成人一级片| 国产噜噜噜噜噜久久久久久久久| 欧美一级理论性理论a| 制服丝袜亚洲播放| 国产精品扒开腿做爽爽爽软件| 欧美一区二区大片| 国产午夜精品美女视频明星a级| 欧美成人官网二区| 欧美国产综合| 国产精品免费观看视频| 国产精品欧美一区喷水| 美女999久久久精品视频| 欧美日韩国产在线一区| 欧美激情综合五月色丁香小说| 国产主播一区二区三区| 国产精品免费aⅴ片在线观看| 午夜精品福利一区二区三区av| 亚洲毛片一区二区| 亚洲性夜色噜噜噜7777| 老司机午夜精品视频| 黄色精品免费| 欧美性大战久久久久久久| 欧美性jizz18性欧美| 国产亚洲a∨片在线观看| 午夜欧美电影在线观看| 亚洲另类一区二区| 亚洲激情第一区| 久热re这里精品视频在线6| 亚洲欧美一级二级三级| 国产精品青草综合久久久久99| 国产视频一区在线观看| 免费在线观看日韩欧美| 国产一区日韩欧美| 日韩一级黄色av| 亚洲国产精品热久久| 国产曰批免费观看久久久| 欧美国产亚洲视频| 亚洲影音先锋| 亚洲激情在线视频| 欧美亚洲免费电影| 狠狠色噜噜狠狠色综合久| 亚洲视频axxx| 亚洲精品在线视频| 一本色道久久综合| 激情欧美日韩| 久久综合久久美利坚合众国| 在线精品视频一区二区| 久久国产精品久久w女人spa| 99热这里只有成人精品国产| 99国产精品久久久| 久久久久久久综合色一本| 亚洲欧美bt| 久久免费视频网| 亚洲资源av| 最新国产精品拍自在线播放| 亚洲欧美日韩国产一区| 国产欧亚日韩视频| 久久精品中文字幕一区二区三区| 一区二区三区日韩欧美| 欧美性猛交xxxx乱大交退制版| 亚洲激情电影中文字幕| 国产一区视频网站| 在线日韩欧美| 欧美日本一区二区三区| 久久阴道视频| 久久免费视频网站| 一本色道久久综合狠狠躁篇怎么玩| 亚洲日韩欧美视频| 国产精品推荐精品| 亚洲一区二区三区四区中文| 欧美午夜电影网| 欧美性大战久久久久| 你懂的国产精品永久在线| 国产精品日日做人人爱| 亚洲国产高清一区二区三区| a4yy欧美一区二区三区| 国产精品三级久久久久久电影| 欧美在线日韩在线| 亚洲风情在线资源站| 伊人精品久久久久7777| 女生裸体视频一区二区三区| 欧美日韩在线播放一区二区| 欧美日韩视频在线一区二区| 亚洲国产精品va在看黑人| 久久久青草青青国产亚洲免观| 国产精品日韩欧美一区二区三区| 激情综合色综合久久| 国产人妖伪娘一区91| 一区二区三区欧美成人| 日韩网站在线观看| 亚洲欧美中日韩| 欧美日韩成人一区二区三区| 国产精品海角社区在线观看| 国产精品久久久对白| 激情综合色丁香一区二区| 欧美日韩视频在线一区二区| 亚洲盗摄视频| 亚洲免费视频观看| 欧美在线视频在线播放完整版免费观看| 亚洲精品久久在线| 亚洲精品一品区二品区三品区| 国产一区二区久久精品| 久久综合给合久久狠狠色| 国产精品免费观看在线| 久久精品免费看| 亚洲午夜国产成人av电影男同| 亚洲国产免费看| 亚洲精品一区二区三| 欧美成人精品高清在线播放| 国产精品v一区二区三区| 欧美日韩一区二区在线视频| 亚洲欧美成人网| 亚洲国产乱码最新视频| 欧美中日韩免费视频| 99精品国产在热久久下载| 亚洲一区二区成人在线观看| 国产欧美精品日韩| 久久只有精品| 一区二区欧美在线观看| 国产日韩精品一区观看| 中文无字幕一区二区三区| 欧美激情精品久久久久久蜜臀| 日韩午夜在线| 久久亚洲综合网| 国产综合香蕉五月婷在线| 亚洲欧美国产高清va在线播| 日韩一级裸体免费视频| 欧美激情精品久久久久久蜜臀| 国产亚洲一区在线播放| 欧美国产日韩一区二区三区| 精品69视频一区二区三区| 亚洲大片在线| 国产人成精品一区二区三| 国产精品日韩二区| 亚洲视频高清| 欧美日韩日韩| 先锋影院在线亚洲| 性久久久久久久久| 亚洲成人原创| 国产精品高潮久久| 国产欧美日韩不卡免费| 久久久精品网| 日韩香蕉视频| 亚洲电影专区| 午夜免费电影一区在线观看| 亚洲日本va在线观看| 国产精品久久久久久久久动漫| 久久亚洲高清| 久久女同互慰一区二区三区| 新67194成人永久网站| 国产综合在线看| 欧美激情视频免费观看| 欧美日韩精品二区| 欧美va天堂在线| 蜜月aⅴ免费一区二区三区| 狠狠爱www人成狠狠爱综合网| 欧美涩涩网站| 欧美一区二区三区四区在线| 中文精品视频| 韩国福利一区| 亚洲国产综合在线| 国产精品美女主播在线观看纯欲| 国产一区亚洲| 欧美福利网址| 国产精品亚洲综合久久| 国产精品美女一区二区在线观看| 欧美午夜片欧美片在线观看| 一本色道久久综合亚洲精品小说| 亚洲少妇自拍| 亚洲第一网站免费视频| 国产亚洲成av人片在线观看桃| 午夜精品在线| 亚洲人屁股眼子交8| 久久精品视频播放| 欧美一区二区在线免费播放| 欧美一区二区私人影院日本| 欧美日韩一区二区三区高清| 久久婷婷国产综合国色天香| 欧美性猛交一区二区三区精品| 卡通动漫国产精品| 欧美中文字幕久久| 亚洲综合色激情五月| 国产精品久久999| 欧美另类变人与禽xxxxx| 免费观看成人www动漫视频| 欧美成人免费大片| 欧美三级黄美女| 国产精品夫妻自拍| 亚洲一二区在线| 国产日韩欧美一区二区| 欧美日韩精品一本二本三本| 欧美二区不卡| 久久精品视频在线免费观看| 影音欧美亚洲| 欧美午夜片在线观看| 国产亚洲一区精品| 欧美二区在线看| 国产精品成人播放| 久久手机精品视频| 久久香蕉国产线看观看网| 一本综合久久| 久久精品动漫| 国产欧美亚洲视频| 免费在线观看成人av| 午夜天堂精品久久久久| 久久人人爽人人| 久久久久久久综合| 老牛国产精品一区的观看方式| 香蕉久久一区二区不卡无毒影院| 亚洲免费黄色| 欧美日本免费一区二区三区| 国外成人在线| 亚洲毛片av在线| 欧美日韩国产综合视频在线| 久久天天躁夜夜躁狠狠躁2022| 亚洲第一区在线| 欧美在线日韩| 欧美制服丝袜第一页| 亚洲一级影院| 欧美在线观看视频在线| 欧美二区视频| 欧美电影电视剧在线观看| 亚洲欧美中文另类| 久久久.com| 国产日韩欧美亚洲| 久久躁日日躁aaaaxxxx| 一区二区三区精密机械公司| 黄色成人av| 欧美体内she精视频在线观看| 国产精品久久久久7777婷婷| 新片速递亚洲合集欧美合集| 欧美另类videos死尸| 亚洲精品极品| 亚洲伊人伊色伊影伊综合网| 国产欧美一区二区三区国产幕精品| 国产精品美女主播在线观看纯欲| 日韩视频一区二区三区在线播放| 久色成人在线| 日韩视频精品在线观看| 老司机亚洲精品| 国产精品久久久久久久电影| 91久久久国产精品| 欧美深夜影院| 午夜视频在线观看一区二区三区| 夜夜爽夜夜爽精品视频| 欧美激情中文字幕一区二区| 亚洲最新视频在线播放| 欧美激情精品久久久久久免费印度| 国产精品视频免费一区| 国产欧美日韩一区二区三区| 在线精品视频在线观看高清| 亚洲精品综合|