日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

發(fā)布時間:2024/9/20 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉自:http://blog.chinaunix.net/uid-25845340-id-2982887.html

摘要:第二章主要講述linux如何處理ARM cortex A9多核處理器的中斷、異常。介紹了中斷向量表的入口、通用的中斷處理代碼、中斷和軟中斷、延遲處理、中斷異常的返回過程。

第二章內容較多,會分幾個部分講述。本部分主要講進入、退出中斷的過程,這部分代碼涉及的都是匯編部分。

?

法律聲明:《LINUX3.0內核源代碼分析》系列文章由謝寶友(scxby@163.com)發(fā)表于http://xiebaoyou.blog.chinaunix.net,文章中的LINUX3.0源代碼遵循GPL協(xié)議。除此以外,文檔中的其他內容由作者保留所有版權。謝絕轉載。

?

本連載文章并不是為了形成一本適合出版的書籍,而是為了向有一定內核基本的讀者提供一些linux3.0源碼分析。因此,請讀者結合《深入理解LINUX內核》第三版閱讀本連載。

?

由于我的主要工作不是BSP,對CPU體系結構不算太熟悉。如果非要說熟悉哪種CPU的話,應該是對MIPS熟悉一點。ARM方面純粹是臨陣磨槍,為了寫本系列文章,前兩個月臨時看了一下相關書籍。如有不清楚或者錯誤的地方,敬請大家指出,先謝過了^-^。

?

請讀者先看看《ARM嵌入式開發(fā)》第9章,對ARM的6種異常有所了解。并明白在進入中斷和異常時,硬件都完成了哪些事情。

1.1.1??????中斷向量和簡單中斷處理

ARM中斷向量表在entry-armv.S中,如下:

__vectors_start:

?ARM(??????????swi???SYS_ERROR0????)/* reset異常?*/

