linux 0 11 原始碼學習(十三)

2021-08-28 10:42:43 字數 1170 閱讀 4509

字元裝置驅動

在linux 0.11版本中,字元裝置驅動原始碼分為三塊:向上暴露的字元裝置驅動介面tty_io.c與tty_ioctl.c,與塊裝置驅動一樣,在字元驅動檔案(read_write.c)操作中被呼叫;實現串列埠的驅動rs_io.s和serial.c;實現鍵盤驅動的keyboard.s以及實現控制台輸出的console.c。

對於字元裝置驅動linux為每個裝置維護乙個tty_struct的結構體,在這個結構體內部包含了字元裝置的讀寫緩衝佇列,核心的幾個結構體定義如下:

struct tty_struct ;

extern struct tty_struct tty_table;

struct tty_queue ;
struct termios ;
注《參考unix環境高階程式設計 十八章 終端i/o>:在unix系統中遵循的posix.1標準,終端i/o有兩種不同的工作模式:

規範模式輸入處理:終端以行為單位進行處理,對每個讀要求驅動最多返回一行;處理流程使用者程序 -> 讀寫函式 -> 終端行規則 -> 終端裝置驅動程式 -> 實際終端裝置

非規範模式輸入處理:輸入字元不組成行;

在預設情況下是規範模式。其次所有的終端裝置特性都包含在terminos結構中。

在tty_io.c中主要是三個函式copy_to_cooked、tty_read和tty_wirte。這裡tty_read和tty_write都是被使用者程序呼叫,copy_to_cooked被中斷處理do_tty_interrupt呼叫。do_tty_interrupt在具體的裝置中斷中被呼叫,見keyboard.s和rs_io.s。

其中copy_to_cooked函式實現的就是上面注釋中終端行規則處理,它將read_q的資料處理後寫入secondary。

喚醒secondary中的等待程序,即設定狀態為runnable;

void wake_up(struct task_struct **p)//疑問:明明是程序列表,但這裡貌似只喚醒了對頭的程序??

}

tty_read和tty_write所完成的工作相對比較簡單,從sencondary中讀取資料,或向write_q中寫入資料。對tty_write在寫入資料後呼叫schedule觸發排程。

linux 0 11 原始碼學習(六)

main.c main函式其實是核心的初始化,如果把核心功能比作業務軟體的話,就相當於是業務的初始化,從該檔案的資料夾歸屬 init資料夾 也可以看出這一點。main主函式很短,從 中可以基本看出整個核心的功能模組,如下 void main void for pause 注 在linux中fork乙...

linux 0 11 原始碼學習(五)

head.s head.s 是系統模組的入口,其編譯器已經是gnu彙編,但從功能上將仍然屬於核心啟動階段,主要的功能是對386 cpu的初始化,如使用者堆疊 idt gdt和頁表。因此從資料夾的歸屬看,它仍然放在boot資料夾中,與bootsect和setup一塊。head.s的核心功能 簡單的暫存...

linux 0 11 原始碼學習(十四)

檔案系統綜述 linux 檔案系統是基於minix 1.0檔案系統,這部分的 量是整個核心裡最大的,但 結構對應著minix檔案系統的構成,還是比較清晰易讀的。minix檔案系統 minix的檔案系統由以下幾部分組成 struct super block struct d inode 同時在linu...