Linux-----驅動

一、內核驅動與啟動流程

1.?Linux內核驅動
  • Nor Flash: 可線性訪問,有專門的數據及地址總線(與內存訪問方式相同)。

  • Nand Flash: 不可線性訪問,訪問需要控制邏輯(軟件)。

2.?Linux啟動流程
  • ARM架構:

    • IRAM (4KB): 內部RAM,用于存儲初始引導程序。

    • Nor Flash (2M): 存儲u-boot程序。

    • 內存 (64M): 用于加載內核和根文件系統。

    • Nand Flash (256M): 存儲內核、根文件系統等數據。

  • 啟動過程:

    1. Bootloader (u-boot):

      • 初始化CPU、異常向量表、棧、時鐘、內存等。

      • 關閉看門狗、中斷、Cache、MMU。

      • 初始化相關硬件和軟件協議。

      • 將內核加載到內存。

      • 向內核傳遞參數(根文件系統類型、位置、控制臺等)。

      • 啟動內核。

    2. 內核 (kernel):

      • 文件管理、內存管理、進程管理、網絡管理、設備管理。

      • 啟動到最后階段加載根文件系統。

      • init進程啟動后臺服務程序、加載配置、啟動shell和應用程序。

    3. 根文件系統 (rootfs):

      • 包含程序(應用、系統、命令)、配置文件、庫文件、普通文件(txt、mp3)。

3.?Windows與Linux對比
  • Windows: 使用BIOS啟動。

  • Linux: 使用bootloader引導內核啟動,內核加載rootfs。

4.?具體啟動步驟
  • Nor Flash:

    • 系統上電后,PC指向0地址,直接執行Nor Flash中的u-boot程序。

  • Nand Flash:

    • 系統上電后,自動搬移u-boot前4KB程序到IRAM。

    • CPU執行IRAM中的代碼,u-boot初始化內存并將剩余代碼搬移到內存執行。

5.?內核與文件系統
  • 內核 (uImage):

    • 啟動前u-boot向內核傳遞參數(tag_list)。

    • Nand Flash: u-boot直接讀取Nand Flash中的uImage并寫入內存的0x30008000地址處,啟動內核。

    • Ubuntu: 通過TFTP下載uImage到內存的0x30008000地址處,啟動內核。

  • 根文件系統 (rootfs):

    • Nand Flash: uImage啟動到最后階段時,直接掛載Nand Flash中的rootfs。

    • Ubuntu: uImage啟動到最后階段時,通過NFS掛載Ubuntu中的rootfs。

6.?前置步驟

  1. 向Nor Flash 0地址處燒寫u-boot.bin。

  2. 拷貝uImage到Ubuntu的TFTP服務目錄下。

  3. 將rootfs.tar.gz拷貝到Ubuntu的NFS服務目錄下,并解壓

    sudo tar -xvf rootfs.tar.gz
7.?U-Boot命令
  • 環境變量管理:

    • printenv: 打印環境變量。

    • reset: 重啟。

    • setenv serverip 192.168.1.3: 設置環境變量。

    • saveenv: 保存環境變量到Nand Flash。

    • setenv serverip: 刪除環境變量。

  • 下載與啟動:

    • tftp 0x30008000 uImage: 通過TFTP協議下載uImage到內存的0x30008000地址處。

    • bootm 0x30008000: 啟動內存0x30008000地址處的內核。

    • go 0x30008000: 運行內存0x30008000地址處的程序。

8.?設置啟動參數
setenv bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs ip=192.168.1.123 init=/linuxrc
  • console: 控制臺(終端)。

  • root: 根文件系統類型。

  • nfsroot: 根文件系統位置。

  • ip: 內核階段使用的IP。

  • init: 指定init進程。

二、內核編譯

1.?內核編譯步驟
  • Kconfig: 定義make menuconfig的配置選項。

  • make menuconfig: 內核配置。

  • .config: 配置文件,決定哪些文件被編譯進內核。

    • CONFIG_SSL = n: 不啟用SSL。

    • CONFIG_MM = y: 啟用內存管理。

  • makefile: 條件編譯,編譯內核。

