亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 中斷.txt

?? 講解linux內核 系統中斷 部分經典講義
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
tasklet_hi_vec[NR_CPU]
struct tasklet_head tasklet_hi_vec[NR_CPUS] __cacheline_aligned;
struct tasklet_head
{
struct tasklet_struct *list;
} __attribute__ ((__aligned__(SMP_CACHE_BYTES)));
    task_hi_action處理的對象是一個tasklet的隊列,每個cpu都有一個對應的tasklet隊列,
    它在tasklet_hi_schedule中動態添加。
3: task_action
/\
|
tasklet_vec[NR_CPU]
[tasklet]
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
void (*func)(unsigned long);
unsigned long data;
};
從上面的分析來看tasklet只是一個調用實體,在do_softirq()中被調用。softirq的組織和結構才是最重要的。


[目錄]




硬中斷

標題   Linux設備驅動程序的中斷
作者 coly (journeyman)
時間 07/02/01 11:24 AM
Linux設備驅動程序的中斷 Coly V0.1
指定參考書:《Linux設備驅動程序》(第一版)
這里總結一下Linux設備驅動程序中涉及的中斷機制。
一、前言
    
Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一下,這里的軟和硬的意思是指和軟件相關以及和硬件相關,而不是軟件實現的中斷或硬件實現的中斷。軟中斷就是“信號機制”。軟中斷不是軟件中斷。Linux通過信號來產生對進程的各種中斷操作,我們現在知道的信號共有31個,其具體內容這里略過,感興趣讀者可參看相關參考文獻[1]。
    
一般來說,軟中斷是由內核機制的觸發事件引起的(例如進程運行超時),但是不可忽視有大量的軟中斷也是由于和硬件有關的中斷引起的,例如當打印機端口產生一個硬件中斷時,會通知和硬件相關的硬中斷,硬中斷就會產生一個軟中斷并送到操作系統內核里,這樣內核就會根據這個軟中斷喚醒睡眠在打印機任務隊列中的處理進程。
    
硬中斷就是通常意義上的“中斷處理程序”,它是直接處理由硬件發過來的中斷信號的。當硬中斷收到它應當處理的中斷信號以后,就回去自己驅動的設備上去看看設備的狀態寄存器以了解發生了什么事情,并進行相應的操作。
    
對于軟中斷,我們不做討論,那是進程調度里要考慮的事情。由于我們討論的是設備驅動程序的中斷問題,所以焦點集中在硬中斷里。我們這里討論的是硬中斷,即和硬件相關的中斷。
二、中斷產生
    
要中斷,是因為外設需要通知操作系統她那里發生了一些事情,但是中斷的功能僅僅是一個設備報警燈,當燈亮的時候中斷處理程序只知道有事情發生了,但發生了什么事情還要親自到設備那里去看才行。也就是說,當中斷處理程序得知設備發生了一個中斷的時候,它并不知道設備發生了什么事情,只有當它訪問了設備上的一些狀態寄存器以后,才能知道具體發生了什么,要怎么去處理。
    
設備通過中斷線向中斷控制器發送高電平告訴操作系統它產生了一個中斷,而操作系統會從中斷控制器的狀態位知道是哪條中斷線上產生了中斷。PC機上使用的中斷控制器是8259,這種控制器每一個可以管理8條中斷線,當兩個8259級聯的時候共可以控制15條中斷線。這里的中斷線是實實在在的電路,他們通過硬件接口連接到CPU外的設備控制器上。
三、IRQ
    
并不是每個設備都可以向中斷線上發中斷信號的,只有對某一條確定的中斷線勇有了控制權,才可以向這條中斷線上發送信號。由于計算機的外部設備越來越多,所以15條中斷線已經不夠用了,中斷線是非常寶貴的資源。要使用中斷線,就得進行中斷線的申請,就是IRQ(Interrupt 
Requirement),我們也常把申請一條中斷線成為申請一個IRQ或者是申請一個中斷號。
    
