Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 嵌入式系統主控程序架構設計解析

編輯:Linux 系統常見問題解答

整體架構

  • init 進程:內核啟動第一個用戶態進程 (PID 1),本系統為指向 rc 的鏈接。
  • rc 主進程:實際的主控程序,根據參數 (init, ip-up, start-lan 等) 分派功能。
  • 子進程/服務:HTTPD、DHCPD、DTU 客戶端、PPPD、看門狗等。
  • 進程間通信 (IPC):信號 (主控協調)、Socket (數據通信)。

rc 主循環初始化流程

  1. 系統級初始化:掛載 /proc /sys /dev、創建設備節點、掛載 Flash 分區、參數文件鏈接、時區/時間同步、載入內核模塊、啟動硬件看門狗。
  2. GPIO 初始化:指示燈、模塊電源、子板電源序列控制。
  3. 網絡啟動:LAN 接口 up、DHCP 服務/客戶端。
  4. 信號註冊:signal(SIGHUP, rc_signal) 等,設置處理函數修改全局狀態變量。
  5. 配置文件解析:PPP、DTU、網控、短信觸發、ICMP/DNS/DDNS/維護通道參數。
  6. 服務啟動:TCP 本地 Server、HTTPD、DTU 客戶端、DHCPD、Telnet、進程監控、流量統計。

PPPD 保活機制 (核心可靠性保障)


while (1) {
    // 1. 檢查模塊接口可用性,異常則重啟系統 (reboot)
    if (!modem_interface_ok()) system_reboot();

    // 2. 啟動 pppd
    start_pppd();

    // 3. 超時輪詢 /tmp/ppp/link 文件 (標誌連接建立)
    for (t=0; t

主循環狀態機

  • IDLE:pause() 掛起等待信號。
  • 信號處理函數:接收子進程信號 (如 SIGHUP 來自 ip-down),修改全局 signalled 變量 (RESTART/STOP)。
  • 狀態轉移:
    IDLE --(SIGHUP)--> RESTART --(重新撥號流程)--> IDLE
    IDLE --(SIGTERM)--> STOP   --(關閉服務、掛載卸載)--> 退出
    

信號使用規範


// 1. 註冊
signal(SIGHUP, rc_signal);
signal(SIGTERM, rc_signal);

// 2. 處理函數 (異步安全,僅修改標誌)
static void rc_signal(int sig) {
    switch (sig) {
        case SIGHUP:  syslog(LOG_INFO, "signalling RESTART"); signalled = RESTART; break;
        case SIGTERM: syslog(LOG_INFO, "signalling STOP");    signalled = STOP;    break;
    }
}

// 3. 子進程發送 (如 ip-down 腳本)
kill(1, SIGHUP);  // 向 PID 1 (rc) 發送

進程類型分類

類型示例管理方式
一次性運行退出ip-up, ip-down, start-watchdog, 配置腳本fork+exec, 父進程 wait 或忽略 SIGCHLD
長期循環服務HTTPD, DHCPD, DTU Client, PPPD 監控, 流量統計daemon 化, 信號控制啟停, 監控進程拉活

設計要點總結

  1. 單一主控進程 (rc) 統一生命週期管理,避免分散的 init 腳本難以協調。
  2. 信號作為輕量級 IPC,僅在處理函數中修改標誌,主循環輪詢標誌執行複雜邏輯 (保證異步信號安全)。
  3. PPPD 保活採用「模塊復位 → 撥號 → 文件輪詢 → 網絡實測」四層防護。
  4. 關鍵配置文件集中管理,啟動階段一次性解析,運行期熱加載通過信號觸發重讀。
Copyright © Windows教程網 All Rights Reserved