學會Linux Kernel熟練Linux
在當今社會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。
【編輯推薦】