IRQ是非常寶貴的,所以我們建議只有當設備需要中斷的時候才申請占用一個IRQ,或者是在申請IRQ時采用共享中斷的方式,這樣可以讓更多的設備使用中斷。無論對IRQ的使用方式是獨占還是共享,申請IRQ的過程都是一樣的,分為3步:
1.將所有的中斷線探測一遍,看看哪些中斷還沒有被占用。從這些還沒有被占用的中斷中選一個作為該設備的IRQ。
2.通過中斷申請函數申請選定的IRQ,這是要指定申請的方式是獨占還是共享。
3.根據中斷申請函數的返回值決定怎么做:如果成功了萬事大吉,如果沒成功則或者重新申請或者放棄申請并返回錯誤。
    申請IRQ的過程,在參考書的配的源代碼里有詳細的描述,讀者可以通過仔細閱讀源代碼中的short一例對中斷號申請由深刻的理解。
四、中斷處理程序
    Linux中的中斷處理程序很有特色,它的一個中斷處理程序分為兩個部分:上半部(top half)和下半部(bottom 
half)。之所以會有上半部和下半部之分,完全是考慮到中斷處理的效率。
    
上半部的功能是“登記中斷”。當一個中斷發生時,他就把設備驅動程序中中斷例程的下半部掛到該設備的下半部執行隊列中去,然后就沒事情了--等待新的中斷的到來。這樣一來,上半部執行的速度就會很快,他就可以接受更多她負責的設備產生的中斷了。上半部之所以要快,是因為它是完全屏蔽中斷的,如果她不執行完,其它的中斷就不能被及時的處理,只能等到這個中斷處理程序執行完畢以后。所以,要盡可能多得對設備產生的中斷進行服務和處理,中斷處理程序就一定要快。
    
但是,有些中斷事件的處理是比較復雜的,所以中斷處理程序必須多花一點時間才能夠把事情做完。可怎么樣化解在短時間內完成復雜處理的矛盾呢,這時候Linux引入了下半部的概念。下半部和上半部最大的不同是下半部是可中斷的,而上半部是不可中斷的。下半部幾乎做了中斷處理程序所有的事情,因為上半部只是將下半部排到了他們所負責的設備的中斷處理隊列中去,然后就什么都不管了。下半部一般所負責的工作是察看設備以獲得產生中斷的事件信息,并根據這些信息(一般通過讀設備上的寄存器得來)進行相應的處理。如果有些時間下半部不知道怎么去做,他就使用著名的鴕鳥算法來解決問題--說白了就是忽略這個事件。
    
由于下半部是可中斷的,所以在它運行期間,如果其它的設備產生了中斷,這個下半部可以暫時的中斷掉,等到那個設備的上半部運行完了,再回頭來運行它。但是有一點一定要注意,那就是如果一個設備中斷處理程序正在運行,無論她是運行上半部還是運行下半部,只要中斷處理程序還沒有處理完畢,在這期間設備產生的新的中斷都將被忽略掉。因為中斷處理程序是不可重入的,同一個中斷處理程序是不能并行的。
    在Linux Kernel 
2.0以前,中斷分為快中斷和慢中斷(偽中斷我們這里不談),其中快中斷的下半部也是不可中斷的,這樣可以保證它執行的快一點。但是由于現在硬件水平不斷上升,快中斷和慢中斷的運行速度已經沒有什么差別了,所以為了提高中斷例程事務處理的效率,從Linux 
kernel 2.0以后,中斷處理程序全部都是慢中斷的形式了--他們的下半部是可以被中斷的。
    
但是,在下半部中,你也可以進行中斷屏蔽--如果某一段代碼不能被中斷的話。你可以使用cti、sti或者是save_flag、restore_flag來實現你的想法。至于他們的用法和區別,請參看本文指定參考書中斷處理部分。
進一步的細節請讀者參看本文指定參考書,這里就不再所說了,詳細介紹細節不是我的目的,我的目的是整理概念。
五、置中斷標志位
    
在處理中斷的時候,中斷控制器會屏蔽掉原先發送中斷的那個設備,直到她發送的上一個中斷被處理完了為止。因此如果發送中斷的那個設備載中斷處理期間又發送了一個中斷,那么這個中斷就被永遠的丟失了。
    
