2011年12月30日 星期五

基礎 Linux Device Driver 驅動程式#4 (執行環境 context)

關於執行環境:
由於裝置驅動程式是屬於kernel程式碼的一部份,
且驅動程式在kernel space運作,
kernel的程式有context(執行環境)的觀念,並分為以下兩種:
Process context(一般行程執行環境)
Interrupt context(中斷執行環境)

但這兩種context有其差異性,如下所示:
------------------------------------------------------------------------
| Context           | 可否sleep | 可否被preempt(搶先執行) | 處理時間   |
| Process context   |     可    |            可           |   可拖長   |
| Interrupt context |   不可    |          不可           |  極力縮短  |
------------------------------------------------------------------------

重點就在於Interrupt context是全系統執行權限最高的,
如果sleep的話,可想而知,會有什麼事發生,
就是沒人能叫醒它,結果就造成系統呼叫死結,導致kernel panic並停止運作。
因此就要確定,在interrupt context 的kernel 函式都不會用到sleep。
基於同樣理由,故不能被preempt。

關於Endian:
Byte 陣列一次讀寫2個bytes 以上的資料時,byte會以何種次序排列,
就是所謂endian的問題。

那當然, 我們可用簡單的程式來測試一下。
test_endian.c 的程式碼如下:

/*****************************************************************************/

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     
     4 int main(void)
     5 {
     6 unsigned char buf[4];
     7 int n = 0xdeabbeef;
     
     8 memcpy(buf, &n, sizeof(n));
     9 printf("%02x %02x %02x %02x\n",
    10                buf[0], buf[1], buf[2], buf[3]
    11              );
     
    12 return 0;
    13 }

/*****************************************************************************/

# gcc test_endian.c -o test_endian
# ./test_endian
如果執行結果為
ef be ab de <--- Little endian
de ab be ef <---    Big endian

但通常開發驅動程式的時候,不需要應對endian的問題,因為kernel會把endian的部份吸收。
有endian差異的部份主要包含
CPU
Bus(PCI 或 USB)
網路封包
EEPROM等資料內容


註記及聲明:
本教學,是參考Linux Device Driver Programming驅動程式設計由平田豐著的這本書。

沒有留言:

張貼留言