详解8259A
詳解8259A
可編程中斷控制器
可編程中斷控制器(PIC - Programmable Interrupt Controller)是微機系統中管理設備中斷請求的管理者。當PIC向處理器的INT引腳發出一個中斷信號時,處理器會立刻停下當時所做的事情并詢問PIC需要執行哪個中斷服務請求。PIC則通過向數據總線發出與中斷請求對應的中斷號來告知處理器要執行哪個中斷服務過程。處理器則根據讀取的中斷號通過查詢中斷向量表(在32位保護模式下是中斷描述符表)取得相關設備的中斷向量(即中斷服務程序的地址)并開始執行中斷服務程序。當中斷服務程序執行結束,處理器就繼續執行被中斷信號打斷的程序。
8259A的級聯
在80X86微機機系統中采用了8259A可編程中斷控制器芯片。每個8259A芯片可以管理8個中斷源。通過多片級聯方式,8259A能構成最多管理64個中斷向量的系統。
在PC/AT系列兼容機中,使用了兩片8259A芯片,共可管理15級中斷向量。其級連示意圖如下
其中從芯片的INT引腳連接到主芯片的IR2引腳上,即8259A從芯片發出的中斷信號將作為8259A主芯片的IRQ2輸入信號。
IRQ9引腳的作用與IRQ2相同, 即PC/AT機利用硬件電路把IRQ2引腳重新定向到了PIC的IRQ9引腳上,并利用BIOS中的軟件把IRQ9的中斷int 71重新定向到了IRQ2的中斷int 0x0A的中斷處理過程。這樣一來可使得任何使用IRQ2的PC/XT的8位設配卡在PC/AT機下面仍然能正常使用,做到了PC機的向下兼容。
為什么要把IRQ2重定向到IRQ9上?
早期的IBM PC/XT只有一個8259A,這樣就只能處理8種IRQ。但很快就發現這根本不能滿足需求,所以到了IBM PC/AT,又以級連的方式增加了一個8259A,這樣就可以多處理7種IRQ。原來的8259A被稱作Master PIC,新增的被稱作Slave PIC。但由于CPU只有1根中斷線,Slave PIC不得不級連在Master PIC上,占用了IRQ2,那么在IBM PC/XT上使用IRQ2的設備將無法再使用它,但新的系統又必須和原有系統保持兼容,怎么辦?
由于新增加的Slave PIC在原有系統中不存在,所以,設計者從Slave PIC的IRQ中挑出IRQ9,要求軟件設計者將原來的IRQ2重定向到IRQ9上,也就是說IRQ9的中斷服務程序需要去掉用IRQ2的中斷服務程序。這樣,將原來接在IRQ2上的設備現在接在IRQ9上,在軟件上只需要增加IRQ9的中斷服務程序,由它調用IRQ2的中斷服務程序,就可以和原有系統保持兼容。而在當時,增加的IRQ9中斷服務程序是由PC開發商開發的BIOS提供的,不需要用戶進行另外設置,所以就從根本上保證了兼容。
8259A的工作原理
在總線控制器控制下,8259A芯片可以處于編程狀態和操作狀態。編程狀態是CPU使用IN或OUT指令對8259A芯片進行初始化編程的狀態。一旦完成了初始化編程,芯片即進入操作狀態,此時芯片即可隨時響應外部設備提出的中斷請求(IRQ0 -IRQ15),同時系統還可以使用操作命令字隨時修改其中斷處理方式。通過中斷判優選擇,芯片將選中當前最高優先級的中斷請求作為中斷服務對象,并通過CPU引腳INT通知CPU中斷請求的到來,CPU響應后,芯片從數據總線D7-D0將編程設定的當前服務對象的中斷號送出,CPU由此獲取對應的中斷向量值,并執行中斷服務程序。
一個8259A芯片的邏輯框圖如下:
圖中,中斷請求寄存器 IRR (Interrupt Request Register)用來保存中斷請求輸入引腳上所有請求,寄存器的8個比特位(D7—D0)分別對應引腳IR7—IR0。中斷屏蔽寄存器 IMR (Interrup Mask Register)用于保存被屏蔽的中斷請求線對應的比特位,哪個比特位被置1就屏蔽哪一級中斷請求。即IMR對IRR進行處理,其每個比特位對應IRR的每個請求比特位。對高優先級輸入線的屏蔽并不會影響低優先級中斷請求線的輸入。優先級解析器PR(Priority Resolver) 用于確定 IRR 中所設置比特位的優先級,選通最高優先級的中斷請求到正在服務寄存器ISR (In-Service Register)中。ISR中保存著正在接受服務的中斷請求。
來自各個設備的中斷請求線分別連接到8259A的IR0—IR7引腳上。當這些引腳上有一個或多個中斷請求信號到來時,中斷請求寄存器 IRR 中相應的比特位被置位鎖存。此時若中斷屏蔽寄存器 IMR 中對應位被置位,則相應的中斷請求就不會送到優先級解析器中。未屏蔽的中斷請求被送到優先級解析器之后,優先級最高的中斷請求會被選出。此時8259A就會向CPU發送一個INT信號,而CPU則會在執行完當前的一條指令之后向8259A發送一個INTA(INTERRUPT ACKNOWLEDGE)來響應中斷信號。8259A在收到這個響應信號之后就會把所選出的最高優先級中斷請求保存到正在服務寄存器ISR中,即ISR中對應比特被置位。與此同時,中斷請求寄存器 IRR 中的對應比特位被復位,表示該中斷請求開始被處理。此后,CPU會向8259A發出第2個INTA脈沖信號,該信號用于通知 8259A送出中斷號。在該脈沖信號期間,8259A就會把一個代表中斷號的8位數據發送到數據總線上供CPU讀取。
到此為止,CPU中斷周期結束。如果8259A使用的是自動結束中斷(AEOI,Automatic End of Interrupt) 方式,那么在第2個 INTA 脈沖信號的結尾處正在服務寄存器 ISR 中的當前服務中斷比特位就會被復位。若8259A 使用非自動結束方式,那么在中斷服務程序結束時,程序就需要向8259A發送一個結束中斷(EOI)命令以復位 ISR 中的比特位。如果中斷請求來自級聯的第2個8259A芯片,那么就需要向兩個芯片都發送EOI命令。此后8259A就會去判斷下一個最高優先級的中斷,并重復上述處理過程。
8259A 的中斷優先級
固定優先級方式
在固定優先級方式中,IR7~IR0 的中斷優先級是由系統確定的。優先級由高到低的順序是:IR0, IR1, IR2, …, IR7。其中,IR0的優先級最高,IR7的優先級最低。
自動循環優先級方式
在自動循環優先權方式中,IR7~IR0的優先級別是可以改變的,而且是自動改變。其變化規律是:當某一個中斷請求IRi服務結束后,該中斷的優先級自動降為最低,而緊跟其后的中斷請求IR(i+1)的優先級自動升為最高。
例如,在初始狀態IR4有請求,CPU為其服務完畢,IR4的優先級自動降為最低,而其后的IR5的優先級升為最高。看一張圖,我們會更清楚:
開始的時候,優先級從高到低是IR0, IR1, IR2, …, IR7。某時刻,IR4正在被CPU處理。處理完成后,IR4的優先級變為最低,IR5的優先級變為最高,也就是說,新的優先級序列從高到低是IR5,IR6,IR7,IR0,IR1,IR2,IR3,IR4.
在自動循環優先級方式中,又分為 普通自動循環方式 和 特殊自動循環方式 兩種。
中斷嵌套方式
8259A的中斷嵌套方式分為普通嵌套(normal nested mode)和特殊完全嵌套(The Special Fully Nest Mode)兩種。
普通嵌套方式
也叫做完全嵌套或者普通完全嵌套。此方式是8259A在初始化時默認選擇的方式。其特點是:IR0優先級最高,IR7優先級最低。在CPU中斷服務期間,若有新的中斷請求到來,只允許比當前服務的優先級更高的中斷請求進入,對于“同級”或“低級”的中斷請求則禁止響應。
特殊完全嵌套方式
其特點是:IR7~IR0 的優先級順序與普通嵌套方式相同;不同之處是在CPU中斷服務期間,除了允許高級別中斷請求進入外,還允許同級中斷請求進入,從而實現了對同級中斷請求的特殊嵌套。
在多片8259A級聯的情況下,主片通常設置為特殊完全嵌套方式,從片設置為普通嵌套方式。當主片響應某一個從片的中斷請求時,從片中的 IR7~IR0 的請求都是通過主片中的某個IRi請求引入的。因此從片的 IR7~IR0 對于主片IRi來說,它們屬于同級,只有主片工作于特殊完全嵌套方式時,從片才能實現完全嵌套。
我的理解是這樣的:比如從片的INT連接到主片的IR2,假設此時CPU正在響應從片IR4的中斷請求,在中斷處理過程中,從片IR3的中斷到來,于是主片IR2再次請求中斷,理論上從片IR3的優先級高于IR4,也就是說CPU應該暫停從片IR4的中斷處理過程,轉而處理從片IR3的中斷。但是從片的IR0~IR7都是通過主片的IR2引入的,因為CPU正在服務于主片的IR2,這時IR2再次請求中斷,對于普通嵌套方式,CPU是不響應的,因為屬于同一級,都是IR2.
如果想要從片的IR3中斷嵌套進從片的IR4中斷,就需要CPU允許同級中斷,所以要把主片設置為特殊完全嵌套方式。這樣,從片的高優先級才能“真正”嵌套進從片的低優先級。
書上的解釋是:在特殊完全嵌套方式下,當從片發出的某個中斷請求正被服務時,該從片并不會被主片的優先級排除。因此該從片發出的其他更高優先級中斷請求將被主片識別,主片會立刻向CPU發出中斷。而在上述普通嵌套方式中, 當一個從片中斷請求正在被服務時,該從片會被主片屏蔽。因此該從片發出的更高優先級的中斷請求就不能被處理。
中斷屏蔽方式
中斷屏蔽方式是對8259A的外部中斷源 IR7~IR0 實現屏蔽的一種中斷管理方式,有普通屏蔽方式和特殊屏蔽方式兩種。
普通屏蔽方式
寫入操作命令字 OCW1,將中斷屏蔽寄存器(IMR)中的Di位置1,以達到對IRi(i=0~7)中斷請求的屏蔽。
若 Mi=1,則屏蔽對應中斷請求級IRi;若 Mi=0,則允許IRi. 另外,屏蔽高優先級并不會影響其他低優先級的中斷請求。
特殊屏蔽方式
8259A工作在特殊屏蔽方式時,所有未被屏蔽的優先級中斷請求(較高的和較低的)均可在某個中斷過程中被響應,即低優先級別的中斷可以打斷正在服務的高優先級中斷。
在特殊屏蔽方式中,可在中斷服務子程序中用中斷屏蔽命令屏蔽當前正在處理的中斷級,同時可使其在ISR中的對應位清零,這樣一來不僅屏蔽了當前正在處理的中斷級,而且也真正開放了較低級別的中斷請求。在這種情況下,雖然CPU仍然繼續執行較高級別的中斷服務子程序,但由于ISR中對應位已經清零,就如同沒有響應該中斷一樣。所以,此時對于較低級別的中斷請求,CPU可以響應。
中斷結束方式
中斷結束方式是指CPU為某個中斷請求服務結束后,應及時清除中斷服務標志位,否則就意味著中斷服務還在繼續,致使比它優先級低的中斷請求無法得到響應。中斷服務標志位存放在中斷服務寄存器(ISR)中,當某個中斷源IRi被響應后,ISR中的Di位被置1,服務完畢應及時清除。8259A提供了三種中斷結束方式。
自動結束方式
當 ICW4 中的自動中斷結束 (AEOI) 比特位置位時,通過CPU發出的第二個中斷響應信號INTA脈沖的后沿,將ISR中的中斷服務標志位清除。這種中斷服務結束方式是由硬件自動完成的。
需要注意的是:ISR中為“1”位的清除是在中斷響應過程中完成的,并非中斷服務子程序的真正結束,因8259A并沒有保存任何標志來表示當前服務尚未結束,此時,若有中斷請求出現,且IF(x86的EFLAGS寄存器b9,中斷允許位)=1,則無論其優先級如何(比本級高、低或相同),都將得到響應,尤其是當某一中斷請求信號被CPU響應后,如不及時撤銷,就會再次被響應(二次中斷)。這樣可能會打亂正在服務的程序。因此這種方式只適用在中斷請求信號的持續時間有一定限制,且沒有中斷嵌套的場合。
普通結束方式
普通結束方式是通過在中斷服務子程序中編程寫入操作命令字OCW2,向8259A傳送一個普通中斷結束(EOI,end of interrupt)命令(命令中不指定要復位的中斷級)來清除ISR中優先級別最高的置位。
由于這種結束方式是清除ISR中優先權級別最高的那個置位,適合使用在完全嵌套方式下。因為在完全嵌套方式下,中斷優先級是固定的,8259A總是響應優先級最高的中斷,保存在ISR中的最高優先級的對應位,一定對應于正在執行的服務程序。
特殊結束方式
特殊結束方式是通過在中斷服務子程序中編程寫入操作命令字OCW2,向8259A傳送一個特殊EOI命令(命令中指定出要復位的中斷級)來清除ISR中的指定位。
在某些情況下,中斷請求的響應順序并不遵從固定的優先級。比如8259A工作在特殊屏蔽方式時,低優先級中斷可以打斷正在服務的高優先級中斷,高優先級中斷也可以打斷正在服務的低優先級中斷,此時,根據ISR的內容無法確定出剛剛所處理的中斷。這就需要在EOI命令中指定出要復位的中斷級。
中斷觸發方式
8259A中斷請求輸入端 IR7~IR0 的觸發方式有電平觸發和邊沿觸發兩種,由初始化命令字ICW1中的LTIM位來設定。
電平觸發方式
當 LTIM=1 時,為電平觸發方式。當8259A檢測到 IRi(i=0~7)端有高電平時產生中斷。在這種觸發方式中,要求觸發電平必須保持到中斷響應信號INTA有效為止。在CPU響應中斷后,應及時撤銷該請求信號,以防止CPU再次響應,出現重復中斷現象。
邊沿觸發方式
當 LTIM=0 時,為邊沿觸發方式。當8259A檢測到IRi端有由低到高的跳變(上升沿)信號時產生中斷。
數據總線連接方式
8259A的數據線與系統數據總線的連接有緩沖和非緩沖兩種方式。
緩沖方式
如果8259A通過總線驅動器和系統數據總線連接,則應選擇緩沖方式。此時 EN 為輸出引腳。在8259A輸出中斷類型號的時候,EN 輸出一個低電平,用此信號作為總線驅動器的啟動信號。
在緩沖方式下,由ICW4的M/S位來標識本8259A是主片還是從片。
非緩沖方式
如果8259A的數據線與系統數據總線直接相連,那么應選擇非緩沖方式。此時SP為輸入引腳,用其電平高低來標識本8259A是主片(SP=1)還是從片(SP=0)。
在非緩沖方式下,ICW4的BUF=0,M/S位無意義。
8259A的編程
初始化命令字
在8259A可以正常工作之前,必須首先設置初始化命令字 ICW (Initialization Command Words)寄存器組的內容。而在其工作過程中,則可以使用寫入操作命令字 OCW (Operation Command Words)寄存器組來隨時設置和管理8259A的工作方式。
A0線用于選擇操作的寄存器。在PC/AT微機系統中,當A0=0時芯片的端口地址是0x20(主芯片)和0xA0(從芯片);當 A0=1時端口就是0x21(主芯片)和0xA1(從芯片)。
初始化命令字的編程操作流程如下圖所示。由圖可以看出,對 ICW1和 ICW2 的設置是必需的。而只有當系統中包含多片 8259A 芯片并且是級聯的情況下才需要對 ICW3 進行設置。這需要在 ICW1 的設置中明確指出。 另外,是否需要對 ICW4 進行設置也需要在 ICW1 中指明。
ICW1
當發送的字節第 5 比特位(D4)=1,并且地址線 A0=0 時,表示是對 ICW1 編程。此時對于 PC/AT 微機系統的多片級聯情況下,8259A 主芯片的端口地址是 0x20,從芯片的端口地址是 0xA0。
ICWl 的格如下:
再來一張比較簡潔的圖。
在 Linux-0.11 內核中,ICW1 被設置為 0x11。表示中斷請求是邊沿觸發、多片 8259A 級聯并且需要發送 ICW4。
ICW2
ICW2 用于設置芯片送出的中斷號的高5位。在設置了 ICW1 之后,當 A0=1 時表示對 ICW2 進行設置。此時對于PC/AT微機系統的多片級聯情況下,8259A主芯片的端口地址是0x21,從芯片的端口地址是0xA1。
ICW2 格式如下。
在使用 8086/88 處理器的系統或兼容系統中 T7~T3 是中斷號的高5位,與 8259A 芯片自動設置的低3位(8259A 按 IR0~IR7 三位編碼值自動填入)組成一個8位的中斷號。8259A在收到第2個中斷響應脈沖INTA時會把此中斷號送到數據總線上,以供 CPU 讀取。
一張圖總結:
Linux-0.11 系統把主片的 ICW2 設置為 0x20,表示主片中斷請求0~7級對應的中斷號是 0x20~0x27;把從片的 ICW2 設置成 0x28,表示從片中斷請求8~15級對應的中斷號是 0x28~0x2f。
ICW3
主芯片的端口地址是0x21,從芯片的端口地址是0xA1。
對于主片,Si=1,表示IRi接從片的INT引腳。說得啰嗦點,就是主片 S7~S0 各比特位對應級聯的從片。哪位為1則表示主片的該中斷請求引腳IR上信號來自從片, 否則對應的IR引腳沒有連從片。
對于從片,ID2~ID0 三個比特位對應各從片的標識號,即連接到主片的中斷級。當某個從片接收到級聯線(CAS2—CAS0)輸入的值與自己的 ID2~ID0 相等時,表示此從片被選中。此時該從片應該向數據總線發送自己當前被選中的中斷請求的中斷號。
Linux-0.11 內核把8259A主片的 ICW3 設置為 0x04,即 S2=1,其余各位為0。表示主芯片的 IR2 引腳連接一個從芯片。從芯片的 ICW3 被設置為 0x02,即其標識號為2。表示此從片連接到主片的IR2引腳。 因此,中斷優先級的排列次序為:0級最高,1級次之,接下來是從片上的 8~15 級,最后是主片的 3~7 級。
ICW4
當 ICW1 的位0 (IC4)置位時,表示需要 ICW4。地址線 A0=1,主芯片的端口地址是0x21,從芯片的端口地址是0xA1。
再來一張簡潔的圖:
Linux-0.11內核送往8259A主芯片和從芯片的 ICW4 命令字的值均為 0x01。表示 8259A 芯片被設置成普通全嵌套、非緩沖、非自動結束中斷方式,并且用于 8086 及其兼容系統。
操作命令字
在對 8259A 設置了初始化命令字后,芯片就已準備好接收設備的中斷請求信號了。但在 8259A 工作期間,我們也可以利用操作命令字 OCW1~OCW3 來監測 8259A 的工作狀況,或者隨時改變初始化時設定的 8259A 的工作方式。
需要說明的是,與初始化命令字ICW1~ICW4需要按規定的順序進行設置不同,操作命令字OCW1~OCW3的設置沒有規定其先后順序,使用時可根據需要靈活選擇不同的操作命令字寫入到8259A中。
OCW1
OCW1 用于對 8259A 中中斷屏蔽寄存器 IMR 進行讀/寫操作。地址線A0需為1。
若 Mi=1,則屏蔽對應中斷請求級IRi;若 Mi=0,則允許IRi. 另外,屏蔽高優先級并不會影響其他低優先級的中斷請求。
在 Linux-0.11 內核初始化過程中,代碼在設置好相關的設備驅動程序后就會利用該操作命令字來修改相關中斷請求屏蔽位。例如在軟盤驅動程序初始化結束時,為了允許軟驅設備發出中斷請求,就會讀端口0x21以取得 8259A 芯片的當前屏蔽字,然后與上~0x40 來復位M6(軟盤控制器連接到了中斷請求IR6上),最后再寫回中斷屏蔽寄存器中。
OCW2
| 7 | R | 中斷優先級是否按循環方式設置。R=1表示采用循環方式,R=0表示采用非循環方式。 |
| 6 | SL | OCW2中的L2~L0是否有效。SL=1表示有效,SL=0表示無效。 |
| 5 | EOI | 中斷結束命令位。EOI=1使當前ISR寄存器的相應位清0。當ICW4中的AEOI為0時,ISR中的相應置位就要由該命令位來清除。 |
| 4-3 | – | 必須為00,00是OCW2的標識位。 |
| 2-0 | L2-L0 | 在SL=1時配合R、SL、EOI的設置,用來確定一個中斷優先級的編碼。L2、L1、L0 的8種編碼000~111分別與IR0~IR7相對應。 |
?
?
OCW2 Commands
| 0 | 0 | 1 | 固定優先級 | 一般EOI |
| 0 | 1 | 1 | 固定優先級 | 特殊EOI ,ISR(L2~L0)復位。 |
| 1 | 0 | 1 | 自動循環 | 一般EOI |
| 1 | 0 | 0 | 設置自動循環方式(在AEOI模式下) | — |
| 0 | 0 | 0 | 清除自動循環方式(在AEOI模式下) | — |
| 1 | 1 | 0 | 設置優先級命令 | — |
| 1 | 1 | 1 | 特殊循環,置IR(L2~L0)優先級為最低 | 特殊EOI ,ISR(L2~L0)復位。 |
| 0 | 1 | 0 | — | — |
Linux-0.11 內核僅使用該操作命令字在中斷處理過程結束之前向 8259A 發送結束中斷(EOI)命令。所使用的OCW2 值為 0x20,表示固定優先級、一般EOI(對應上表的第一行)。
OCW3
OCW3用于設置或清除特殊屏蔽方式和讀取寄存器狀態(IRR 和 ISR)。當 D4D3=01,且地址線 A0=0 時,表示對OCW3進行編程。在Linux-0.11 內核中并沒有用到該操作命令字。
| D7 | — | 恒為0 |
| D6 | ESMM | SMM使能位。 ESMM=0,SMM的值不起用;ESMM=1,由SMM位決定是否工作在特殊屏蔽方式。 |
| D5 | SMM | ESMM=1,SMM=0時,復位特殊屏蔽(表示8259A不是工作在特殊屏蔽方式);ESMM=SMM=1,設置特殊屏蔽。 |
| D4-D3 | — | 恒為01,是OCW3的特征位 |
| D2 | P | 查詢命令(Poll Command)標識位。P=1,查詢;P=0,不查詢。 |
| D1-D0 | RR,RIS | RR(read register command)=1,表示讀ISR或IRR。RR=1,RIS=0時,讀取IRR;RR=1,RIS=1時,讀取ISR。 |
英文熟練的可以看這張圖。
例如,設8259A的兩個端口地址為20H和21H,OCW3、ISR和IRR共用一個地址20H。
MOV AL, 0000_1011B ; 設置好“讀ISR命令” OUT 20H, AL ; 寫入OCW3 IN AL, 20H ; 讀ISR內容至AL中POLL Mode
當INT輸出引腳不使用或者CPU內部中斷允許標志為0時,外部設備無法向CPU傳遞有效的中斷請求信號。在這種情況下,可以采用查詢模式。還有,當系統的中斷源很多,超過了64個,也可以使用查詢方式。
在使OCW3的P位置為1后的下一個讀命令,8259A看作是CPU的中斷響應信號,8259A把IRR相應位清0,ISR對應位置1,并把查詢字送到數據總線。讀命令從數據總線上讀取查詢字,其格式為:
D7位I =0:表示沒有中斷。
D7位I =1:表示此片8259A有中斷請求,W2~W0即為最高優先級中斷源的編碼。
命令字端口地址速查表
對于每個命令字的端口,我列了一張速查表。
| ICW1 | 0 | 0x20 | 0xA0 | D4 = 1 |
| ICW2 | 1 | 0x21 | 0xA1 | |
| ICW3 | 1 | 0x21 | 0xA1 | |
| ICW4 | 1 | 0x21 | 0xA1 | |
| OCW1 | 1 | 0x21 | 0xA1 | |
| OCW2 | 0 | 0x20 | 0xA0 | D4:D3 = 00 |
| OCW3 | 0 | 0x20 | 0xA0 | D4:D3 = 01 |
–【全文完】–
參考資料
[1] http://www.voidcn.com/article/p-ojuocuvl-bkd.html
[2] http://ece-research.unm.edu/jimp/310/slides/8086_interrupts.html
[3] http://phei.eefocus.com/book/09-06/742951276059790.html
[4] http://blog.csdn.net/u013007900/article/details/50194401
[5] https://kader05cuet.files.wordpress.com/2014/09/8259a.pdf
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: mysql存储过程实va_mysql-存
- 下一篇: Android系统换字体不root,一键