按下reset之後,路由器的操作可以分為如下幾步:

1。硬體相關的操作:

reset按鈕通常與cpu的gpio引腳相連,此引腳被配置為中斷模式,觸發方式為上升沿和下降沿觸發。

按鈕被按下和放開時,此gpio引腳電平發生跳變,這樣就會會產生中斷。

只要事先按照cpu的datasheet將對應暫存器配置好,按下reset時,硬體會自動進行這部分操作。

2。中斷處理函式(執行在核心):

cpu執行一個預先註冊的中斷處理函式,透過netlink等手段,通知管理程序reset按鈕被按下或放開。

3。管理程序(執行在使用者層):

多數路由器有一個控制中心,負責解析各種配置命令,並實現具體的功能,這個控制中心通常就是一個管理程序。

比如,我們點選web頁面的重啟,原始資料先透過網路傳給httpd,接著傳遞給管理程序,管理程序解析這些資料,發現是一個重啟的請求,接著呼叫system(“reboot”)實現軟重啟功能。

類似的,管理程序知道reset按鈕被按下,啟動一個定時器,如果定時器到期之前,reset按鈕被鬆開,則什麼都不做,否則產生一個恢復出廠設定的請求。

管理程序有另外一個模組,負責處理各種請求。比如按下reset按鈕和web頁面點選恢復出廠設定,最後都產生同一個請求。此請求對應的處理函式負責清空使用者配置。

4。清空使用者配置:

a。先看一下使用者配置的使用方式:

所謂的使用者配置,通常就是一個xml檔案。

比如我們透過web頁面配置了一條pppoe的wan連線,則管理程序負責呼叫ppp程序,建立一條ppp連線,並且在xml中可能產生如下記錄:

《ppp0》

《username》abcdefg《/username》

《passwd》123456《/passwd》

《/ppp0》

(先用《》代替尖括號,不然用手機知乎顯示不出尖括號裡面的內容。摔!)

路由器斷電時,ppp連線斷開。

在下一次啟動時,管理程序的一個模組負責解析使用者配置xml檔案,得到ppp的使用者名稱密碼,然後建立一個ppp連線。

b。再看一下路由器裡存放了些什麼:

路由器的Flash有多個分割槽(相當於c、d、e、f盤),分別用於儲存bootloader,核心(作業系統),不可寫的檔案系統(包含busybox等常用可執行檔案,某些不需要改變的檔案),mac地址,使用者配置等。由於使用者配置需要可讀可寫,而多數路由器的檔案系統是不可寫的,所以需要用一個單獨的分割槽來儲存使用者配置。

bootloader,mac地址分割槽一般不會被修改。

核心和檔案系統只有升級韌體(刷機)才可以被修改。

使用者配置分割槽在修改路由器配置時就會被修改。

使用者配置的xml檔案也不是憑空生成的,而是基於另外一個預設的xml檔案(此檔案保存於不可寫檔案系統中,出廠前寫好,之後不會改變,預設xml檔案中已經有一些xml的條目,比如預設wifi的加密方式為不加密,預設lan ip為192。168。1。1等)。配置pppoe連線時,在預設xml上新增一個條目,記錄使用者名稱和密碼等資訊。

c。清空使用者配置時修改了什麼:

負責清空使用者配置的函式,先擦除使用者配置分割槽。

在使用者層看來,可能就是呼叫一個API,格式化這個flash分割槽。

在核心看來,需要操作flash控制器。指定擦除命令,指定起始地址和長度(其實就是將這些引數寫到對應暫存器中)。這樣,cpu就會往連線flash的匯流排(比如spi,nand等)上發出符合匯流排協議和flash datasheet要求的一連串的高低電平。

flash收到擦除命令,起始地址,長度等引數,將對應的資料擦除。

將預設xml檔案寫入這個使用者配置分割槽的過程類似。但是需要指定寫命令,起始地址,長度和要寫入的內容。

將預設xml檔案寫入使用者配置分割槽之後,路由器會重啟(管理程序呼叫reboot命令軟重啟),管理程序解析預設的使用者配置xml檔案,這樣會得到一份預設引數。再根據這些預設引數,執行各種配置。

這時,預設引數中沒有pppoe資訊了,也就不會建立pppoe連線了。

除使用者配置分割槽之外,bootloader,核心,檔案系統,mac地址等分割槽都不會被修改。