之所以發生這種事情,是因為中斷控制器并不能緩沖中斷信息,所以當前一個中斷沒有處理完以前又有新的中斷到達,他肯定會丟掉新的中斷的。但是這種缺陷可以通過設置主處理器(CPU)上的“置中斷標志位”(sti)來解決,因為主處理器具有緩沖中斷的功能。如果使用了“置中斷標志位”,那么在處理完中斷以后使用sti函數就可以使先前被屏蔽的中斷得到服務。
六、中斷處理程序的不可重入性
    
上一節中我們提到有時候需要屏蔽中斷,可是為什么要將這個中斷屏蔽掉呢?這并不是因為技術上實現不了同一中斷例程的并行,而是出于管理上的考慮。之所以在中斷處理的過程中要屏蔽同一IRQ來的新中斷,是因為中斷處理程序是不可重入的,所以不能并行執行同一個中斷處理程序。在這里我們舉一個例子,從這里子例中可以看出如果一個中斷處理程序是可以并行的話,那么很有可能會發生驅動程序鎖死的情況。當驅動程序鎖死的時候,你的操作系統并不一定會崩潰,但是鎖死的驅動程序所支持的那個設備是不能再使用了--設備驅動程序死了,設備也就死了。
    
A是一段代碼,B是操作設備寄存器R1的代碼,C是操作設備寄存器R2的代碼。其中激發PS1的事件會使A1產生一個中斷,然后B1去讀R1中已有的數據,然后代碼C1向R2中寫數據。而激發PS2的事件會使A2產生一個中斷,然后B2刪除R1中的數據,然后C2讀去R2中的數據。
    
如果PS1先產生,且當他執行到A1和B1之間的時候,如果PS2產生了,這是A2會產生一個中斷,將PS2中斷掉(掛到任務隊列的尾部),然后刪除了R1的內容。當PS2運行到C2時,由于C1還沒有向R2中寫數據,所以C2將會在這里被掛起,PS2就睡眠在代碼C2上,直到有數據可讀的時候被信號喚醒。這是由于PS1中的B2原先要讀的R1中的數據被PS2中的B2刪除了,所以PS1頁會睡眠在B1上,直到有數據可讀的時候被信號喚醒。這樣一來,喚醒PS1和PS2的事件就永遠不會發生了,因此PS1和PS2之間就鎖死了。
    
由于設備驅動程序要和設備的寄存器打交道,所以很難寫出可以重入的代碼來,因為設備寄存器就是全局變量。因此,最簡潔的辦法就是禁止同一設備的中斷處理程序并行,即設備的中斷處理程序是不可重入的。
    有一點一定要清楚:在2.0版本以后的Linux 
kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設備的下半部可以互相中斷,但一個特定的下半部不能被它自己所中斷(即同一個下半部不能并)。
    
由于中斷處理程序要求不可重入,所以程序員也不必為編寫可重入的代碼而頭痛了。以我的經驗,編寫可重入的設備驅動程序是可以的,編寫可重入的中斷處理程序是非常難得,幾乎不可能。
七、避免競爭條件的出現
    
我們都知道,一旦競爭條件出現了,就有可能會發生死鎖的情況,嚴重時可能會將整個系統鎖死。所以一定要避免競爭條件的出現。這里我不多說,大家只要注意一點:絕大多數由于中斷產生的競爭條件,都是在帶有中斷的
內核進程被睡眠造成的。所以在實現中斷的時候,一定要相信謹慎的讓進程睡眠,必要的時候可以使用cli、sti或者save_flag、restore_flag。具體細節請參看本文指定參考書。
八、實現
    
如何實現驅動程序的中斷例程,是各位讀者的事情了。只要你們仔細的閱讀short例程的源代碼,搞清楚編寫驅動程序中斷例程的規則,就可以編寫自己的中斷例程了。只要概念正確,
    在正確的規則下編寫你的代碼,那就是符合道理的東西。我始終強調,概念是第一位的,能編多少代碼是很其次的,我們一定要概念正確,才能進行正確的思考。
九、小結
    本文介紹了Linux驅動程序中的中斷,如果讀者已經新癢了的話,那么打開機器開始動手吧!
Time for you to leave!
參考文獻:
1.Linux網絡編程
2.編程之道
3.Linux設備驅動程序
4.Mouse drivers
5.Linux Kernel Hacking Guide
6.Unreliable Guide To Hacking The Linux Kernel


