include\linux下新增乙個tty.h,我們定義了乙個佇列結構體tty_queue,定義了乙個tty_struct結構體,裡面有三個佇列read_q、write_q、secondary還有乙個函式指標,剩下的就是一些對佇列的操作。
#ifndef tty_h
#define tty_h
#define tty_buf_size 1024
struct tty_queue ;
struct tty_struct ;
#define inc(a) ((a) = ((a)+1) & (tty_buf_size-1))
#define dec(a) ((a) = ((a)-1) & (tty_buf_size-1))
#define empty(a) ((a).head == (a).tail)
#define chars(a) (((a).head-(a).tail)&(tty_buf_size-1))
#define getch(queue,c) \
(void)()
#define putch(c,queue) \
(void)()
extern struct tty_struct tty_table;
#endif
key_board.c中定義乙個tty_table陣列,型別是tty_struct,其實在這裡直接用乙個tty_struct型別的變數會好一些,不過為了和linux統一也為了以後擴充套件方便就定義了乙個陣列。
put_queue是將掃瞄碼如佇列
#include extern void con_write(struct tty_struct * tty);
struct tty_struct tty_table = , /* console read-queue */
, /* console write-queue */
/* console secondary queue */
}};void put_queue(char scan_code)
console.c的改動比較大,但是很簡單,首先我們先定義了一堆和螢幕、視訊記憶體相關的變數,然後在con_init中對這些變數初始化。con_write函式的主要工作是解析寫佇列中的掃瞄碼,轉化為相應的字元並顯示在螢幕上,當然目前的con_write並不完善。do_tty_interrupt中呼叫了copy_to_cooked,copy_to_cooked將讀佇列中的掃瞄碼放到寫佇列中,然後呼叫tty->write(tty)
#include #include #include #include static unsigned char video_type; //使用的顯示型別
static unsigned long video_num_columns; //螢幕文字列數
static unsigned long video_num_lines; //螢幕文字行數
static unsigned long video_size_row; //螢幕每行使用的位元組數
static unsigned long video_mem_start; //顯示記憶體起始位址
static unsigned long video_mem_end; //顯示記憶體結束位址
static unsigned short video_port_reg; //顯示控制索引暫存器埠
static unsigned short video_port_val; //顯示控制資料暫存器埠
static unsigned short video_erase_char; //擦除字元屬性及字元(0x0720)
static unsigned long origin; //一屏的起始記憶體位址
static unsigned long scr_end; //一屏的末端記憶體位址
static unsigned long pos; //當前游標對應顯示記憶體的位置
static unsigned long x,y; //當前游標的位置
static unsigned long top,bottom;//滾動時頂行行號和底行行號
static unsigned char attr=0x0f;//字元屬性(黑底白字,字元高亮)高四位:背景(高亮/r/g/b);低四位:前景(高亮/r/g/b)
#define video_type_egac 0x21 // ega/vga 彩色模式
#define orig_x 0//初始游標列號
#define orig_y 0//初始游標行號
#define orig_video_cols (80)//字元列數
#define orig_video_lines (25)//字元行數
extern void keyboard_interrupt(void);
//設定游標的位置變數x,y和游標在視訊記憶體中對應的位置pos
static inline void gotoxy(unsigned int new_x,unsigned int new_y)
void con_init(void)
//擦除游標前乙個字元(用空格代替),並設定pos和x變數
static void del(void)
}//游標調回第一列(0列)
static void cr(void)
//游標位置下移一行
static void lf(void)
void con_write(struct tty_struct * tty)
else if (c==127)
else if (c==13)
} set_cursor();
}void copy_to_cooked(struct tty_struct * tty)
}void do_tty_interrupt(int tty)
system.h中新增
#define cli() __asm__ ("cli"::)
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
使用者程序緩衝區和核心緩衝區
常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...
php 緩衝區,PHP的輸出緩衝區
1 什麼是緩衝區?緩衝區的作用是把輸入或者輸出的內容先放進記憶體,而不顯示或者讀取,最本質的作用就是協調高速cpu和相對緩慢的io裝置 磁碟等 的運作。2 php在執行的時候,在什麼地方有用到緩衝區?當執行php的時候,如果碰到了echo print r之類的會輸出資料的 php就會將要輸出的資料放...