SylixOS 下的IO系統呼叫

2021-08-28 11:09:41 字數 1851 閱讀 4496

sylixos標準i/o基本介紹

簡介i/o 系統又稱作輸入輸出系統,sylixos 相容posix標準輸入輸出系統,sylixos的i/o概念繼承了unix作業系統的i/o概念,認為一切皆為檔案。與unix作業系統相同, sylixos中的檔案也分為不同的型別。

兩種i/o型別

i/o系統分為 orig 型驅動結構和 new_1 型驅動結構,如圖 1.1和圖 1.2。

圖 1.1 orig 型驅動結構

圖 1.2 new 型驅動結構

重要的資料結構

檔案描述符表:

typedef struct lw_fd_desc;

檔案結構結構體:

typedef struct lw_fd_entry;

檔案節點:

typedef struct lw_fd_node;

rootfs 節點:

typedef struct lw_rootfs_node lw_rootfs_node;

裝置頭:

typedef struct lw_dev_hdr;

基本流程

系統裝置註冊流程如圖 3.1:

struct file_operations  fileop,裝置檔案操作控制塊,先對 fileop成員函式賦值,呼叫iosdrvinstallex2(&fileop,裝置型別),將返回「驅動程式索引號」。

api_iosdrvinstallex2(struct file_operations  *pfileop, int  itype),搜尋全域性 _s_deventrytbl(預設64)表,查詢未使用的驅動程式控制塊,返回該陣列下標,關聯裝置檔案操作控制塊函式。

裝置建立,api_iosdevaddex(plw_dev_hdr  pdevhdrhdr, cpchar  pcdevname, int  idrvnum, uchar uctype),將api_iosdrvinstallex2所產生的驅動索引號與具體的裝置頭關聯,建立新的檔案系統節點rootfsmakedev,最後將該裝置新增進裝置管理鍊錶_s_plinedevhdrheader進行管理;

圖 3.1 系統裝置建立過程

檔案i/o系統 open函式流程如圖 3.2:

open函式實際上呼叫_ioopen,_ioopen 先檢查檔名的合法性;

呼叫iofullfilenameget()函式,通過 cpcname 查詢到裝置註冊到檔案系統中的節點,返回該節點對應的驅動裝置頭;

然後通過獲取的裝置頭和裝置名呼叫iosfdnew()建立新的檔案結構並鏈入到全域性檔案結構頭表中_s_plinefileentryheader;

從全域性檔案描述符表陣列中_g_fddesctbl查詢到未使用的最小檔案描述符表,返回該陣列下表作為檔案描述符,將該檔案描述表關聯上新建立的檔案結構,將新建立的檔案結構關聯上裝置頭;

呼叫iosopen(),從獲取到的裝置頭中獲取對應裝置的裝置驅動程式索引號,並通過該索引號從全域性驅動表中查詢到對應的裝置open函式,使用該函式,如果是new_1型驅動將返回對應的檔案節點;

將呼叫驅動open函式返回的驅動內部資料關聯上檔案結構,使用函式iosfdset();

圖 3.2 標準open呼叫過程

Linux系統呼叫IO

讀檔案 ssize t read int fd,void buf,size t count 引數一 int open的返回值 引數二 void 用來存放讀取資料的記憶體的首位址 引數三 size t 讀取內容大小,單位 位元組 返回值 成功 0 讀取的位元組數 0 檔案末尾 失敗 1 寫檔案ssiz...

系統呼叫IO介面

int open const char pathname,int flags,mode t mode 功能 開啟檔案 pathname 指定要開啟的檔名稱 flages 選項引數 必選引數 o rdonly 讀 o wrnoly 寫 o rdwr 只能選一 讀寫 可選引數 o creat 若檔案存在...

linux下epoll系統呼叫實現I O復用

epoll系統呼叫 穿件核心事件表,返回指向被建立表的檔案描述符 作為其它epoll函式的第乙個引數 include int epoll create int size epoll ctl實現對核心事件表的操作 int epoll ctl int epfd,int op,int fd,struct ...