[目錄]




定時器代碼分析

時鐘和定時器中斷
IRQ 0 [Timer]
|
\|/
|IRQ0x00_interrupt        //   wrapper IRQ handler
   |SAVE_ALL              ---
      |do_IRQ                |   wrapper routines
         |handle_IRQ_event  ---
            |handler() -> timer_interrupt  // registered IRQ 0 handler
               |do_timer_interrupt
                  |do_timer
                     |jiffies++;
                     |update_process_times
                     |if (--counter <= 0) { // if time slice ended then
                        |counter = 0;        //   reset counter
                        |need_resched = 1;   //   prepare to reschedule
                     |}
         |do_softirq
         |while (need_resched) { // if necessary
            |schedule             //   reschedule
            |handle_softirq
         |}
   |RESTORE_ALL
·IRQ0x00_interrupt, SAVE_ALL [include/asm/hw_irq.h]
·do_IRQ, handle_IRQ_event [arch/i386/kernel/irq.c]
·timer_interrupt, do_timer_interrupt [arch/i386/kernel/time.c]
·do_timer, update_process_times [kernel/timer.c]
·do_softirq [kernel/soft_irq.c]
·RESTORE_ALL, while loop [arch/i386/kernel/entry.S]
    
系統啟動核心時,調用start_kernal()繼續各方面的初始化,在這之前,各種中斷都被禁止,只有在完成必要的初始化后,直到執行完Kmalloc_init()后,才允許中斷(init\main.c)。與時鐘中斷有關的部分初始化如下:
    調用trap_init()設置各種trap入口,如system_call、GDT entry、LDT entry、call 
gate等。其中0~17為各種錯誤入口,18~47保留。
    
調用init_IRQ()函數設置核心系統的時鐘周期為10ms,即100HZ,它是以后按照輪轉法進行CPU調度時所依照的基準時鐘周期。每10ms產生的時鐘中斷信號直接輸入到第一塊8259A的INT 
0(即irq0)。初始化中斷矢量表中從0x20起的17個中斷矢量,用bad_IRQ#_interrupt函數的地址(#為中斷號)填寫。
    
調用sched_init()函數,設置啟動第一個進程init_task。設置用于管理bottom_half機制的數據結構bh_base[],規定三類事件的中斷處理函數,即時鐘TIMER_BH、設備TQUEUE_BH和IMMEDIATE_BH。
    
調用time_init()函數,首先讀取當時的CMOS時間,最后調用setup_x86_irq(0,&irq0)函數,把irq0掛到irq_action[0]隊列的后面,并把中斷矢量表中第0x20項,即timer中斷對應的中斷矢量改為IRQ0_interrupt函數的地址,在irq0中,指定時間中斷服務程序是timer_interrupt,
     static struct irqaction irq0  = { timer_interrupt, 0, 0, "timer", NULL, 
NULL}
    結構irqaction的定義如下:
        struct irqaction {
            void (*handler)(int, void *, struct pt_regs *);  /* 中斷服務函數入口 */
            unsigned long flags;                      /* 服務允中與否標記 */
        unsigned long mask;
            const char *name;
            void *dev_id;
          struct irqaction *next;
    };
    
