在當今社會Linux越來越成為主流,你瞭解Linux系統嗎?本文為你介紹Linux Kernel,Linux Kernel有一個很好的特性,可以支援在運行是進行擴充。這意味著系統啟動運行是,我們仍然可以向Linux kernel添加功能。這種運行時可以被添加到kernel的代碼稱為Module模組)。
Linux Kernel支援好幾種模組類型,包括裝置驅動程式。每個模組由目標程式碼群組成,不是一個完整的可執行程式。系統運行時,我們可以通過insmod將模組串連到正在啟動並執行核心中去。也可以使用lsmod列出已載入模組,rmmod或modprobe –r 移除模組。
Linux系統將裝置分為三種基本類型:字元裝置,塊裝置,網路介面。
字元裝置是能夠像位元組流一樣被訪問的裝置,一般只能順序訪問。其操作類似檔案操作。
塊裝置上能夠容納檔案系統,可以通過檔案系統隨機訪問。其操作也類似於檔案操作。
網路介面是負責資料包的傳輸和接收的,一般無法影射到檔案系統的節點。它與核心的通訊跟前面兩種裝置不同,而是通過socket方式。在系統和驅動程式之間定義有專門的資料結構(sk_buff)進行資料的傳遞。系統裡支援對發送資料和接收資料的緩衝,提供流量控制機制,提供對多協議的支援。
在編寫模組的時候,應該注意,模組僅僅被串連到核心,所以它只能調用由核心匯出的那些函數,而不能調用其他的本模組未定義的函數。
在Linux kernel2.6.X下進行模組開發時,需要預先準備好“kernel tree(核心樹)”,即獲得與本系統相同的核心的原始碼並編譯出目標檔案。
一個最簡單的hello world驅動例子:
- hello_world.c:
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT "Hello, world\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT "Goodbye, cruel world\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- Makefile:
- obj-m := hello.o
- KERNELDIR ?= /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- default:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
其中,源檔案中的module_init和module_exit指定了模組被載入時執行的初始化函數和卸載時執行的清理函數。另外可以使用module_param指定載入模組時可以設定的參數。Makefile中的obj-m指定了使用make modules時候構造*.ko目標檔案時使用的*.o目標檔案。
Linux Kernel的瞭解,讓你學好Linux。
- 教你四種安裝Linux方法
- 詳解嵌入式Linux驅動入門
- 20年風雨曆程:Linux嵌入式
- 10個最好的自由Linux平台ERP軟體
- 全面解讀嵌入式Linux