2.?內核鏡像類型
  • Image: 可以直接使用的內核鏡像。

  • zImage: 一段解壓代碼 + Image的壓縮文件。

  • uImage: 64字節的頭信息 + zImage。

3.?地址相關代碼
  • 地址相關代碼: 鏈接地址和加載地址一致。

  • 地址無關代碼: 鏈接地址和加載地址無關。

4.?跳轉指令
  • 相對跳轉、短跳轉: b fun

  • 絕對跳轉、長跳轉: ldr pc, 0x00000000

5.?內核目錄結構

6.?向內核新增文件

以向drivers/char下添加demo.c為例:

  1. drivers/char目錄下新建并編輯demo.c

  2. 修改同層目錄下的Makefile,添加:

    makefile
    obj-$(CONFIG_DEMO) += demo.o
  3. 修改同層目錄下的Kconfig,添加一個DEMO的配置。

  4. 執行make menuconfig

  5. 執行make uImage

7.?內核編譯命令
  • 配置內核

    cp config_mini2440_t35 .config
    make menuconfig
  • 編譯內核

    make uImage
8.?內核鏡像說明
  • Image: 可直接使用的內核鏡像。

  • zImage: 壓縮的內核鏡像,包含解壓代碼。

  • uImage: 帶有64字節頭信息的壓縮內核鏡像。

9.?Makefile和Kconfig
  • 每層目錄都有MakefileKconfig文件,用于配置和編譯內核。

10.?編譯流程總結
  1. 配置內核: 使用make menuconfig選擇內核配置選項。

  2. 編譯內核: 使用make uImage生成內核鏡像。

  3. 驗證內核: 確保生成的內核鏡像可以正常啟動。

11.?注意事項
  • 配置文件: .config文件決定了哪些模塊被編譯進內核。

  • 條件編譯: 使用obj-$(CONFIG_XXX)進行條件編譯。

  • 目錄結構: 每層目錄都有MakefileKconfig文件,確保編譯過程正確。

三、驅動程序

1.?設備文件與驅動模塊
  • 設備文件: 用戶空間程序通過設備文件與驅動程序交互。

    • 示例: open("/dev/led");

  • 驅動模塊: 內核中的驅動程序負責控制硬件設備。

    • 示例: sys_open(led)調用驅動模塊。

2.?設備驅動類型
  • 字符設備驅動: 數據按順序訪問,90%以上的設備使用字符設備驅動。

  • 塊設備驅動: 可以隨機訪問,主要用于存儲設備。

  • 網絡設備驅動: 網卡,集成復雜協議,通過套接字通信,沒有設備號,靠名字維護。

3.?設備號
  • 設備號: 用于標識設備。

    • 主設備號 (高12位): 區分設備類型。

    • 次設備號 (低20位): 區分同類的不同設備。

  • 示例: dev_t 是32位設備號。

4.?創建設備節點
  • 使用mknod命令創建設備節點

    mknod /dev/demo3 c 255 0
    • /dev/demo3: 設備節點名。

    • c: 字符設備。

    • 255: 主設備號。

    • 0: 次設備號。

5.?驅動模塊結構
  • 驅動模塊: 包含openreadwriteioctlclose等函數。

  • 示例: drv_leddrv_keydrv_adc分別對應LED、按鍵、ADC設備。

6.?設備驅動流程
  1. 應用程序調用設備文件:

    • open("/dev/led");

  2. 內核調用驅動模塊:

    • sys_open(led)drv_led

  3. 驅動模塊控制硬件設備:

    • drv_led控制LED設備。

7.?設備號與驅動模塊關系
  • 每個設備號對應一個驅動模塊。

  • 內核通過設備號找到對應的驅動模塊。

8.?設備號結構
+--------+--------+----+-------+
| 8      | 8      | 2  | 14    |
+--------+--------+----+-------+
設備類型  命令編號  數據  參數大小
魔幻數           流向
  • 設備類型 (魔幻數): 8位,標識設備類型。

  • 命令編號: 8位,標識具體命令。

  • 數據流向: 2位,標識數據方向。

  • 參數大小: 14位,標識參數大小。