其中,若flag==SA_INTERRUPT,則中斷矢量改為fast_IRQ#_interrupt,在執行中斷服務的過程中不允許出現中斷,若為其它標記,則中斷矢量為IRQ#_interrupt,在執行中斷服務的過程中,允許出現中斷。
Irq_action的定義與初始化如下:
    static void (*interrupt[17])(void) = {IRQ#_interrupt};
            static void (*fast_interrupt[16])(void) = {fast_IRQ#_interrupt};
    static void (*bad_interrupt[16])(void) = {bad_IRQ#_interrupt};(以上#為中斷號)
    static struct irqaction *irq_action[16] = {
            NULL, NULL, NULL, NULL,
            NULL, NULL, NULL, NULL,
            NULL, NULL, NULL, NULL,
            NULL, NULL, NULL, NULL
    };
    
irq_action是一個全局數組,每個元素指向一個irq隊列,共16個irq隊列,時鐘中斷請求隊列在第一個隊列,即irq_action[0]。當每個中斷請求到來時,都調用setup_x86_irq把該請求掛到相應的隊列的后面。
    以后,系統每10ms產生一次時鐘中斷信號,該信號直接輸入到第一塊8259A的INT 
0(即irq0)。CPU根據中斷矢量表和中斷源,找到中斷矢量函數入口IRQ0_interrupt(程序運行過程中允許中斷)或者fast_IRQ0_interrupt(程序運行過程中不允許中斷)或者bad_IRQ0_interrupt(不執行任何動作,直接返回),這些函數由宏BUILD_TIMER_IRQ(chip, 
nr, mask)展開定義。
宏BUILD_TIMER_IRQ(chip, nr, mask)的定義如下:
#define BUILD_TIMER_IRQ(chip,nr,mask) \
asmlinkage void IRQ_NAME(nr); \
asmlinkage void FAST_IRQ_NAME(nr); \
asmlinkage void BAD_IRQ_NAME(nr); \
__asm__( \
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(fast_IRQ) #nr "_interrupt:\n\t" \
SYMBOL_NAME_STR(bad_IRQ) #nr "_interrupt:\n\t" \
SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \
        "pushl $-"#nr"-2\n\t" \
        SAVE_ALL \
        ENTER_KERNEL \
        ACK_##chip(mask,(nr&7)) \
        "incl "SYMBOL_NAME_STR(intr_count)"\n\t"\  /* intr_count為進入臨界區的同步信號量 */
        "movl %esp,%ebx\n\t" \
        "pushl %ebx\n\t" \
        "pushl $" #nr "\n\t" \                                                /* 
把do_irq函數參數壓進堆棧 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲品质自拍视频网站| 日韩一区二区精品| av在线播放一区二区三区| av一本久道久久综合久久鬼色| 久久久噜噜噜久久人人看| 亚洲三级电影全部在线观看高清| 五月婷婷综合在线| 国产乱妇无码大片在线观看| 成人av电影在线| 日韩你懂的在线观看| 亚洲免费观看高清完整版在线观看熊| 99re在线精品| 久久久久国产精品人| 国产精品影视在线| 亚洲人亚洲人成电影网站色| 欧洲av一区二区嗯嗯嗯啊| 久久婷婷一区二区三区| 日日夜夜一区二区| 日本久久电影网| 亚洲国产精品99久久久久久久久| 五月激情综合色| 精品美女一区二区| 美国一区二区三区在线播放| 欧美在线短视频| 蜜臀久久99精品久久久久宅男| 国产欧美久久久精品影院| 国内外精品视频| 91麻豆精品国产91久久久久久| 一区二区三区不卡视频在线观看 | 8x福利精品第一导航| 另类欧美日韩国产在线| 欧美精品99久久久**| 亚洲综合精品久久| 91蝌蚪porny九色| 国产精品人妖ts系列视频| 激情成人午夜视频| 玉米视频成人免费看| 91麻豆高清视频| 韩国精品一区二区| 一区2区3区在线看| 中日韩av电影| 91精品国产麻豆| 免费一级欧美片在线观看| 日韩欧美www| 日本精品视频一区二区三区| 国产精品亚洲а∨天堂免在线| 亚洲一区自拍偷拍| 欧美激情一区二区| 日韩视频免费直播| 欧美日韩亚洲综合| 日韩精品91亚洲二区在线观看| 亚洲欧美色一区| 久久久精品免费免费| 日韩午夜精品电影| 欧美怡红院视频| 精品在线亚洲视频| 国产欧美一区二区在线| 欧美一级免费观看| 欧美三级欧美一级| 91国偷自产一区二区开放时间 | 成人av一区二区三区| 精品在线免费观看| 视频在线观看91| 亚洲精品中文在线| 亚洲欧美偷拍卡通变态| 中文字幕一区免费在线观看| 在线视频亚洲一区| 一本久久综合亚洲鲁鲁五月天 | 韩国毛片一区二区三区| 日本不卡视频一二三区| 无码av中文一区二区三区桃花岛| 亚洲综合在线观看视频| 一区二区三区在线观看动漫| 亚洲欧美日韩中文播放| 亚洲色图在线播放| 亚洲免费电影在线| 亚洲综合清纯丝袜自拍| 亚洲综合激情网| 午夜欧美在线一二页| 亚洲18色成人| 国产日韩欧美综合一区| 2021国产精品久久精品| 亚洲精品在线观| 欧美日本在线一区| 成人午夜免费av| 亚洲国产成人av网| 国产精品嫩草久久久久| 国产精品久久久久久久久果冻传媒| 欧美日韩国产精选| 91精品福利在线一区二区三区| 欧美日韩免费在线视频| 欧美一区二区三区日韩| 精品人在线二区三区| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩三级一区| 欧美成人精品二区三区99精品| 2欧美一区二区三区在线观看视频| 久久久久9999亚洲精品| 中文字幕日本不卡| 亚洲一级在线观看| 久久成人麻豆午夜电影| 国产露脸91国语对白| 不卡一卡二卡三乱码免费网站| 91小视频在线免费看| 欧美在线观看禁18| 久久一二三国产| 亚洲天堂中文字幕| 偷拍日韩校园综合在线| 国产精选一区二区三区| 99国产精品视频免费观看| 欧美色爱综合网| 精品盗摄一区二区三区| 亚洲欧美视频一区| 久久国产精品99久久人人澡| 不卡视频在线看| 欧美丰满少妇xxxxx高潮对白| 久久精品欧美日韩精品| 亚洲综合在线观看视频| 国产在线观看免费一区| 激情综合色播五月| 色综合久久88色综合天天免费| 91精品婷婷国产综合久久竹菊| 国产拍揄自揄精品视频麻豆| 亚洲国产一区视频| 国产美女娇喘av呻吟久久| 日本精品裸体写真集在线观看| 欧美精品精品一区| 国产精品三级av| 日韩国产欧美在线观看| 日韩电影一区二区三区| 9人人澡人人爽人人精品| 91精品在线观看入口| 亚洲色图制服诱惑| 麻豆精品视频在线观看| 日本高清不卡aⅴ免费网站| 日韩精品专区在线影院重磅| 亚洲美女淫视频| 国产一区欧美一区| 91精品国产综合久久久蜜臀粉嫩| 国产精品美女一区二区三区| 三级在线观看一区二区| 色噜噜狠狠色综合欧洲selulu| 精品精品国产高清一毛片一天堂| 亚洲国产视频网站| voyeur盗摄精品| 久久一日本道色综合| 日本特黄久久久高潮| 一本色道久久综合亚洲aⅴ蜜桃 | av亚洲精华国产精华精华| 精品入口麻豆88视频| 日韩黄色在线观看| 欧美性色黄大片手机版| |精品福利一区二区三区| 国产毛片精品国产一区二区三区| 欧美伦理影视网| 亚洲永久精品大片| 色综合久久久久综合| 亚洲欧洲成人av每日更新| 成人综合在线观看| 久久婷婷国产综合精品青草| 久久超碰97人人做人人爱| 欧美日韩mp4| 日韩主播视频在线| 欧美人狂配大交3d怪物一区| 一区二区三区欧美久久| 99久久久久久| 亚洲天堂av一区| www.av亚洲| 日韩毛片在线免费观看| 91免费观看国产| 亚洲视频一区在线观看| 91影院在线免费观看| 国产精品超碰97尤物18| 99热精品一区二区| 亚洲日穴在线视频| 欧美午夜一区二区三区| 亚洲国产中文字幕在线视频综合| 欧美在线小视频| 午夜精品福利一区二区蜜股av| 欧美性一级生活| 日本不卡一区二区三区| 日韩免费观看高清完整版| 精品制服美女丁香| 国产欧美精品一区二区色综合朱莉| 成人av电影在线网| 亚洲特级片在线| 在线免费一区三区| 午夜精品视频在线观看| 日韩无一区二区| 国产成人啪午夜精品网站男同| 在线免费不卡电影| 日韩二区三区在线观看| 欧美一区二区播放| 国模无码大尺度一区二区三区| 国产精品网曝门| 91久久人澡人人添人人爽欧美| 天天影视涩香欲综合网 | 久久久久国产免费免费| 9i看片成人免费高清| 日产国产高清一区二区三区|