?THUMB(????svc???#0??????????????)

?THUMB(????nop?????????????????????)

????W(b)??????????vector_und + stubs_offset/*?未定義指令?*/

????W(ldr)???????pc, .LCvswi + stubs_offset/*?系統(tǒng)調用?*/

????W(b)??????????vector_pabt + stubs_offset/*?指令預取異常?*/

????W(b)??????????vector_dabt + stubs_offset/*?數(shù)據訪問中止異常?*/

????W(b)??????????vector_addrexcptn + stubs_offset/*?保留?*/

????W(b)??????????vector_irq + stubs_offset/*?中斷?*/

????W(b)??????????vector_fiq + stubs_offset/*?快速中斷?*/

?

????.globl????????__vectors_end

__vectors_end:

?

不象MIPS,ARM中斷向量表中每一個中斷向量只能存儲一條指令,因此必須使用一條跳轉指令,跳轉到各自的處理程序。當然,為了提高快速中斷的處理速度,可以將它的處理代碼直接跟隨在中斷向量表后面。但是linux沒有這樣實現(xiàn)。

在這8個向量中,?vector_addrexcptn和vector_fiq比較簡單:

vector_fiq:

????disable_fiq????????/*?簡單的禁止fiq,這樣,中斷處理退回后,不會再次產生fiq中斷了。也就是說,FIQ中斷只可能產生一次。?*/

????subs?pc, lr, #4???????????/* lr指向當前異常地址+8的地方,這里將其減去4,即是退出異常時,要返回的地址。這里直接返回。?*/

?

/*=============================================================================

?* Address exception handler

?*-----------------------------------------------------------------------------

?* These aren't too critical.

?* (they're not supposed to happen, and won't happen in 32-bit data mode).

?*/

/**

?*?根據注釋,這里是處理地址異常,它不但不重要,而且不大可能產生。因此就是一個死循環(huán),將系統(tǒng)掛死在這里。

?*?根據《ARM嵌入式系統(tǒng)開發(fā)》所述,這是一個保留異常。可能真的不大可能發(fā)生。

?*/

vector_addrexcptn:

????b???????vector_addrexcptn

?

reset異常更簡單,它僅僅是模擬調用一次SYS_ERROR0,但這應該是內核初始化完成之后,才這樣簡單。在flash上的復位異常是整個初始化的入口,應該非常復雜。

ARM(???swi???SYS_ERROR0????)/* reset異常,簡單的調用SYS_ERROR0系統(tǒng)調用即可?*/

?THUMB(????svc???#0??????????????)/*?應該不會運行到這里,呵呵,這僅僅是我的猜想?*/

?THUMB(????nop?????????????????????)

?

8個中斷異常入口,除系統(tǒng)調用異常外,都是使用b指令進行跳轉。系統(tǒng)調用異常使用是這樣的:

W(ldr)??pc, .LCvswi + stubs_offset

由于系統(tǒng)調用異常的代碼編譯在其他文件中,其入口地址與異常向量相隔較遠,使用b指令無法跳轉過去。?因此將其地址存放到LCvswi中,并從內存地址中加載其入口地址。這樣,系統(tǒng)調用的速度稍微慢一點。

?

1.1.2??????從匯編跳轉到C代碼

未定義指令異常、指令預取異常、數(shù)據訪問中止異常、中斷的處理代碼分別是vector_und、vector_pabt、vector_dabt和vector_irq。這幾個函數(shù)是由以下代碼生成的:

vector_stub?????????irq, IRQ_MODE, 4

vector_stub?????????dabt, ABT_MODE, 8

vector_stub?????????pabt, ABT_MODE, 4

vector_stub?????????und, UND_MODE

?

我們以vector_stub????irq, IRQ_MODE, 4為例,看看vector_stub生成了什么代碼:

?

?????/**

??????*?生成通用中斷、異常處理代碼的宏。

??????* correction用于調整lr的值。這是因為進入異常時,pc指針是發(fā)生異常時的指針后面8個字節(jié)或者12個字節(jié)處。

??????*?不同的異常需要跳轉到不同的返回地址。有的需要重新執(zhí)行指令,有的則需要跳到下一條指令處。

??????*/

????.macro?????vector_stub, name, mode, correction=0

????/*?將異常入口強制進行32字節(jié)對齊,32字節(jié)是一個緩存行的大小。這應當是出于性能的考慮。?*/

????.align????????5

?

vector_\name:

????/*?需要調整返回值,則遞減lr寄存器?*/

????.if \correction?

????sub???lr, lr, #\correction

????.endif

?

????@

????@ Save r0, lr_?(parent PC) and spsr_

????@ (parent CPSR)

????@

????/**

?????*?將r0,lr保存到堆棧中。這里并沒有移動堆棧指針。

?????*?這是因為:每種處理器模式都有自己的堆棧。接下來系統(tǒng)會切換到svc模式,將堆棧切換到每個任務的系統(tǒng)堆棧去。

?????*?執(zhí)行后,[sp] = r0, [sp+4]=lr,這里保存r0和lr是因為后面要使用這兩個寄存器,即這兩個寄存器會被破壞。

?????*?請注意:中斷和異常并不會保存所有寄存器。

?????*/

????stmia????????sp, {r0, lr}???????????????????@ save r0, lr

????/**

?????* spsr是異常發(fā)生前的狀態(tài)寄存器,退出異常后,需要根據它恢復現(xiàn)場,因此需要將它保存起來。

?????*?首先將它裝載到lr寄存器,再將它存儲到[sp+8]處。

?????*/

????mrs??lr, spsr

????str????lr, [sp, #8]???????????????????@ save spsr

?

????@

????@ Prepare for SVC32 mode.??IRQs remain disabled.

????@

????/**

?????*?以下三句,是準備將處理器模式設置為SVC32模式。這樣,當前堆棧也會切換到SVC32模式下的堆棧。

?????*/

????mrs??r0, cpsr

????eor???r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)

????msr??spsr_cxsf, r0

?

????@

????@ the branch table must immediately follow this code

????@

????/**

?????* lr中保存了異常前的狀態(tài),與0x0f and后,可以得到異常前的處理器模式。

?????*/

????and??lr, lr, #0x0f

????/* 1f就是宏生成的代碼后面的跳轉表,這里根據異常前的處理器模式,決定跳轉到哪一個處理代碼?*/

?THUMB(????adr???r0, 1f???????????????????????????)

?THUMB(????ldr????lr, [r0, lr, lsl #2]?????????)

???/* sp是SVC32模式下的堆棧指針,這里將它移到r0中,就可以作為C函數(shù)的第一個參數(shù),即C函數(shù)中的pt_regs參數(shù)?*/

????mov?r0, sp????????????????

????/* pc指針此時指向了1f,即跳轉表,因此將它加上lr<<2,就可以按處理器模式進行跳轉了?*/

?ARM(??????????ldr????lr, [pc, lr, lsl #2]?????????)

???/*?這條指令是從異常返回,由于我們修改了spsr寄存器,因此會進入SVC32模式,并不是真的從異常返回了?*/

????movs?????????pc, lr????????????????????????????@ branch to handler in SVC mode

ENDPROC(vector_\name)

?

????.align????????2

????@ handler addresses follow this label

1:

????.endm

?

分析完vector_stub宏代碼,我們再看看中斷處理函數(shù)是如何生成的:

/**

?*?借助宏vector_stub生成vector_irq主體代碼

?*/

vector_stub?????irq, IRQ_MODE, 4

??????????????/**

??????????????*?下面的跳轉表必須緊跟在vector_stub宏后面,參見前文對vector_stub的分析。

???????????????*/

????/*?從用戶態(tài)進入中斷的處理函數(shù)?*/

????.long?????????__irq_usr???????????????????@??0??(USR_26 / USR_32)

????/*?錯誤,不應該從FIQ狀態(tài)進入IRQ狀態(tài)?*/

????.long?????????__irq_invalid???????????????????????@??1??(FIQ_26 / FIQ_32)

????.long?????????__irq_invalid???????????????????????@??2??(IRQ_26 / IRQ_32)

????/*?從SVC模式進入中斷?*/

????.long?????????__irq_svc???????????????????@??3??(SVC_26 / SVC_32)

????.long?????????__irq_invalid???????????????????????@??4

????.long?????????__irq_invalid???????????????????????@??5

????.long?????????__irq_invalid???????????????????????@??6

????.long?????????__irq_invalid???????????????????????@??7

????.long?????????__irq_invalid???????????????????????@??8

????.long?????????__irq_invalid???????????????????????@??9

????.long?????????__irq_invalid???????????????????????@??a

????.long?????????__irq_invalid???????????????????????@??b

????.long?????????__irq_invalid???????????????????????@??c

????.long?????????__irq_invalid???????????????????????@??d

????.long?????????__irq_invalid???????????????????????@??e

?????????.long?????????__irq_invalid???????????????????????@??f

?

接下來我們看看__irq_invalid,這段代碼一般情況不應當被調用。

__irq_invalid:

????/**

?????*?將所有寄存器保存到堆棧中,并將BAD_IRQ作為錯誤原因寫入r1寄存器。

?????*/

????inv_entry BAD_IRQ

????/**

?????*?跳轉到通用錯誤處理

?????*/

????b???????common_invalid

ENDPROC(__irq_invalid)

?

common_invalid代碼如下:

common_invalid:

????/**

?????*?如果需要棧幀,就將fp設置為0,這樣在進行堆棧回溯時,就可以知道這里的堆棧是一個中斷的棧幀了。

?????*/

????zero_fp

?

????/**

?????* r0保存的是中斷棧開始的地方,將中斷前的r0-r2寄存器現(xiàn)場恢復到r4-r6中。

?????*/

????ldmia????????r0, {r4 - r6}

????/**

?????*?調整r0,使其指向中斷現(xiàn)場的PC

?????*/

????add??r0, sp, #S_PC?????????????@ here for interlock avoidance

????mov?r7, #-1?????????????????????????@??""???""????""????????""

????/**

?????*?將中斷前的r0存到sp中。

?????*/

????str????r4, [sp]???????????????@ save preserved r0

????/*?這里沒有看清楚,飄過。清楚的同學發(fā)一個郵件給我scxby@163.com */

????stmia????????r0, {r5 - r7}?????????????????@ lr_,

?????????????????????????????????????????@ cpsr_, "old_r0"

?

????/* sp是SVC32模式上的堆棧地址,指向pt_regs,即中斷前的寄存器現(xiàn)場?*/

????mov?r0, sp

????/**

?????*?跳轉到C處理函數(shù),這里編譯腳本應當有處理,這樣才能確保bad_mode與當前指令相近。否則b指令跳不過去。

?????*/

????b???????bad_mode

ENDPROC(__und_invalid)

?

1.1.1.1?????????從用戶態(tài)進入中斷

_irq_usr函數(shù)的第一步是保存用戶態(tài)寄存器現(xiàn)場到svc32堆棧中,這是通過調用usr_enry來實現(xiàn)的:

????.macro?????usr_entry

?UNWIND(.fnstart??????)

?UNWIND(.cantunwind??????)????????@ don't unwind the user space

???/**

????*?將svc32堆棧指針向低地址方向移動一個pt_regs結構大小,用于保存寄存器現(xiàn)場。

????*/

????sub???sp, sp, #S_FRAME_SIZE

????/**

?????*?向svc32堆棧中保存寄存器現(xiàn)場。

?????*/

?ARM(??????????stmib????????sp, {r1 - r12}?????)

?THUMB(????stmia????????sp, {r0 - r12}?????)

?

????/**

?????* r0是中斷棧指針,從其中取出中斷前的r0-r2現(xiàn)場放到r1-r4中。

?????*/

????ldmia????????r0, {r1 - r3}

????add??r0, sp, #S_PC?????????????@ here for interlock avoidance

????mov?r4, #-1?????????????????????????@??""??""?????""????????""

?

????/**

?????*?從中斷棧中取出真實的r0存放到pt_regs->r0中。

?????*/

????str????r1, [sp]???????????????@ save the "real" r0 copied

?????????????????????????????????????????@ from the exception stack

?

????@

????@ We are now ready to fill in the remaining blanks on the stack:

????@

????@??r2 - lr_, already fixed up for correct return/restart

????@??r3 - spsr_

????@??r4 - orig_r0 (see pt_regs definition in ptrace.h)

????@

????@ Also, separately save sp_usr and lr_usr

????@

????/**

?????*?將中斷異常棧中取出中斷前ARM_pc、ARM_cpsr保存到svc32棧中。

?????*/

????stmia????????r0, {r2 - r4}

????/**

?????*?將棧指針和lr壓入棧

?????*/

?ARM(??????????stmdb???????r0, {sp, lr}^??????????????????????????)

?THUMB(????store_user_sp_lr r0, r1, S_SP - S_PC???????)

?

????@

????@ Enable the alignment trap while in kernel mode

????@

????alignment_trap r0

?

????@

????@ Clear FP to mark the first stack frame

????@

????/**

?????*?將fp設置為0,這樣可以標示一個中斷棧幀。

?????*/

????zero_fp

????.endm

?

中斷處理的主要過程如下:

/**

?*?從用戶態(tài)進入中斷。

?*/

__irq_usr:

????/**

?????*?將寄存器現(xiàn)場保存起來。

?????*/

????usr_entry

????/**

?????*?對低版本的ARM核來說,用戶態(tài)無法實現(xiàn)原子比較交換。如果用戶態(tài)在處理原子比較交換的過程中發(fā)生中斷,需要特殊處理,略過。

?????*/

????kuser_cmpxchg_check

?

????/**

?????*?如果打開了IRQSOFF_TRACER檢測開關,則在這里記錄下關中斷的時間。這在實時系統(tǒng)中比較有用。

?????*?請記住,系統(tǒng)運行到這里,仍然是處于關中斷狀態(tài)的。

?????*/

#ifdef CONFIG_IRQSOFF_TRACER

????bl??????trace_hardirqs_off

#endif

?

????/**

?????*?根據當前sp指針,將該指針最右邊13位清0,獲得當前任務的thread_info。

?????*/

????get_thread_info tsk

#ifdef CONFIG_PREEMPT

????/**

?????*?遞增任務的搶占計數(shù)

?????*/

????ldr????r8, [tsk, #TI_PREEMPT]????????????@ get preempt count

????add??r7, r8, #1????????????????????@ increment it

????str????r7, [tsk, #TI_PREEMPT]

#endif

?

????irq_handler

#ifdef CONFIG_PREEMPT

????/**

?????*?獲得當前的搶占計數(shù)

?????*/

????ldr????r0, [tsk, #TI_PREEMPT]

????/**

?????*?并將r8中的值保存回去。相當于將前一步遞增的搶占計數(shù)減回去了。

?????*/

????str????r8, [tsk, #TI_PREEMPT]

????/**

?????* r0,r7是調用irq_handler前后的搶占計數(shù),這里進行比較,是防止驅動的ISR程序沒有配對操作搶占計數(shù)導致系統(tǒng)錯誤。

?????*/

????teq???r0, r7

????/**

?????*?如果搶占計數(shù)被破壞,則強制寫入0.

?????*/

?ARM(??????????strne?????????r0, [r0, -r0]???????)

?THUMB(????movne??????r0, #0?????????????????)

?THUMB(????strne?????????r0, [r0]??????)

#endif

?

????/**

?????*?從中斷退回用戶態(tài)。

?????*/

????mov?why, #0

????b???????ret_to_user_from_irq

?UNWIND(.fnend??????????????????)

ENDPROC(__irq_usr)

?

在沒有配置MULTI_IRQ_HANDLER?的情況下,irq_handler的邏輯很簡單,就是簡單的調用arch_irq_handler_default。

????.macro?????arch_irq_handler_default

????get_irqnr_preamble r5, lr

????/**

?????*?將中斷號讀取到r0寄存器。

?????*/

1:??????????get_irqnr_and_base r0, r6, r5, lr

????/**

?????*?如果還存在中斷,就將sp作為第二個參數(shù),調用asm_do_IRQ。sp目前指向pt_regs。

?????*/

????movne??????r1, sp

????@

????@ routine called with r0 = irq number, r1 = struct pt_regs *

????@

????/**

?????*?這里將lr設置為get_irqnr_and_base的第二條指令,因為第二次循環(huán)時,不必執(zhí)行其第一條指令(加載寄存器基址)

?????*/

????adrne????????lr, BSYM(1b)

????/**

?????*?將中斷號、pt_regs(中斷前的寄存器現(xiàn)場)傳遞給asm_do_IRQ。

?????*?請注意,當asm_do_IRQ返回時,會返回到get_irqnr_and_base處,這里相當于是一個循環(huán)處理,直到所有中斷都已經處理完畢才退出循環(huán)。

?????*/

????bne??asm_do_IRQ

?

#ifdef CONFIG_SMP

????/*

?????* XXX

?????*

?????* this macro assumes that irqstat (r6) and base (r5) are

?????* preserved from get_irqnr_and_base above

?????*/

????/**

?????*?這里是從寄存器中讀取ipi標志

?????*/

????ALT_SMP(test_for_ipi r0, r6, r5, lr)

????ALT_UP_B(9997f)

????movne??????r1, sp

????/**

?????*?同理,這里也是將返回地址設置為ALT_SMP的第二條指令,構造成一個循環(huán)。

?????*/

????adrne????????lr, BSYM(1b)

????/**

?????*?只要存在IPI就調用do_IPI,并循環(huán)直到處理完所有IPI。

?????*/

????bne??do_IPI

?

#ifdef CONFIG_LOCAL_TIMERS

????/**

?????*?同理,這里循環(huán)處理多核系統(tǒng)中的本地時鐘中斷。

?????*/

????test_for_ltirq r0, r6, r5, lr

????movne??????r0, sp

????adrne????????lr, BSYM(1b)

????bne??do_local_timer

#endif

#endif

9997:

????.endm

?

至此,我們已經將匯編部分分析完畢。在跳轉到C代碼前,匯編代碼會將中斷前的現(xiàn)場保存到堆棧中,并形成一個pt_regs結構傳給C函數(shù)。最終,會循環(huán)調用asm_do_IRQ、do_IPI、do_local_timer。僅僅在多核下,才可能處理IPI和local_timer。

?

1.1.1.1?????????退回用戶態(tài)

從中斷返回到用戶態(tài)是由ret_to_user_from_irq進行處理的,在恢復寄存器現(xiàn)場前,需要處理搶占、檢查信號等等。

/**

?*?從中斷返回用戶態(tài),在軟中斷或者中斷處理函數(shù)退出時,系統(tǒng)確保已經關閉了中斷。

?*/

ENTRY(ret_to_user_from_irq)

????/**

?????*?從任務的TI_FLAGS標志判斷是否需要處理搶占或者信號。

?????*/

????ldr????r1, [tsk, #TI_FLAGS]

????tst????r1, #_TIF_WORK_MASK

????/**

?????*?處理搶占或者信號

?????*/

????bne??work_pending

????/**

?????*?運行到這里,說明沒有搶占或者信號需要處理,或者已經處理完畢,開始退回用戶態(tài)了。

?????*/

no_work_pending:

????/**

?????*?退回用戶態(tài)時,必然會打開中斷,因此這里記錄下打開中斷的事實,供調試用。

?????*/

#if defined(CONFIG_IRQSOFF_TRACER)

????asm_trace_hardirqs_on

#endif

????/* perform architecture specific actions before user return */

????/**

?????*?在返回用戶態(tài)前,處理各個體系結構的鉤子,對我們分析的單板來說,沒有鉤子需要處理。

?????*/

????arch_ret_to_user r1, lr

?

????/**

?????*?恢復寄存器現(xiàn)場,并切回用戶態(tài)。

?????*/

????restore_user_regs fast = 0, offset = 0

ENDPROC(ret_to_user_from_irq)

?

在切換回用戶態(tài)前,需要處理搶占和信號:

work_pending:

????/**

?????*?檢查任務的_TIF_NEED_RESCHED,如果置位,則說明需要處理任務搶占,在這里調度到高優(yōu)先級任務。

?????*/

????tst????r1, #_TIF_NEED_RESCHED

????bne??work_resched

????/**

?????*?接著處理信號。

?????*/

????tst????r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME

????/**

?????*?沒有信號需要處理,則跳轉到no_work_pending并退回用戶態(tài)。

?????*/

????beq??no_work_pending

????mov?r0, sp????????????????????????????????????@ 'regs'

????mov?r2, why?????????????????????????????????@ 'syscall'

????tst????r1, #_TIF_SIGPENDING?????????????@ delivering a signal?

????movne??????why, #0????????????????????????????????@ prevent further restarts

????/**

?????*?這里處理信號

?????*/

????bl??????do_notify_resume

????/**

?????*?然后重新關中斷并判斷是否有更多任務需要處理。

?????*/

????b???????ret_slow_syscall???????????????@ Check work again

?

/**

?*?這里處理搶占,注意這里可以調用schedule,而不用調用preempt_schedule。這是有原因的。

?*?另外,這個標號也不能隨意移到其他地方。因為調用schedule后,流程會轉到ret_slow_syscall。

?* ret_slow_syscall上會關中斷,然后將中斷、異常返回流程重新處理一次。

?*?需要關中斷的原因,是schedule函數(shù)會強制將中斷打開。

?*/

work_resched:

????bl??????schedule

/*

?* "slow" syscall return path.??"why" tells us if this was a real syscall.

?*/

ENTRY(ret_to_user)

ret_slow_syscall:

????disable_irq???????????????????????????????????@ disable interrupts

?

?

1.1.1.2?????????svc32模式進入中斷

當中斷嵌套或者中斷打斷系統(tǒng)調用等異常時,中斷會從svc32模式進入中斷。在開始中斷處理前,系統(tǒng)仍然需要保存寄存器現(xiàn)場。這是通過調用宏svc_entry來實現(xiàn)的。

/**

?*?當從svc模式進入中斷處理程序時,使用本宏保存寄存器現(xiàn)場到堆棧中,并形成pt_regs結構傳遞給C函數(shù)。

?*/

????.macro?????svc_entry, stack_hole=0

?UNWIND(.fnstart???????????????)

?UNWIND(.save {r0 - pc}??????????????)

???/**

????*?將當前指針向低地址移動,以保存寄存器現(xiàn)場。這里減去4是為了將sp指向pt_regs中r1的位置。

????*/

????sub???sp, sp, #(S_FRAME_SIZE + \stack_hole - 4)

#ifdef CONFIG_THUMB2_KERNEL/*?新內核支持將內核編譯為THUMB-2,以節(jié)省代碼空間,我們的系統(tǒng)不支持這個功能?*/

?SPFIX(?????????str????r0, [sp]?????)????????@ temporarily saved

?SPFIX(?????????mov?r0, sp?????????????????)

?SPFIX(?????????tst????r0, #4?????????????????)????????@ test original stack alignment

?SPFIX(?????????ldr????r0, [sp]?????)????????@ restored

#else

?SPFIX(?????????tst????sp, #4?????????????????)

#endif

?SPFIX(?????????subeq???????sp, sp, #4?)

?

???/**

????*?將r1-r12保存到堆棧中。

????*/

????stmia????????sp, {r1 - r12}

?

????/**

?????* r0,sp,lr,spsr已經被匯編代碼使用,因此需要根據r0從中斷棧(我們目前正在使用的是svc棧)中取出

?????*/

????ldmia????????r0, {r1 - r3}

????/**

?????* r5指向pt_regs的ARM_sp即r13

?????*/

????add??r5, sp, #S_SP - 4????????@ here for interlock avoidance

????mov?r4, #-1?????????????????????????@??""??""??????""???????""

????/**

?????*?將r0調整到剛進入宏的位置

?????*/

????add??r0, sp, #(S_FRAME_SIZE + \stack_hole - 4)

?SPFIX(?????????addeq???????r0, r0, #4?)

???/**

????*?保存r0,同時將sp向下調整4字節(jié),現(xiàn)在sp指向pt_regs了。

????*/

????str????r1, [sp, #-4]!??????????????@ save the "real" r0 copied

?????????????????????????????????????????@ from the exception stack

?

????mov?r1, lr

?

????@

????@ We are now ready to fill in the remaining blanks on the stack:

????@

????@??r0 - sp_svc

????@??r1 - lr_svc

????@??r2 - lr_, already fixed up for correct return/restart

????@??r3 - spsr_

????@??r4 - orig_r0 (see pt_regs definition in ptrace.h)

????@

???stmia????????r5, {r0 - r4}/*?將中斷棧中的數(shù)據保存到pt_regs */

????.endm

?

當不是從用戶態(tài)進入中斷時,中斷處理代碼要稍顯復雜一點,主要是需要處理搶占:

/**

?*?從svc32模式進入中斷的處理過程

?*/

__irq_svc:

????/**

?????*?首先保存寄存器現(xiàn)場。

?????*/

????svc_entry

?

????/**

?????*?進入中斷后,系統(tǒng)自動將中斷關閉,這里調用trace_hardirqs_off記錄下中斷被關閉的事實,用于跟蹤調試。

?????*/

#ifdef CONFIG_TRACE_IRQFLAGS

????bl??????trace_hardirqs_off

#endif

#ifdef CONFIG_PREEMPT

????/**

?????*?對可搶占內核來說,這里將任務的搶占計數(shù)加1,在整個中斷處理過程中,進程都不能被搶占。

?????*/

????get_thread_info tsk

????ldr????r8, [tsk, #TI_PREEMPT]????????????@ get preempt count

????add??r7, r8, #1????????????????????@ increment it

????str????r7, [tsk, #TI_PREEMPT]

#endif

?

????irq_handler

#ifdef CONFIG_PREEMPT

????/**

?????*?恢復搶占計數(shù)。

?????*/

????str????r8, [tsk, #TI_PREEMPT]????????????@ restore preempt count

????/**

?????*?將任務的TI_FLAGS標志加載到r0中,這樣后面會根據r0判斷_TIF_NEED_RESCHED,以處理任務搶占

?????*/

????ldr????r0, [tsk, #TI_FLAGS]???????????????????@ get flags

????/**

?????*?如果在進入中斷前,系統(tǒng)處于系統(tǒng)調用狀態(tài),那么搶占計數(shù)就可能為0.

?????*?這里比較搶占計數(shù)是否為0,如果為0,則進行搶占處理。

?????*/

????teq???r8, #0????????????????????????????????????@ if preempt count != 0

????/**

?????*?如果系統(tǒng)關搶占了,那么強制針r0清0,這樣就不可能調用svc_preempt

?????*/

????movne??????r0, #0????????????????????????????????????@ force flags to 0

????/**

?????*?如果系統(tǒng)沒有關搶占,并且任務存在_TIF_NEED_RESCHED標志,則調用svc_preempt處理搶占。

?????*/

????tst????r0, #_TIF_NEED_RESCHED

????blne?svc_preempt

#endif

????/*?在此中斷處于關閉狀態(tài),從pt_regs中獲得中斷前的SPSR寄存器,接下來將會用這個寄存器恢復狀態(tài)。?*/

????ldr????r4, [sp, #S_PSR]?????????????????@ irqs are already disabled

????/*?如果恢復狀態(tài)后,將會打開中斷,則調用trace_hardirqs_on進行跟蹤?*/

#ifdef CONFIG_TRACE_IRQFLAGS

????tst????r4, #PSR_I_BIT

????bleq?trace_hardirqs_on

#endif

????/**

?????*?退回svc32模式

?????*/

????svc_exit r4????????????????????????????????????@ return from exception

?UNWIND(.fnend??????????????????)

ENDPROC(__irq_svc)

?

處理搶占的代碼并不復雜,如下:

#ifdef CONFIG_PREEMPT

svc_preempt:

????mov?r8, lr

????/**

?????*?這里調用preempt_schedule_irq處理搶占調度,今后在分析調度時,將會詳細介紹這個函數(shù)。

?????*/

1:??????????bl??????preempt_schedule_irq?????????????@ irq en/disable is done inside

????/**

?????* preempt_schedule_irq返回時,會重新將中斷關閉,這里加載TI_FLAGS標志是安全的。

?????*/

????ldr????r0, [tsk, #TI_FLAGS]???????????????????@ get new tasks TI_FLAGS

????tst????r0, #_TIF_NEED_RESCHED

????/**

?????*?如果任務沒有搶占標志,那么退回上層繼續(xù)處理,恢復寄存器現(xiàn)場,返回上層中斷。

?????*/??

????moveq??????pc, r8????????????????????????????????????@ go again

????/**

?????*?否則表示任務再次被搶占,循環(huán)處理搶占。

?????*/

????b???????1b

#endif

?

?

1.1.1.3?????????退回svc32模式

從中斷退出的代碼如下:

#ifndef CONFIG_THUMB2_KERNEL

????.macro?????svc_exit, rpsr

????msr??spsr_cxsf, \rpsr /*?恢復rpsr */

#if defined(CONFIG_CPU_V6)

????/**

?????*?恢復r0寄存器

?????*/

????ldr????r0, [sp]

????/**

?????*?由于發(fā)生了中斷,需要執(zhí)行strex指令,這樣上層中斷中的spinlock會認為排它性裝載失效,重啟spinlock循環(huán)。

?????*?在mips等體系結構中,這是由硬件完成的。可能ARM硬件不能完成這件事。

?????*/

????strex?????????r1, r2, [sp]???????????????????????????@ clear the exclusive monitor

????/**

?????*?恢復所有寄存器,并恢復cpsr。將處理器狀態(tài)切回中斷前。

?????*/

????ldmib????????sp, {r1 - pc}^???????????????????????@ load r1 - pc, cpsr

#elif defined(CONFIG_CPU_32v6K)

????clrex???????????????????????????????????????????????@ clear the exclusive monitor

????ldmia????????sp, {r0 - pc}^???????????????????????@ load r0 - pc, cpsr

#else

????ldmia????????sp, {r0 - pc}^???????????????????????@ load r0 - pc, cpsr

#endif

????.endm

?

至此,進入中斷和退出中斷的基本流程已經梳理完成。我們將在下一部分講中斷處理函數(shù)的C語言部分。包含ISR和軟中斷的處理。

轉載于:https://www.cnblogs.com/sky-heaven/p/5321563.html

總結

以上是生活随笔為你收集整理的《LINUX3.0内核源代码分析》第二章:中断和异常 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成人亚洲精品久久久久 | 天天综合中文 | 麻豆免费视频 | 激情五月婷婷 | 黄色看片 | 爱射综合 | 激情视频区 | 日韩极品视频在线观看 | 波多野结衣视频一区 | 国产精品久久久久久久久久直播 | 丁香久久激情 | 黄色一区二区在线观看 | 欧美永久视频 | 美女网站久久 | 月下香电影 | 国产黄色特级片 | 亚洲电影自拍 | 一区二区三区高清 | 国产精品网红直播 | 久久精品免费观看 | 在线观看黄网 | 国产精品免费一区二区三区在线观看 | www.黄色 | 国产老熟| 久久久久女人精品毛片 | 91色在线观看视频 | 制服丝袜一区二区 | 国产一区在线观看视频 | 在线v片| 在线观看av免费 | 久久99国产综合精品免费 | 欧美日韩久久不卡 | 在线观看一级 | 人人舔人人爱 | 日批在线看 | av视屏在线播放 | 日韩三级免费观看 | 黄色一级片视频 | 国产一级片毛片 | 国内精品亚洲 | 亚洲情影院 | 婷婷国产一区二区三区 | 欧美精品久久人人躁人人爽 | 国产亚洲视频在线 | 国产中文字幕在线播放 | 91麻豆.com| 成人免费视频a | 久久精品综合网 | 91视频在线自拍 | 欧美国产日韩一区二区 | 国产无套精品久久久久久 | 免费福利视频网 | 日韩在线观看中文字幕 | 青春草免费在线视频 | 久草在线官网 | 日韩系列 | 天天干天天操天天操 | 午夜精品成人一区二区三区 | 九九热re| 狠狠狠色丁香婷婷综合久久88 | 久久一视频 | 国产福利精品一区二区 | 一级黄色片在线观看 | 国产伦理一区 | av电影免费在线播放 | 亚洲精品系列 | 久久国产一区 | 欧美日韩国产精品一区二区亚洲 | 欧美热久久| 中文字幕免费观看 | www欧美日韩 | 丁香 久久 综合 | 欧美精品中文在线免费观看 | 亚洲视屏 | 三级黄在线 | 欧美亚洲久久 | 亚洲欧美日韩在线看 | 欧美激情精品久久久久久免费 | 久久久久久久99精品免费观看 | 欧美成人黄色 | 日本黄色免费在线 | 伊人中文字幕在线 | 亚洲精品国产成人 | 国产日韩亚洲 | 亚洲区视频在线 | 久久久久久久久免费 | 久久经典国产视频 | 日韩精品久久久久久久电影99爱 | 精品视频国产 | 国产精品 亚洲精品 | 天天射天天操天天色 | 久久男人免费视频 | 色综合在| 日韩欧美高清不卡 | www黄色av| 欧美精品一区二区在线观看 | 久久亚洲热 | 欧美日韩一区三区 | 欧美日韩高清在线一区 | 色中射 | www黄色软件 | 久久久av电影 | 狠狠操狠狠 | 成 人 黄 色 视频 免费观看 | 在线黄色av电影 | 国产 日韩 欧美 在线 | 日本久久中文 | 欧美激情视频一区二区三区免费 | 99久久99久久综合 | 啪啪动态视频 | 国产97在线视频 | 伊人电影在线观看 | 国产精品一区二区久久久 | 亚洲在线精品视频 | 久久精品首页 | 亚洲少妇天堂 | 亚洲一区二区精品在线 | 6080yy午夜一二三区久久 | 人人爽人人爱 | 国产精品久久久久av福利动漫 | 狠狠操狠狠干天天操 | 成片免费观看视频999 | 91av看片| a在线观看免费视频 | 中文字幕精品www乱入免费视频 | 国产成人精品一区二区三区网站观看 | 日韩精品一卡 | 一区二区三区日韩在线观看 | 免费三级网 | 欧美国产不卡 | 综合精品久久 | 日本 在线 视频 中文 有码 | 久久久黄色免费网站 | 久99久中文字幕在线 | 91视频高清| 在线免费av电影 | 在线观看亚洲国产精品 | 国产色在线,com | 久久人人干 | 狠狠狠狠狠狠狠干 | 亚洲精品午夜久久久久久久久久久 | 久草视频网 | 亚洲理论视频 | 天天要夜夜操 | 午夜精品久久久久久99热明星 | 久久精品99| 亚洲国产精品一区二区久久hs | 中文资源在线观看 | 在线看一区二区 | 色婷婷免费视频 | 日批视频在线 | 97在线免费观看 | 亚洲黄色一级大片 | 91久久久久久久一区二区 | 国产精品h在线观看 | 国内免费久久久久久久久久久 | 欧美性黑人 | 中文字幕亚洲高清 | 97视频在线观看成人 | 中文字幕精品一区 | 久久综合操 | 欧美另类网站 | 久草干 | 五月婷婷综合在线 | 91大神免费在线观看 | 免费看亚洲毛片 | 亚洲激情中文 | 香蕉久草在线 | 九九国产精品视频 | 中文字幕资源网 国产 | 超碰av在线| 超碰人人干人人 | 97色在线观看免费视频 | 亚洲国产精品99久久久久久久久 | 亚洲欧美日韩国产一区二区三区 | 欧美国产日韩一区二区三区 | 9久久精品 | 在线观看视频国产一区 | 97精品一区二区三区 | av中文字幕日韩 | 揉bbb玩bbb少妇bbb | 国产精品欧美久久 | 996久久国产精品线观看 | 久久精品99久久 | 精品一区在线 | 在线视频欧美精品 | 四虎免费在线观看 | 国产成人亚洲在线电影 | 婷婷色网 | 亚洲国产精品va在线看黑人 | 日日干日日操 | 香蕉影院在线 | 国产1区2区| 国产精品久久久久久久久久ktv | 区一区二在线 | 激情影院在线 | 女人魂免费观看 | 99在线视频观看 | 二区三区精品 | 久久精品视频网址 | 正在播放亚洲精品 | 91久久久久久久一区二区 | 国产精品av在线免费观看 | 国产1区2区3区精品美女 | 国产成人精品一区二区在线观看 | 精品视频在线观看 | 四虎亚洲精品 | 久久视频| 国产高清日韩 | 97人人澡人人添人人爽超碰 | 午夜av电影 | 最近中文字幕免费观看 | 精品久久久久久一区二区里番 | 97福利在线观看 | 97超在线 | 在线观看中文字幕亚洲 | av天天干| 婷婷色在线观看 | 丁香六月婷婷激情 | 午夜精品久久久久久久99水蜜桃 | 日韩三级在线观看 | 九九九九精品九九九九 | 中日韩欧美精彩视频 | 在线观看国产中文字幕 | 欧美国产日韩一区二区三区 | 亚洲精品视频在线播放 | 在线观看成人一级片 | 麻豆精品视频在线 | 91尤物在线播放 | 国产一区视频导航 | bbbbb女女女女女bbbbb国产 | 国产精品二区三区 | 国产精品少妇 | 99热精品国产 | 欧美在线视频免费 | 日本中文在线播放 | 天天综合日 | 亚洲经典视频在线观看 | 亚洲做受高潮欧美裸体 | 久久有精品 | 91社区国产高清 | 久久网站免费 | 黄色在线看网站 | 天天射狠狠干 | 亚州精品视频 | 久久久精品国产免费观看同学 | 久99久精品视频免费观看 | 91九色成人 | 国产三级香港三韩国三级 | www.av中文字幕.com | 国产色综合天天综合网 | 五月婷婷在线视频观看 | 中文字幕在线观看视频一区二区三区 | 精品爱爱 | 99中文字幕 | 香蕉视频91 | 日日操网站 | 毛片永久免费 | 国产手机视频在线观看 | 国产原厂视频在线观看 | 夜夜狠狠 | 亚洲天天摸日日摸天天欢 | 高清一区二区 | 亚洲免费在线视频 | 99久久精品午夜一区二区小说 | 色爱区综合激月婷婷 | 亚洲精品午夜久久久久久久久久久 | 夜夜操天天干 | 国产区 在线 | 中文字幕亚洲综合久久五月天色无吗'' | 在线导航福利 | 网站免费黄色 | 国产亚洲免费的视频看 | 色婷婷av国产精品 | 最新真实国产在线视频 | 久热色超碰 | 日韩超碰 | av成人在线网站 | 在线看片一区 | 四虎影视成人永久免费观看亚洲欧美 | 免费涩涩网站 | 色婷婷电影网 | 国内精品在线看 | 亚洲激情视频 | 精品国产一区在线观看 | 美女久久网站 | 一级做a视频 | 五月天狠狠操 | 午夜18视频在线观看 | 国产一区国产精品 | 久久免费精品一区二区三区 | 久久久免费观看视频 | 国产日产av | 欧美日韩视频在线 | 国产日韩欧美中文 | 成人在线网站观看 | 中文字幕在线播放第一页 | 亚洲电影在线看 | 久久成人国产精品免费软件 | 国产午夜精品一区二区三区嫩草 | 国产91区 | 国产亚洲va综合人人澡精品 | 国产裸体永久免费视频网站 | 欧美国产在线看 | 超碰av在线 | 日日夜夜精品视频天天综合网 | 亚洲狠狠操 | 在线中文字幕电影 | 亚洲成人午夜在线 | 久久伊99综合婷婷久久伊 | 成人在线观看日韩 | 久草久草视频 | 三级毛片视频 | 欧美va天堂在线电影 | 国产精品一区二区三区电影 | 久久成人午夜 | 啪嗒啪嗒免费观看完整版 | 久久 地址 | 美女一级毛片视频 | 91麻豆国产福利在线观看 | 亚洲成熟女人毛片在线 | 亚洲精品av中文字幕在线在线 | 91精品国产九九九久久久亚洲 | 成人黄色中文字幕 | 一区二区三区高清在线观看 | 国产一区二区在线影院 | 国产区精品在线观看 | 精品人人爽| 久久免费成人精品视频 | 成人黄色电影在线播放 | 欧美色噜噜噜 | 夜夜干天天操 | 成人黄色大片在线观看 | 精品国产一区二区三区四 | 国产高清黄 | 国内揄拍国产精品 | 成年人在线免费看 | 成人av亚洲 | 97视频在线观看播放 | 三级av免费 | 一区二区三区免费在线 | 人人插人人射 | 天天操天天射天天插 | 国产原创av片 | 色资源中文字幕 | 在线黄色免费av | 亚洲一区二区三区在线看 | 欧美精品在线观看免费 | 五月婷婷av | 88av色| 六月丁香激情综合色啪小说 | 日韩高清三区 | 久久网站免费 | 日日夜夜精品网站 | 国产无遮挡又黄又爽馒头漫画 | 久久精品一二三 | av中文字幕免费在线观看 | 成人国产精品入口 | 婷婷色在线 | 右手影院亚洲欧美 | 一区二区三区在线视频111 | 午夜精品久久一牛影视 | 久久蜜臀一区二区三区av | 国产免费一区二区三区网站免费 | 久草成人在线 | 91九色视频在线 | 欧美成人精品xxx | 精品久久一区二区三区 | 天天操天天操 | 国产亚洲字幕 | 超碰在线人人爱 | 免费观看性生活大片3 | 日韩专区在线播放 | 成人久久久久久久久 | 亚洲国产免费网站 | 激情综合一区 | 国产四虎影院 | 亚洲va韩国va欧美va精四季 | 麻豆视频网址 | 91丨九色丨国产在线 | 天天干夜夜夜 | 国产精品久久久久久久久婷婷 | 五月婷婷.com | 二区三区在线观看 | 日日夜夜天天综合 | 狠狠做深爱婷婷综合一区 | 嫩模bbw搡bbbb搡bbbb | 色综久久| 9999免费视频| 欧美日韩不卡一区二区 | 久久av在线播放 | 碰超在线97人人 | 久久资源在线 | 综合色狠狠 | 国产精品观看在线亚洲人成网 | 很黄很污的视频网站 | 国产高清视频免费在线观看 | 亚洲综合视频在线 | 国产资源免费 | 国产精品视频地址 | 久久综合狠狠综合久久狠狠色综合 | 国产一级片免费观看 | 欧美亚洲国产一卡 | 91精品久久久久久粉嫩 | 精品久久久久久久久久久院品网 | 免费在线观看国产黄 | 欧美 日韩 性| 波多野结衣一区二区三区中文字幕 | 日韩欧美一区二区三区视频 | 久草在线最新 | 成人91在线 | 久操视频在线免费看 | 成人三级视频 | 欧美日本在线视频 | 精品在线亚洲视频 | 成人性生交视频 | 麻豆传媒在线免费看 | www九九热| 国产拍揄自揄精品视频麻豆 | 久草视频在线播放 | 97精品国产一二三产区 | 丁香六月中文字幕 | 亚洲成av片人久久久 | 天天综合人人 | 高潮久久久久久 | 国产免费成人 | 亚洲精品网页 | 一区二区三区四区五区在线 | 97香蕉超级碰碰久久免费软件 | 国产高清不卡一区二区三区 | 伊人视频 | 国产91电影在线观看 | 九九九免费视频 | 国内精品久久久久久久久久久久 | 日韩剧| 91精品国产91久久久久福利 | 日韩色av色资源 | 国产精品成人免费精品自在线观看 | 在线观看日韩精品视频 | 久久久国产精品人人片99精片欧美一 | 国产91丝袜在线播放动漫 | 国产精品亚洲视频 | 日日干精品 | 国产精品麻豆一区二区三区 | 久久99精品久久只有精品 | 人人澡人人舔 | 亚洲综合在线五月 | 天天干干| 精品久久精品久久 | 国产精品一二 | 久久久五月婷婷 | 蜜桃av观看 | av一区在线| 久久午夜网| 久久人人爽人人爽人人片 | 一区二区三区日韩视频在线观看 | 日韩精品免费一区二区在线观看 | 国内精品久久久久国产 | 四虎在线视频 | 国产四虎影院 | 黄色av一区二区三区 | 日本久久精品视频 | 在线电影日韩 | 日日狠狠 | 久久国产精品免费 | www黄色软件 | 丁香久久婷婷 | 在线观看爱爱视频 | 国产精品久久久久一区二区三区 | 狠狠色丁香婷婷综合久小说久 | 91麻豆精品国产91久久久久 | 国产精品久久久久久av | 日韩av电影中文字幕在线观看 | 在线成人免费av | 又黄又刺激视频 | 欧美日韩国产高清视频 | 国产视 | 9999在线视频 | 国产精品免费在线播放 | 久久免费片 | 久久久官网| 久久综合狠狠综合 | 午夜精品999| 九九久久久久99精品 | 在线最新av | 久久久久久久久久久高潮一区二区 | 青草视频在线 | 久久久久久毛片精品免费不卡 | 国产一级片不卡 | 中文字幕中文字幕在线中文字幕三区 | av最新资源 | 四虎影视成人精品国库在线观看 | 黄色成年 | 色综合天天干 | 麻豆精品传媒视频 | 美女网站色 | 91视频高清完整版 | 日日夜夜精品免费视频 | 欧美韩国日本在线观看 | 免费在线观看日韩视频 | 亚洲精品视频在线免费播放 | 婷婷久久一区 | 国产成人性色生活片 | 91香蕉视频| 亚洲国产成人在线观看 | 人人揉人人揉人人揉人人揉97 | av电影一区| 97av影院 | 一本—道久久a久久精品蜜桃 | 久久综合中文字幕 | 五月天高清欧美mv | 久久人人做 | 深夜免费福利网站 | 国产精品免费看久久久8精臀av | www亚洲视频| 超碰免费久久 | 久久国产综合视频 | a黄色片 | 午夜视频黄 | 亚洲精品午夜久久久 | 97在线视频免费 | 国产亚洲片 | 99精品在线免费视频 | 国产亚洲字幕 | 中文字幕成人av | 婷婷国产视频 | 午夜视频导航 | 国产一区在线免费 | 小草av在线播放 | av免费看看 | 免费精品国产 | 色吊丝在线永久观看最新版本 | 国产96精品 | 亚洲视频精品 | av色综合| 四虎成人精品在永久免费 | 国产精品久久久久9999吃药 | 色多多视频在线 | 中文字幕在线中文 | 久久久久久久久久伊人 | 99re中文字幕| 久久观看 | 99精品视频一区 | 激情小说久久 | 国产色网 | 五月视频 | 麻豆小视频在线观看 | 在线免费观看黄色 | 国产精品久久电影观看 | 精品欧美一区二区三区久久久 | 亚洲成熟女人毛片在线 | 中文字幕日韩有码 | 日本黄色免费大片 | 久久丝袜视频 | a黄色片| 婷婷色亚洲 | 韩日精品视频 | 97视频总站| 欧美淫aaa免费观看 日韩激情免费视频 | 91精彩在线视频 | 国产亚洲婷婷免费 | 欧美一级黄大片 | 国产精品嫩草影院9 | 国产99久久久久 | 狠狠88综合久久久久综合网 | 婷婷综合国产 | 久久久五月天 | 精品久久久久久久久久久院品网 | 久99视频| 成人a视频在线观看 | 精品久久久久国产 | 婷婷九月丁香 | 久久99久久99精品免观看软件 | h网站免费在线观看 | 成人丁香花 | 亚洲成aⅴ人在线观看 | 亚洲 中文 在线 精品 | 中文字幕 在线 一 二 | 欧美日韩一区二区三区在线免费观看 | 91精品国产一区二区在线观看 | 中文字幕精品三级久久久 | 在线日本v二区不卡 | 精品国产精品久久一区免费式 | 久草资源免费 | 日韩精品一区二区免费视频 | 亚洲精品在线免费 | 国产香蕉久久精品综合网 | 制服丝袜在线91 | 国产网站在线免费观看 | 狠狠狠狠狠狠操 | 免费看成人av| 在线国产能看的 | 13日本xxxxxⅹxxx20 | 91人人爱 | 午夜少妇 | 黄色av一级片 | 欧美精品亚洲精品日韩精品 | 国产精品久久久久久久久久三级 | 二区三区在线视频 | .精品久久久麻豆国产精品 亚洲va欧美 | 99色视频 | 国产在线视频一区二区 | 国产一级不卡视频 | 精品久久精品久久 | 国产一区二区三区在线 | 国产黑丝一区二区 | 国产午夜三级一二三区 | 亚洲丁香日韩 | www视频在线免费观看 | 一本一本久久a久久精品综合 | 一级免费片 | av网站播放 | 国产日韩一区在线 | 国产午夜三级一区二区三 | 国产国语在线 | 黄色亚洲在线 | 中文字幕久久亚洲 | 在线观看aaa | 综合网婷婷 | 亚洲人xxx | 99精品免费久久久久久日本 | 摸阴视频| 九九99靖品 | 欧洲亚洲国产视频 | 国产日韩精品视频 | 国产一区二区在线免费播放 | 久久国产二区 | 在线观看黄色大片 | 久久婷婷精品 | 欧美一性一交一乱 | 亚洲在线 | 久久成人久久 | 91福利影院在线观看 | 久久伦理 | 亚洲最大av | 亚洲美女视频网 | 日韩资源在线播放 | 2019中文在线观看 | 中国一级片视频 | 中文字幕二区三区 | 国产高清免费在线播放 | 天天操人 | 成人丝袜 | 天天操天天操一操 | av在线播放不卡 | 国产精品女同一区二区三区久久夜 | 国内精品久久久久影院男同志 | 色婷婷88av视频一二三区 | 日本韩国精品在线 | 久久伊人婷婷 | 最新av免费在线观看 | 欧美日韩中字 | 国产日韩在线看 | 久久久久久久久久电影 | 香蕉视频在线观看免费 | 久久综合给合久久狠狠色 | www久 | 九九免费在线观看 | 中文免费 | 国产成人在线播放 | 欧美午夜精品久久久久 | 日韩精品中文字幕在线播放 | 天天透天天插 | 免费观看一级特黄欧美大片 | 欧美性生活免费 | 人人爽人人爽人人爽人人爽 | wwwav视频| 精品成人久久 | 人人干天天射 | 国产精品日韩欧美一区二区 | 91精品播放 | 97成人啪啪网 | 国产中文 | 日韩欧美极品 | 日日夜夜人人天天 | 欧美日韩久久久 | 亚洲精品小视频在线观看 | 97在线成人 | 黄色精品久久久 | 国产精品久久久久久久久蜜臀 | 国产精品久久久久久久午夜片 | 久久久久久久久久久影视 | 成人小视频在线观看免费 | 欧美一级电影片 | 亚洲视频综合在线 | 色a综合 | 国产一级视频在线观看 | 一级成人在线 | 中文字幕一区二区三区在线视频 | 精品久久久久免费极品大片 | 国产精品嫩草在线 | 欧美激情第一页xxx 午夜性福利 | 午夜精品久久久久 | 亚州av网站大全 | 99精品视频在线观看播放 | 99久久精品一区二区成人 | 7799av| 免费国产一区二区 | 亚洲精区二区三区四区麻豆 | 国产999在线观看 | 97精品免费视频 | 精品国偷自产在线 | 日韩精品一区二区三区视频播放 | 在线观看黄色国产 | 久久久久免费精品国产小说色大师 | 91久久国产露脸精品国产闺蜜 | 在线观看不卡的av | 国产精品热视频 | 亚洲天堂精品 | 精品国产乱码久久久久久1区二区 | 亚洲视频一区二区三区在线观看 | 成人小视频在线观看免费 | 国产精品99久久免费观看 | 特级西西444www大精品视频免费看 | av成人免费观看 | 亚洲精品国产成人 | 又色又爽的网站 | 91免费国产在线观看 | 国产九九九视频 | 欧美成人在线网站 | 久久久久免费 | 免费av网站观看 | 天天综合网入口 | av中文电影 | 91视频首页 | 日韩一二三区不卡 | 麻豆激情电影 | 免费观看www7722午夜电影 | 91精品一区二区三区久久久久久 | 久久不射影院 | 国产成人精品av在线 | 波多野结衣一区三区 | 五月婷婷一级片 | 97影视 | 午夜12点 | 美女av在线免费 | 欧美一级淫片videoshd | 久久夜色精品国产欧美一区麻豆 | 久久视频国产精品免费视频在线 | 黄色av免费| 青青草久草在线 | 午夜丁香网 | 色资源在线 | 国产精品亚州 | 日韩3区| 精品一区电影国产 | 久久久久综合视频 | 成人午夜影院在线观看 | 成人动漫一区二区 | 欧美在线一二 | 国产一级二级av | 人人干干人人 | 欧美在线视频一区二区三区 | 中文在线www | 精品亚洲va在线va天堂资源站 | 最近中文字幕在线 | 久久99在线观看 | 亚洲精品在线一区二区 | 婷婷视频导航 | 国产精品mv| 色妞色视频一区二区三区四区 | 亚洲精品合集 | 91精品欧美一区二区三区 | 欧美一区免费观看 | 久久精品官网 | 日韩在线大片 | 日韩综合视频在线观看 | 最近2019中文免费高清视频观看www99 | 中文字幕亚洲情99在线 | 美女网站视频免费都是黄 | 成人三级视频 | 国产精品国产三级国产aⅴ9色 | 一级黄色网址 | 99视频播放 | 久久久国产一区二区三区四区小说 | 国产精品手机在线播放 | 色网站在线观看 | 正在播放一区二区 | 欧美激情奇米色 | 国产区精品视频 | 日韩无在线 | 五月婷婷色 | h久久| 91综合色 | 亚洲最大在线视频 | 日日爽夜夜操 | 国产亚洲va综合人人澡精品 | 日韩视频三区 | 国产精品精品国产婷婷这里av | 亚洲天堂网在线视频观看 | 在线视频黄| 青青久草在线 | 国产高清视频免费最新在线 | 国产一区二区不卡视频 | 精品欧美在线视频 | 国产视频精品久久 | 一区二区三区中文字幕在线 | 欧美午夜精品久久久久久浪潮 | 久热av| av中文字幕在线播放 | 国产在线观看高清视频 | 麻豆久久一区二区 | 久久久在线视频 | 日韩大片在线播放 | www.国产高清 | 久久艹在线观看 | 日韩电影中文,亚洲精品乱码 | 精品国产_亚洲人成在线 | 九九视频在线 | 亚洲黄色激情小说 | 精品久久久成人 | 久久看视频| 国产69久久精品成人看 | 亚洲欧美视频网站 | 欧美成年黄网站色视频 | 97精品一区| 亚洲美女精品区人人人人 | 久草在线精品观看 | 17videosex性欧美 | 一区二区三区免费在线观看视频 | 国产乱对白刺激视频不卡 | 精品国产成人在线影院 | 欧美视频18 | 天天综合精品 | 亚洲一级片在线看 | 中文久草 | 国产xx视频 | 久久久久北条麻妃免费看 | 国产午夜精品一区 | 亚洲va欧美va人人爽 | 97超碰精品 | 综合婷婷丁香 | 国产一级免费观看视频 | 五月天激情婷婷 | av中文资源在线 | 天天射色综合 | 国产又黄又爽无遮挡 | 在线看av网址 | 色婷婷精品 | 能在线看的av | 久草久草在线 | 婷婷四房综合激情五月 | 在线观看成人国产 | 午夜电影av | 香蕉在线观看视频 | 成人精品影视 | 国产精品永久在线观看 | 日本最新一区二区三区 | 丁香六月国产 | 精品成人免费 | 91精品国自产在线观看欧美 | 久久国产精彩视频 | 日韩欧美视频在线观看免费 | 亚洲欧美一区二区三区孕妇写真 | 国产高清日韩欧美 | 久久国产精品一国产精品 | 综合国产在线观看 | 国产免费又爽又刺激在线观看 | 国内精品国产三级国产aⅴ久 | 96久久| 少妇bbb| 国产xxxx做受性欧美88 | 国产精品久久久久久欧美 | 韩国av免费在线 | 日本公妇在线观看高清 | 最新高清无码专区 | 久久精品一区二区三区四区 | 久久亚洲影院 | 精品中文字幕在线 | 五月婷婷色综合 | 免费高清看电视网站 | 中文字幕一区三区 | 精品国产视频在线 | 日韩在线电影观看 | 欧美三人交 | 欧美性超爽| 国产1区在线 | 国产123av| 四虎国产视频 | 欧美日韩一区二区久久 | 欧美aa一级片 | 免费看v片网站 | 日韩超碰在线 | 成人黄色电影在线播放 | 日日干夜夜干 | 又黄又刺激的视频 | 国内精品视频一区二区三区八戒 | 欧美日韩有码 | 毛片网在线播放 | 国产成人精品综合久久久 | 日韩精品一区二区免费 | 精品久久久久免费极品大片 | www在线免费观看 | 精品中文字幕在线 | 欧美午夜a| 日韩一区二区三区免费视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 日本公妇在线观看高清 | 欧美日本不卡 | 中文字幕在线观看视频一区 | 91九色视频在线观看 | 久草视频播放 | 久久免费高清视频 | 国产一级h | 99精品在线免费 | 亚洲激色| 国产无套视频 | 国产在线观看国语版免费 | 色爱成人网 | 久久久受www免费人成 | 国产日韩视频在线播放 | 国产日本在线播放 | 亚洲国产免费网站 | av在线收看 | 国产在线91在线电影 | 国产欧美精品xxxx另类 | 深夜福利视频在线观看 | 在线看中文字幕 | 天天色.com | 成人97人人超碰人人99 | 黄色av在| 国产精品精品 | 亚洲精品综合在线观看 | 久久一精品 | 日本精品一区二区在线观看 | 日韩一区二区三区高清在线观看 | 亚洲综合欧美精品电影 | 婷婷网址| 视频国产在线观看18 | 国产欧美综合在线观看 | 国产色婷婷精品综合在线手机播放 | 二区中文字幕 | 久久99精品一区二区三区三区 | 国产亚洲午夜高清国产拍精品 | 99久视频 | 手机av观看 | 欧美极品一区二区三区 | 天天艹天天 | 日本精品一区二区 | 福利一区二区三区四区 | 手机av电影在线观看 | 久久精品小视频 | 国产91精品一区二区麻豆网站 | 国产精品一区二区av日韩在线 | 国产 日韩 欧美 自拍 | 欧美一级黄色视屏 | 狠狠久久 | 最近高清中文字幕 | 亚洲精品午夜aaa久久久 | 久久久69 | 五月天激情综合网 | 日本视频不卡 | 99九九热只有国产精品 | 国产99久久久欧美黑人 | 久草在线最新免费 | 97电院网手机版 | 人人澡人人舔 | 色综合人人 | 黄网站免费大全入口 | 婷婷在线精品视频 | 99自拍视频在线观看 | 在线观看电影av | 久久99国产精品久久99 | 天天干.com| 手机av片 | 在线免费观看视频一区二区三区 | 国产一级精品视频 | 特级毛片在线免费观看 | 天天干夜夜操视频 | 999久久久国产精品 高清av免费观看 | 欧美亚洲一区二区在线 | 欧美一级片免费播放 | 免费在线国产精品 | 在线观看免费一区 | 亚洲午夜久久久影院 | 视频国产精品 | 激情中文字幕 | 色婷婷在线播放 | 国产免费精彩视频 | 亚洲综合色视频在线观看 | 日韩精品一区二区三区在线视频 | 亚洲精品国产精品99久久 | 区一区二在线 | 亚州国产视频 | 国产黄a三级三级三级三级三级 | 黄色av网站在线观看免费 | 国产视频精品在线 | www视频在线免费观看 | 又粗又长又大又爽又黄少妇毛片 | av官网在线 | 亚洲国产精品成人女人久久 | 亚洲精品成人免费 | 成人av手机在线 | 欧美乱淫视频 | 精品国产久 | 91香蕉视频 mp4 | 中文字幕在线看视频国产中文版 | 久草视频免费 |