家電維修班,手機(jī)維修班,電腦維修班,電工班,焊工班,液晶電視維修班,電動(dòng)工具維修班、電動(dòng)車摩托車維修班、網(wǎng)絡(luò)營(yíng)銷培訓(xùn)、網(wǎng)站設(shè)計(jì)培訓(xùn)、淘寶培訓(xùn)---全國(guó)招生 家電維修班,手機(jī)維修班,電腦維修班,電工班,焊工班,液晶電視維修班,電動(dòng)工具維修班、電動(dòng)車摩托車維修班、網(wǎng)絡(luò)營(yíng)銷培訓(xùn)、網(wǎng)站設(shè)計(jì)培訓(xùn)、淘寶培訓(xùn)---全國(guó)招生

中日欧洲精品视频在线-中日韩在线观看-中日韩一区二区三区-中日韩精品视频在线观看-狂野欧美老黑粗又硬-狂野猛交xxxx吃奶

您的位置:網(wǎng)站首頁 > 電器維修資料網(wǎng) > 正文 >

linux內(nèi)核中一些常用的數(shù)據(jù)結(jié)構(gòu)和操作

★★★★★【文章導(dǎo)讀】:linux內(nèi)核中一些常用的數(shù)據(jù)結(jié)構(gòu)和操作具體內(nèi)容是:};鏈表頭的初始化,注意,結(jié)構(gòu)中的指針為NULL并不是初始化,而是指向自身才是初始化,如果只是按普通情況下的置為NULL,而不是指向自身,系統(tǒng)會(huì)崩潰,這是一個(gè)容易犯的錯(cuò)誤:#defineLIST_HEAD_INIT(name){&(nAME…

來源: 日期:2013-12-11 14:27:12 人氣:標(biāo)簽:

