Linux內核模塊/驅動編程基礎

linux內核開發時需要注意以下幾個問題:
1.不能訪問C庫,內核不能使用標準庫。這個可以在編譯鏈接內核以後從內核目錄下的.vmlinux.cmd可以看出:arm-xxx-ld -nostdlib ... ... 。不過內核在lib下實現了部分常用的函數,如memset,strcpy這類函數,還有可能針對具體體系結構進行優化的代碼,一般在arch/xxx/lib下。

2.內核編程使用的GNU C,而不是我們的標準C語言語法。看看內核的代碼就知道。

3.因爲是內核,所以其內存沒有保護機制的。因爲內核是在裸機上跑的,不像應用程序是在系統基礎上運行的。這個搞過嵌入式開發的人都應該懂的。

4.要慎用內核棧,儘量用全局變量或者動態分配。因爲內核棧被分配了比較小的空間,稍微大一點的數據就可能溢出,而且內核棧的底部保存着有關進程的信息。

5.不要輕易使用浮點數。

6.要注意同步和併發。多處理器,內核搶佔,中斷都有可能會產生競爭。


內核代碼還要注意可移植性,因爲它可能被移植到各種平臺上去。要保證代碼可移植性要主要以下問題:
1.字長和數據類型
各種不同的體系結構其字長是不一樣的。我們用的ARM平臺,其字長爲4個字節。數據類型考慮一下方面:
  1).不透明數據類型。這些數據類型一般由內核定義,其之所以這樣做,爲了方便兼容和後續升級。像pid_t,dev_t,atomic_t等。對這些數據類型的操作,如果內核提供了相關操作函數,應該使用這些函數,而不要手工去操作。
  2).指定數據類型。內核有些函數需要使用指定類型,那就一定要使用該類型。否則可能會出問題。
  3).長度明確的類型。像網絡包有一個16字節的段。這樣類型可以使用u8,u16,u32還有帶符號的,不過一般使用的比較少。
  4).char符號問題。最好明確是使用是帶符號的還是不帶符號的。

2.數據對齊。這個在ARM平臺我們應該碰到過,不小心就有可能產生取數異常。ARM7,ARM9是不支持非對齊訪問的,否則異常對待。新的ARMv7體系結構的芯片可以支持非對齊訪問了。

3.字節順序。主要是字中各種字節存放的順序。有little-endian和big-endian。


4.使用內核定義的宏,不要使用魔幻數,不要對內核做任何假設。像使用HZ,PAGE_SHIFT來代替某些假的的數字。


上面是一些基礎知識,那麼要進行內核編程,還需要了解哪些了。這就要看我們的內核提供了那些設施。以下是學習驅動編寫的一些基礎知識:
1).併發和競態
    信號量,互斥量
    completion
    spinlock_t
    atomic_t
2).阻塞,非阻塞,異步通知
    wait_queue_t
    異步通知
3).內存管理
    kmalloc/kfree
    get_free_pages/free_gages
4).I/O操作
    register_region_mem/release_region_mem
    ioremap/iounmap
    ioread/8/16/32
    iowrite8/16/32
5).中斷管理
    request_irq
    下半部機制:軟中斷,tasklets,工作隊列(work queue)
6).DMA

7).時間函數
     延時函數,timer

有了這些基礎,我們就可以進入驅動編程了。不過要理解上面的這些設施除了多看書還要多看代碼,並手動去寫寫才能理解。看看它們的實現。

寫驅動的話還需要鏈接下面這些基礎:
字符驅動註冊 regiser_chrdev_region/alloc_chrdev_region cdev_alloc/cdev_init/cdev_add/cdev_del

塊設備註冊和相關接口實現

網絡設備驅動net_device

另外瞭解一下linux設備驅動模型,bus,class,device,device_driver等。使用udev/mdev來動態生成/dev目錄是,需要用到/sys下的class和block目錄。

然後可以瞭解各種框架:

misc_dev
platform_devices
i2c
rtc
spi
frame buffer/LCD
usb
mmc
tty
input/keyboard/touchscreen
sound
V4L2
MTD
Bluetooth
Infrared
WIFI Driver

參考書籍:
1).Linux Kernel Development Second Edition. By Robert Love
2).Linux Device Drivers, 3rd Edition. By
Jonathan Corbet , Greg Kroah-Hartman , Alessandro Rubini

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章