9.?設備驅動總結
  • 字符設備: 順序訪問,適用于大多數設備。

  • 塊設備: 隨機訪問,適用于存儲設備。

  • 網絡設備: 復雜協議,通過套接字通信。

  • 設備號: 區分設備類型和具體設備。

  • 驅動模塊: 內核中的程序,負責控制硬件設備。

10.?關鍵命令
  • 創建設備節點: mknod

  • 設備文件操作: openreadwriteioctlclose

11.?注意事項
  • 設備號分配: 確保主設備號和次設備號唯一。

  • 驅動模塊編寫: 需要實現openreadwrite等函數。

  • 設備文件操作: 應用程序通過設備文件與驅動模塊交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76494.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Wincc腳本全部不運行

Wincc腳本全部不運行 前言解決辦法操作步驟 前言 這里主要是指舊項目移植到Wincc的高版本,移植后界面的一些功能均會失效。(例如腳本不執行,項目編輯器不可用等情況) 解決辦法 Wincc的項目文件中有Dcf文件,Dcf文件包…

使用numpy構建邏輯回歸模型及訓練流程

邏輯回歸模型構建及訓練流程 關于邏輯回歸的數據,有很多學習?的?例樣本。這?我們使?scikit learn提供的數據集?成函數來創建 具體參數可參照官網 Scikit-learn 是? Python 開發的開源機器學習庫,?泛?于數據挖掘和數據分析。 特點:易…

python的多線程和多進程程序編程

CPU密集型使用多進程,IO密集型使用多線程 查看進程ID和線程ID的命令分別是os.getpid()和threading.current_thread() 多進程使用multiprocessing就可以了,通常使用進程池來完成操作,阻塞主進程使用join方法 多線程使用threading模塊&#…

代碼隨想錄算法訓練營第十五天

LeetCode題目: 654. 最大二叉樹617. 合并二叉樹700. 二叉搜索樹中的搜索98. 驗證二叉搜索樹2843. 統計對稱整數的數目 其他: 今日總結 往期打卡 654. 最大二叉樹 跳轉: 654. 最大二叉樹 學習: 代碼隨想錄公開講解 問題: 給定一個不重復的整數數組 nums 。 最大二叉樹 可以用…

[GN] Uart協議解碼器源碼各個方法