linux內(nèi)核中一些常用的數(shù)據(jù)結(jié)構(gòu)和操作

    };鏈表頭的初始化,注意,結(jié)構(gòu)中的指針為NULL并不是初始化,而是指向自身才是初始化,如果只是按普通情況下的置為NULL,而不是指向自身,系統(tǒng)會(huì)崩潰,這是一個(gè)容易犯的錯(cuò)誤:#define LIST_HEAD_INIT(name) { &(nAME), &(name) }#define LIST_HEAD(name)

    struct list_head name = LIST_HEAD_INIT(name)#define INIT_LIST_HEAD(ptr) do {

    (ptr)->next = (ptr); (ptr)->prev = (ptr);

    } while (0) 常用的鏈表操作:插入到鏈表頭:

    void list_add(struct list_head *new, struct list_head *head);插入到鏈表尾:

    void list_add_tail(struct list_head *new, struct list_head *head);刪除鏈表節(jié)點(diǎn):

    void list_del(struct list_head *entry);將節(jié)點(diǎn)移動(dòng)到另一鏈表:

    void list_move(struct list_head *list, struct list_head *head);將節(jié)點(diǎn)移動(dòng)到鏈表尾:

    void list_move_tail(struct list_head *list,struct list_head *head);判斷鏈表是否為空,返回1為空,0非空

    int list_empty(struct list_head *head);把兩個(gè)鏈表拼接起來:

    void list_splICe(struct list_head *list, struct list_head *head);取得節(jié)點(diǎn)指針:

    #define list_entry(ptr, type, member)

    ((type *)((char *)(ptr)-(unsigned lONg)(&((type *)0)->member)))遍歷鏈表中每個(gè)節(jié)點(diǎn):

    #define list_for_each(pos, head)

    for (pos = (head)->next, prefetch(pos->next); pos != (head);

    pos = pos->next, prefetch(pos->next))逆向循環(huán)鏈表中每個(gè)節(jié)點(diǎn):

    #define list_for_each_prev(pos, head)

    for (pos = (head)->prev, prefetch(pos->prev); pos != (head);

    pos = pos->prev, prefetch(pos->prev))舉例:LISH_HEAD(mylist);struct my_list{

    struct list_head list;

    int data;

    };stATIc int ini_list(void)

    {

    struct my_list *p;

    int i;

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

    p=kmalLOC(sizeof(struct my_list), GFP_KERNEL);

    list_add(&p->list, &mylist);

    }

    }

    在內(nèi)存中形成如下結(jié)構(gòu)的一個(gè)雙向鏈表:+---------------------------------------------------------------+

    | |

    | mylist 99 98 0 |

    | +----+ +---------+ +---------+ +---------+ |

    +->|next|--->|list.next|--->|list.next|--->...--->|list.next|---+

    |----| |---------| |---------| |---------|

    +--|prev|<---|list.prev|<---|list.prev|<---...<---|list.prev|<--+

    | +----+ |---------| |---------| |---------| |

    | | data | | data | | data | |

    | +---------+ +---------+ +---------+ |

    | |

    +---------------------------------------------------------------+知道了鏈表頭就能遍歷整個(gè)鏈表,如果是用list_add()插入新節(jié)點(diǎn)的話,從鏈表頭的next方向看是一個(gè)堆棧型。從鏈表中刪除節(jié)點(diǎn)很容易:staTIc void del_item(struct my_list *p)

    {

    list_del(&p->list, &mylist);

    kfree(p);

    } 重要的宏是list_entry,這個(gè)宏的思路是根據(jù)鏈表元素結(jié)構(gòu)中鏈表頭結(jié)構(gòu)list_head的地址推算出鏈表元素結(jié)構(gòu)的實(shí)際地址:#define list_entry(ptr, type, member)

    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))ptr是鏈表元素結(jié)構(gòu)(如struct my_list)中鏈表頭結(jié)構(gòu)list_head的地址

    member是鏈表元素結(jié)構(gòu)(如struct my_list)中鏈表頭結(jié)構(gòu)list_head參數(shù)的名稱

    type是鏈表元素結(jié)構(gòu)類型(如struct my_list)計(jì)算原理是根據(jù)鏈表頭結(jié)構(gòu)list_head的地址減去其在鏈表元素結(jié)構(gòu)中的偏移位置而得到鏈表元素結(jié)構(gòu)的地址。例如:static void print_list(void)

    {

    struct list_head *cur;

    struct my_list *p;list_for_each(cur, &mylist){

    p=list_entry(cur, struct my_list, list);

    printk("data=%dn", p->data);

    }

    }優(yōu)點(diǎn):這樣就可以用相同的數(shù)據(jù)處理方式來描述所有雙向鏈表,不用再單獨(dú)為各個(gè)鏈表編寫各種編輯函數(shù)。缺點(diǎn):

    1) 鏈表頭中元素置為NULL不是初始化,與普通習(xí)慣不同;

    2) 仍然需要單獨(dú)編寫各自的刪除整個(gè)鏈表的函數(shù),不能統(tǒng)一處理,因?yàn)椴荒鼙WC所有鏈表元素結(jié)構(gòu)中鏈表頭結(jié)構(gòu)list_head的偏移地址都是相同的,當(dāng)然如果把鏈表頭結(jié)構(gòu)list_head都作為鏈表元素結(jié)構(gòu)的第一個(gè)參數(shù),就可以用統(tǒng)一的刪除整個(gè)鏈表的函數(shù)。

    3. HASH表HASH表適用于不需要對(duì)整個(gè)空間元素進(jìn)行排序,而是只需要能快速找到某個(gè)元素的場(chǎng)合,是一種以空間換時(shí)間的方法,本質(zhì)也是線性表,但由一個(gè)大 的線性表拆分為了多個(gè)小線性表,由于只需要查找小表,因此搜索速度就會(huì)線性查整個(gè)大表提高很多,理想情況下,有多少個(gè)小線性表,搜索速度就提高了多少倍, 通常把小線性表的表頭綜合為一個(gè)數(shù)組,大小就是HASH表的數(shù)量。HASH表速度的關(guān)鍵是HASH函數(shù)的設(shè)計(jì),HASH函數(shù)根據(jù)每個(gè)元素中固定的參數(shù)進(jìn)行計(jì)算,算出一個(gè)不大于HASH表數(shù)量的索引值,表示該元 素需要放在該索引號(hào)對(duì)應(yīng)的那個(gè)表中,對(duì)于固定的參數(shù),計(jì)算結(jié)果始終是固定的,但對(duì)于不同的參數(shù)值,希望計(jì)算出來的結(jié)果能盡可能地平均到每個(gè)索引值, HASH函數(shù)計(jì)算得越平均,表示每個(gè)小表中元素的數(shù)量都會(huì)差不多,這樣搜索性能將越好。HASH函數(shù)也要盡可能的簡(jiǎn)單,以減少計(jì)算時(shí)間,常用的算法是將參 數(shù)累加求模,在include/linux/jhash.h中已經(jīng)定義了一些HASH計(jì)算函數(shù),可直接使用。HASH表在路由cache表,狀態(tài)連接表等處用得很多。舉例,連接跟蹤中根據(jù)tuple值計(jì)算HASH:// net/ipv4/netfiLTEr/ip_conntrack_core.cu_int32_t

    hash_conntrack(const struct ip_conntrack_tuple *tuple)

    {

    #if 0

    dump_tuple(tuple);

    #endif

    return (jhash_3words(tuple->SRC.ip,

    (tuple->dst.ip ^ tuple->dst.protonum),

    (tuple->src.u.all | (tuple->dst.u.all << 16)),

    ip_conntrack_hash_rnd) % ip_conntrack_htable_size);

    }// include/linux/jhash.h

    static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)

    {

    a += JHASH_GOLDEN_RATIO;

    b += JHASH_GOLDEN_RATIO;

    c += initval;__jhash_mix(a, b, c);return c;

    }4. 定時(shí)器(timer)linux內(nèi)核定時(shí)器由以下結(jié)構(gòu)描述:/* include/linux/timer.h */

    struct timer_list {

    struct list_head list;

    unsigned long expires;

    unsigned long data;

    void (*function)(unsigned long);

    };list:timer鏈表

    expires:到期時(shí)間

    function:到期函數(shù),時(shí)間到期時(shí)調(diào)用的函數(shù)

    data:傳給到期函數(shù)的數(shù)據(jù),實(shí)際應(yīng)用中通常是一個(gè)指針轉(zhuǎn)化而來,該指針指向一個(gè)結(jié)構(gòu)

    timer的操作:增加timer,將timer掛接到系統(tǒng)的timer鏈表:

    extern void add_timer(struct timer_list * timer);刪除timer,將timer從系統(tǒng)timer鏈表中拆除:

    extern int del_timer(struct timer_list * timer);

    (del_timer()函數(shù)可能會(huì)失敗,這是因?yàn)樵搕imer本來已經(jīng)不在系統(tǒng)timer鏈表中了,也就是已經(jīng)刪除過了)對(duì)于SMP系統(tǒng),刪除timer 好使用下面的函數(shù)來防止沖突:

    extern int del_timer_sync(struct timer_list * timer);修改timer,修改timer的到期時(shí)間:

    int mod_timer(struct timer_list *timer, unsigned long expires);通常用法:

    struct timer_list通常作為數(shù)據(jù)結(jié)構(gòu)中的一個(gè)參數(shù),在初始化結(jié)構(gòu)的時(shí)候初始化timer,表示到期時(shí)要進(jìn)行的操作,實(shí)現(xiàn)定時(shí)動(dòng)作,通常更多的是作為超時(shí) 處理的,timer函數(shù)作為超時(shí)時(shí)的資源釋放函數(shù)。注意:如果超時(shí)了運(yùn)行超時(shí)函數(shù),此時(shí)系統(tǒng)是處在時(shí)鐘中斷的bottom half里的,不能進(jìn)行很復(fù)雜的操作,如果要完成一些復(fù)雜操作,如到期后的數(shù)據(jù)發(fā)送,不能直接在到期函數(shù)中處理,而是應(yīng)該在到期函數(shù)中發(fā)個(gè)信號(hào)給特定內(nèi)核 線程轉(zhuǎn)到top half進(jìn)行處理。為判斷時(shí)間的先后,內(nèi)核中定義了以下宏來判斷:#define time_after(a,b) ((long)(b) - (long)(a) < 0)

    #define time_before(a,b) time_after(b,a)#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)

    #define time_before_eq(a,b) time_after_eq(b,a)這里用到了一個(gè)技巧,由于linux中的時(shí)間是無符號(hào)數(shù),這里先將其轉(zhuǎn)換為有符號(hào)數(shù)后再判斷,就能解決時(shí)間回繞問題,當(dāng)然只是一次回繞,回繞兩次當(dāng)然是判斷不出來的,具體可自己實(shí)驗(yàn)體會(huì)。5. 內(nèi)核線程(kernel_thread)內(nèi)核中新線程的建立可以用kernel_thread函數(shù)實(shí)現(xiàn),該函數(shù)在kernel/fork.c中定義:long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)fn:內(nèi)核線程主函數(shù);

    arg:線程主函數(shù)的參數(shù);

    flags:建立線程的標(biāo)志;內(nèi)核線程函數(shù)通常都調(diào)用daemonize()進(jìn)行后臺(tái)化作為一個(gè)獨(dú)立的線程運(yùn)行,然后設(shè)置線程的一些參數(shù),如名稱,信號(hào)處理等,這也不是必須 的,然后就進(jìn)入一個(gè)死循環(huán),這是線程的主體部分,這個(gè)循環(huán)不能一直在運(yùn)行,否則系統(tǒng)就死在這了,或者是某種事件驅(qū)動(dòng)的,在事件到來前是睡眠的,事件到來后 喚醒進(jìn)行操作,操作完后繼續(xù)睡眠;或者是定時(shí)睡眠,醒后操作完再睡眠;或者加入等待隊(duì)列通過schedule()調(diào)度獲得執(zhí)行時(shí)間。總之是不能一直占著 CPU。以下是內(nèi)核線程的一個(gè)實(shí)例,取自kernel/context.c:int start_context_thread(void)

    {

    static struct completion startup __initdata = COMPLETION_INITIALIZER(startup);kernel_thread(context_thread, &startup, CLONE_FS | CLONE_FILES);

    wait_for_completion(&startup);

    return 0;

    }static int context_thread(void *startup)

    {

    struct task_struct *curtask = current;

    DECLARE_WAITQUEUE(wait, curtask);

    struct k_sigaction sa;daemonize();

    strcpy(curtask->comm, "keventd");

    keventd_running = 1;

    keventd_task = curtask;sPIN_lock_IRQ(&curtask->sigmask_lock);

    siginitsetinv(&curtask->blocked, sigmask(SIGCHLD));

    recalc_sigpending(curtask);

    spin_unlock_irq(&curtask->sigmask_lock);complete((struct completion *)startup);/* Install a handler so SIGCLD is delivered */

    sa.sa.sa_handler = SIG_IGN;

    sa.sa.sa_flags = 0;

    siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));

    do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0);/*

    * If one of the functions on a task queue re-adds itself

    * to the task queue we call schedule() in state TASK_RUNNING

    */

    for (;;) {

    set_task_state(curtask, TASK_INTERRUPTIBLE);

    add_wait_queue(&context_task_wq, &wait);

    if (TQ_ACTIVE(tq_context))

    set_task_state(curtask, TASK_RUNNING);

    schedule();

    remove_wait_queue(&context_task_wq, &wait);

    run_task_queue(&tq_context);

    wake_up(&context_task_done);

    if (signal_pending(curtask)) {

    while (waitpid(-1, (unsigned int *)0, __WALL|WNOHANG) > 0)

    ;

    spin_lock_irq(&curtask->sigmask_lock);

    flush_signals(curtask);

    recalc_sigpending(curtask);

    spin_unlock_irq(&curtask->sigmask_lock);

    }

    }

    }6. 結(jié)構(gòu)地址在C中,結(jié)構(gòu)地址和結(jié)構(gòu)中第一個(gè)元素的地址是相同的,因此在linux內(nèi)核中經(jīng)常出現(xiàn)使用結(jié)構(gòu)第一個(gè)元素的地址來表示結(jié)構(gòu)地址的情況,在讀代碼時(shí)要注意這一點(diǎn),這和list_entry宏的意思一樣。如:

    struct my_struct{

    int a;

    int b;

    }c;if(&c == &c.a){ // always true

    ...

    }


