這是我第一次寫部落格。希望把自己學習的知識進行總結,不斷的督促自己多總結多思考,更希望路過的大神進行指正和糾錯,共同進步
剛接觸linux驅動開發,自己對u-boot、核心、根檔案系統在驅動開發中所起到的作用,還有驅動程式和應用程式兩者的關係不是特別清楚,在學習後有如下的總結。
一. u-boot:是一種boot loader(系統引導)主要用於嵌入式系統中。它的主要作用就是啟動核心。
核心:核心是作業系統中最基本的部分。它主要負責四種功能:系統的記憶體管理、軟體程式管理、硬體裝置管理、檔案系統管理。在驅動開發中,核心用來啟動應用程式。
根檔案系統:根檔案系統是核心啟動後第乙個掛載的檔案系統,是使用者和核心互動的工具。
二. 驅動程式和應用程式的關係
寫乙個應用程式使用的是標準的介面函式,這些標準的介面函式是由c庫提供的。實際上呼叫swi異常處理進入核心通過system call inte***ce ,呼叫驅動程式。實現應用程式---->核心---->驅動程式的過程。
乙個驅動程式就有基本的框架。
應用程式中有標準的open 、read、write函式,例如:對應於驅動的led_open、led_read、led_write。
①寫出led_open、led_write
//first_drv_open(struct inode *inode, struct file *file) first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
②通過定義乙個檔案操作的結構體來告訴核心 static struct file_operations first_drv_fops這個結構體中就包括open和write。
③註冊字元裝置,讓裝置號和檔案操作的結構體相聯絡 register_chrdev,相當於乙個入口函式,寫成***_init(),再經過修飾入口函式,讓核心確定呼叫入口函式module_init()
④登出字元裝置,這裡和註冊相對應unregister_chrdev,出口函式寫成***_exit,同樣需要修飾module_exit()
⑤乙個.c的程式需要標頭檔案,加上所必須的標頭檔案。
這就是乙個最簡單的驅動程式框架。
三.完成乙個驅動程式的過程
1.編譯需要在linux伺服器上編譯。在每次編譯之前都需要對核心進行編譯,這裡我不是很清楚,如果不編譯在編譯驅動程式時會報錯。
2.把編譯到的.ko檔案放在/work/nfs的目錄下。然後在開發板上實現掛載
手動掛載方法:mount -t nfs -o nolock,vers=2 192.168.***.***:/work/nfs /mnt
3.insmod進行載入 insmod ***.ko
4.裝置號,可以手動指定裝置號,通過使用命令cat /proc/devices檢視驅動程式的裝置號後,使用mknod *** c 主裝置號 次裝置號 常見裝置檔案 在/dev目錄下可以看到所建立的裝置檔案。也可以使用程式自動生成裝置檔案。
5.應用程式測試,寫乙個應用程式在伺服器上交叉編譯,arm-linux-gcc -o 執行檔案 .c檔案 將執行檔案拷到/work/nfs目錄下 然後執行程式實現應用程式對驅動程式的測試。
第一次總結就這麼多,有錯的地方,請大家指正。
Linux驅動學習總結
本人剛學linux驅動不久,把這段時間學習的一些總結體會寫出來,以起到拋磚引玉的作用,根據學習的加深,我會持續寫出來。1.如果要對裝置進行有讀寫控制,字元裝置要實現cdev結構,塊裝置要實現gendisk結構。2.驅動模型提供標準的通用的管理裝置的框架 方法,把我們的驅動按照驅動模型的框架來構造,方...
linux驅動學習(五) char dev總結
回顧 裝載模組到正執行的核心和移除模組 include module init module exit 用於指定模組的初始化和清除函式的巨集 init exit initdata exitdata include 最重要的標頭檔案之一,該檔案包含驅動程式使用的大部分核心api函式的定義,包含睡眠函式...
linux驅動學習(五) char dev總結
裝載模組到正執行的核心和移除模組 include module init module exit 用於指定模組的初始化和清除函式的巨集 init exit initdata exitdata include 最重要的標頭檔案之一,該檔案包含驅動程式使用的大部分核心api函式的定義,包含睡眠函式以及各...