系列文章目錄 sigrokdecode 模塊學習指南 — 準備階段 通訊協議 - Uart sigrokdecode 模塊 UART協議解碼器源碼解析 Uart協議解碼器源碼各個方法 文章目錄 系列文章目錄引入庫parity_ok注解類型枚舉options參數annotations 注解annotation_rows 注解分組接收(RX&a…

技術分享|iTOP-RK3588開發板Ubuntu20系統旋轉屏幕方案

iTOP-3588開發板采用瑞芯微RK3588處理器,是全新一代AloT高端應用芯片,采用8nmLP制程,搭載八核64位CPU,四核Cortex-A76和四核Cortex-A55架構,主頻高達2.4GHz。是一款可用于互聯網設備和其它數字多媒體的高性能產品。 在…

Unity IL2CPP內存泄漏追蹤方案(基于Memory Profiler)技術詳解

一、IL2CPP內存管理特性與泄漏根源 1. IL2CPP內存架構特點 內存區域管理方式常見泄漏類型托管堆(Managed)GC自動回收靜態引用/事件訂閱未取消原生堆(Native)手動管理非托管資源未釋放橋接層GCHandle/PInvoke跨語言引用未正確釋放 對惹,這里有一個游戲開發交流小組…

消融實驗_草稿

五列數據 \begin{table}[htbp]\caption{Performance Comparison of Standalone KD Variants vs MIRKD-enhanced Variants on ACNE04 Dataset\label{AblationKD}}\centering\renewcommand{\arraystretch}{1.2}\scriptsize\begin{tabularx}{\linewidth}{{}l *{3}{>{\centering…

面向對象高級(1)

文章目錄 final認識final關鍵字修飾類:修飾方法:修飾變量final修飾變量的注意事項 常量 單例類什么是設計模式?單例怎么寫?餓漢式單例的特點是什么?單例有啥應用場景,有啥好處?懶漢式單例類。 枚舉類認識枚…

不用額外下載jar包,idea快速查看使用的組件源碼

以nacos為例子,在idea中引入了nacos依賴,就可以查看源碼了。 2. idea選擇open(不關閉項目直接選擇file-open也可以), 在maven的倉庫里找到對應的包,打開 2.idea中選擇 jar包,選擇 add as library 3.這樣j…

小白學習java第12天:IO流之緩沖流

1.IO緩沖流: 之前我們學習的都是原始流(FileInputStream字節輸入流、FileOutputStream字節輸出流、FIleReader字符輸入流、FIleWriter字符輸出流)其實我們可以知道對于這些其實性能都不是很好,要么太慢一個一個,要么就…

高速電路設計概述

1.1 低速設計和高速設計的例子 本節通過一個簡單的例子,探討高速電路設計相對于低速電路設計需要考慮哪些不同的問題。希望讀者通過本例,對高速電路設計建立一個表象的認識。至于高速電路設計中各方面的設計要點,將在后續章節展開詳細的討論…

MySQL8.0.31安裝教程,附pdf資料和壓縮包文件

參考資料:黑馬程序員 一、下載 點開下面的鏈接:https://dev.mysql.com/downloads/mysql/ 點擊Download 就可以下載對應的安裝包了, 安裝包如下: 我用夸克網盤分享了「mysql」,鏈接:https://pan.quark.cn/s/ab7b7acd572b 二、解…

在Java項目中,引入【全局異常處理器】

目錄 一.為什么引入全局異常處理器(目前項目碰到了什么問題)? 1.問題描述 2.與預期的差別 3.解決方案 二.解決上述問題 1.定義【業務異常類】 2.在serviceImpl層,手動拋出【違反唯一性約束】這個異常 3.定義【全局異常處理…

newspaper公共庫獲取每個 URL 對應的新聞內容,并將提取的新聞正文保存到一個文件中

示例代碼: from newspaper import Article from newspaper import Config import json from tqdm import tqdm import os import requestswith open(datasource/api/news_api.json, r) as file:data json.load(file)print(len(data)) save_path datasource/sourc…

前端核心知識:Vue 3 編程的 10 個實用技巧

文章目錄 1. **使用 ref 和 reactive 管理響應式數據**原理解析代碼示例注意事項 2. **組合式 API(Composition API)**原理解析代碼示例優勢 3. **使用 watch 和 watchEffect 監聽數據變化**原理解析代碼示例注意事項 4. **使用 provide 和 inject 實現跨…

【Web API系列】XMLHttpRequest API和Fetch API深入理解與應用指南

前言 在現代Web開發中,客戶端與服務器之間的異步通信是構建動態應用的核心能力。無論是傳統的AJAX技術(基于XMLHttpRequest)還是現代的Fetch API,它們都為實現這一目標提供了關鍵支持。本文將從底層原理、核心功能、代碼實踐到實…

[特殊字符] Spring Boot 日志系統入門博客大綱(適合初學者)

一、前言 📌 為什么日志在項目中如此重要? 在開發和維護一個后端系統時,日志就像程序運行時的“黑匣子”,幫我們記錄系統的各種行為和異常。一份良好的日志,不僅能幫助我們快速定位問題,還能在以下場景中…

IP協議之IP,ICMP協議

1.因特網中的主要協議是TCP/IP,Interneet協議也叫TCP/IP協議簇 2.ip地址用點分十進制表示,由32位的二進制表示,兩部分組成:網絡標識主機標識 3.IP地址分類; A:0.0.0.0-127.255.255.255 B:128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit區別

目錄 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 總結 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是兩個函數,通常用于讀取微控制器GPIO(通用輸入輸出)引腳的輸入狀態,特別是在STM32系列微控制器中。它們之間的主要…