【看看這篇文章在百度的收錄情況】

相關(guān)文章

聯(lián)系方式

  • 0731-85579057 , 13308461099
  • 點(diǎn)擊這里給我發(fā)消息點(diǎn)擊這里給我發(fā)消息點(diǎn)擊這里給我發(fā)消息
網(wǎng)站欄目導(dǎo)航: 培訓(xùn)課程 手機(jī)硬件 手機(jī)軟件 綜合維修 學(xué)校資訊 考證指南 就業(yè)導(dǎo)航 招生指南 教學(xué)管理 入學(xué)須知 學(xué)校圖片 教學(xué)大綱 師資力量 學(xué)生感言 學(xué)校概況 教學(xué)實(shí)景 手機(jī)維修培訓(xùn)資訊 電腦維修培訓(xùn) 維修間故事 手機(jī)維修培訓(xùn) 液晶電視維修培訓(xùn) 家電維修資料網(wǎng) 電器維修資料網(wǎng) 招生地區(qū) 刷機(jī)教程 家電維修 手機(jī)技巧 老版網(wǎng)站 招生平臺(tái)網(wǎng)絡(luò)工程
友情鏈接: 監(jiān)控安裝培訓(xùn) 電動(dòng)工具維修 家電維修學(xué)校 電工培訓(xùn)學(xué)校 液晶電視維修 焊工培訓(xùn)學(xué)校 電工焊工學(xué)校 電腦維修學(xué)校 家電維修培訓(xùn) 電腦維修培訓(xùn) 家裝電工培訓(xùn)網(wǎng)絡(luò)安裝維護(hù) 主板維修 液晶顯示器 筆記本電腦維修 電腦組裝維護(hù) 電腦硬件維修 電腦維修 電工考證 電工證 裝修電工 水電工 維修電工 電工 焊接技術(shù) 電焊工 焊工 電動(dòng)設(shè)備維修 電動(dòng)工具維修 制冷維修 空調(diào)維修 冰箱維修  更多>>
陽光-手機(jī)維修教育品牌學(xué)校
點(diǎn)擊這里給我發(fā)消息 點(diǎn)擊這里給我發(fā)消息 點(diǎn)擊這里給我發(fā)消息
電工培訓(xùn)學(xué)校 電動(dòng)車維修學(xué)校 摩托車維修學(xué)校 摩托車維修培訓(xùn) 手機(jī)維修培訓(xùn) 家電維修培訓(xùn) 電腦維修培訓(xùn) 電動(dòng)工具維修培訓(xùn) 液晶電視維修培訓(xùn) 安防監(jiān)控培訓(xùn) 空調(diào)維修培訓(xùn) 網(wǎng)絡(luò)營(yíng)銷培訓(xùn) 網(wǎng)站設(shè)計(jì)培訓(xùn) 淘寶網(wǎng)店培訓(xùn) 電器維修培訓(xùn) 家電維修學(xué)校 電工培訓(xùn) 焊工培訓(xùn) 電工學(xué)校 電工培訓(xùn)學(xué)校 電動(dòng)車維修學(xué)校 摩托車維修學(xué)校 摩托車維修培訓(xùn) 手機(jī)維修培訓(xùn) 家電維修培訓(xùn) 電腦維修培訓(xùn) 電動(dòng)工具維修培訓(xùn) 液晶電視維修培訓(xùn) 安防監(jiān)控培訓(xùn) 空調(diào)維修培訓(xùn) 網(wǎng)絡(luò)營(yíng)銷培訓(xùn) 網(wǎng)站設(shè)計(jì)培訓(xùn) 淘寶網(wǎng)店培訓(xùn) 電器維修培訓(xùn) 家電維修學(xué)校 電工培訓(xùn) 焊工培訓(xùn) 電工學(xué)校 電工培訓(xùn)學(xué)校 電動(dòng)車維修學(xué)校 摩托車維修學(xué)校 摩托車維修培訓(xùn) 手機(jī)維修培訓(xùn) 家電維修培訓(xùn) 電腦維修培訓(xùn) 電動(dòng)工具維修培訓(xùn) 液晶電視維修培訓(xùn) 安防監(jiān)控培訓(xùn) 空調(diào)維修培訓(xùn) 網(wǎng)絡(luò)營(yíng)銷培訓(xùn) 網(wǎng)站設(shè)計(jì)培訓(xùn) 淘寶網(wǎng)店培訓(xùn) 電器維修培訓(xùn) 家電維修學(xué)校 電工培訓(xùn) 焊工培訓(xùn) 電工學(xué)校 電工培訓(xùn)學(xué)校 電動(dòng)車維修學(xué)校 摩托車維修學(xué)校 摩托車維修培訓(xùn) 手機(jī)維修培訓(xùn) 家電維修培訓(xùn) 電腦維修培訓(xùn) 電動(dòng)工具維修培訓(xùn) 液晶電視維修培訓(xùn) 安防監(jiān)控培訓(xùn) 空調(diào)維修培訓(xùn) 網(wǎng)絡(luò)營(yíng)銷培訓(xùn) 網(wǎng)站設(shè)計(jì)培訓(xùn) 淘寶網(wǎng)店培訓(xùn) 電器維修培訓(xùn) 家電維修學(xué)校 電工培訓(xùn) 焊工培訓(xùn) 電工學(xué)校
中山市,固原市,銀川市,玉樹,海東,隴南市,酒泉市,張掖市,天水市,金昌市,蘭州市,榆林市,延安市,渭南市,銅川市,阿里,山南,拉薩市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,畢節(jié),銅仁,遵義市,貴陽市,甘孜州,資陽市,達(dá)州市,宜賓市,南充市,遂寧市,綿陽市,瀘州市,自貢市,三亞市,崇左市,河池市,玉林市,欽州市,梧州市,柳州市,梅州市,肇慶市,湛江市,佛山市,珠海市,韶關(guān)市,湘西州,懷化市,郴州市,張家界市,邵陽市,株洲市,仙桃市,隨州市,荊州市,荊門市,襄樊市,黃石市,駐馬店市,信陽市,南陽市,漯河市,中衛(wèi)市,石嘴山市,海西,海南藏州,黃南州,海北,甘南,慶陽市,平?jīng)鍪?武威市,白銀市,嘉峪關(guān)市,安康市,漢中市,咸陽市,寶雞市,林芝,日喀則,昌都,迪慶,德宏,大理,西雙版納,紅河州,臨滄市,麗江市,保山市,曲靖市,黔東州,黔西州,安順市,六盤水市,涼山州,阿壩州,雅安市,廣安市,眉山市,內(nèi)江市,廣元市,德陽市,攀枝花市,成都市,海口市,來賓市,百色市,貴港市,北海市,桂林市,南寧市,云浮市,揭陽市,潮州市,清遠(yuǎn)市,陽江市,汕尾市,惠州市,茂名市,江門市,汕頭市,深圳市,廣州市,婁底市,永州市,益陽市,岳陽市,湘潭市,長(zhǎng)沙市,恩施州,黃岡市,孝感市,鄂州市,十堰市,武漢市,周口市,商丘市,三門峽市,許昌市,焦作市,安陽市,鶴壁市,平頂山市,開封市,鄭州市,聊城市,濱州市,德州市,萊蕪市,日照市,泰安市,煙臺(tái)市,濰坊市,東營(yíng)市,淄博市,上饒市,濟(jì)南市,撫州市,宜春市,贛州市,新余市,九江市,景德鎮(zhèn)市,寧德市,南平市,泉州市,莆田市,廈門市,宣城市,亳州市,六安市,宿州市,黃山市,滁州市,安慶市,淮北市,馬鞍山市,蚌埠市,蕪湖市,合肥市,麗水市,舟山市,衢州市,金華市,湖州市,嘉興市,寧波市,宿遷市,鎮(zhèn)江市,鹽城市,連云港市,蘇州市,徐州市,南京市,綏化市,牡丹江市,佳木斯市,大慶市,鶴崗市,哈爾濱市,白城市,白山市,遼源市,吉林市,葫蘆島市,鐵嶺市,盤錦市,阜新市,錦州市,本溪市,鞍山市,沈陽市,錫林郭勒盟,通遼市,烏海市,呂梁市,忻州市,晉中市,晉城市,陽泉市,太原市,廊坊市,承德市,保定市,邯鄲市,唐山市,寧夏,甘肅省,西藏,貴州省,重慶市,廣西,湖南省,河南省,江西省,安徽省,江蘇省,黑龍江省,遼寧省,山西省,天津市,四平市,內(nèi)蒙古,吳忠市,果洛,西寧市,定西市,商洛市,西安市,那曲,黔南州,巴中市,樂山市,賀州市,防城港市,東莞市,河源市,常德市,衡陽市,咸寧市,宜昌市,濮陽市,新鄉(xiāng)市,洛陽市,菏澤市,臨沂市,威海市,濟(jì)寧市,棗莊市,青島市,吉安市,鷹潭市,萍鄉(xiāng)市,南昌市,龍巖市,漳州市,三明市,福州市,池州市,巢湖市,阜陽市,銅陵市,淮南市,臺(tái)州市,紹興市,溫州市,杭州市,泰州市,揚(yáng)州市,淮安市,南通市,常州市,無錫市,大興安嶺,黑河市,七臺(tái)河市,伊春市,雙鴨山市,雞西市,齊齊哈爾市,延邊,松原市,通化市,長(zhǎng)春市,朝陽市,遼陽市,營(yíng)口市,丹東市,撫順市,大連市,阿拉善盟,興安盟,烏蘭察布市,巴彥淖爾市,呼倫貝爾市,鄂爾多斯市,赤峰市,包頭市,呼和浩特市,臨汾市,運(yùn)城市,朔州市,長(zhǎng)治市,大同市,衡水市,滄州市,張家口市,邢臺(tái)市,秦皇島市,石家莊市,青海省,陜西省,云南省,四川省,海南省,廣東省,湖北省,山東省,福建省,浙江省,上海市,吉林省,河北省,北京市 主站蜘蛛池模板: 51精品国产AV无码久久久密桃 | 亚洲欭美日韩颜射在线二 | 日本无码人妻精品一区二区视频 | 国产爱豆果冻传媒在线观看 | 99re28久久热在线观看 | 美女洗澡脱得一二干净 | 美女视频秀色福利视频 | 被爽到叫呻呤视频免费视频 | 激情女人花 | 耽美肉文 高h失禁 | 十次啦中文网 | jizzjizz中国大学生 | yellow在线观看免费高清的日本 | 被黑人群jian又粗又大H | 少妇精品无码一区二区三区 | 久久精品午夜一区二区福利 | 国产亚洲精品首页在线播放 | 国产精品久久久久久久久齐齐 | wwww69| 精品国产乱码久久久久久上海公司 | 伊人久久大香 | 人妻超级精品碰碰在线97视频 | 曰产无码久久久久久精品 | 色偷偷男人的天堂a v | 国产成人亚洲精品午夜国产馆 | 久久青草在线视频精品 | 在线国内自拍精品视频 | 2021国产精品一卡2卡三卡4卡 | 啦啦啦 中文 日本 韩国 免费 | 秋霞电影网午夜免费鲁丝片 | 亚州免费一级毛片 | 蜜桃传媒星空传媒在线播放 | 啦啦啦影院视频在线看高清... | 使劲别停好大好深好爽动态图 | 性欧美xxxxporn | 欧美又粗又大AAAA片 | 九九精品视频在线播放 | 哒哒哒影院在线观看免费高清 | 亚洲国产成人精品不卡青青草原 | 欧洲美女人 一级毛片 | 色网址在线观看 |