日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统总结Unix环境编程(四) ---- 设备管理(I/O原理)

發(fā)布時間:2024/1/18 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统总结Unix环境编程(四) ---- 设备管理(I/O原理) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引子

? ? ?外部設(shè)備分為存儲性設(shè)備和I/O型設(shè)備,設(shè)備管理通常采用I/O中斷、緩沖區(qū)管理、通道、設(shè)備驅(qū)動調(diào)度等多種技術(shù)。通常有以下功能:

? ? ?設(shè)備中斷處理

? ? ?緩沖區(qū)管理

? ? ?設(shè)備分配去配

? ? ?設(shè)備驅(qū)動管理

? ? ?實現(xiàn)虛擬設(shè)備

一、I/O硬件原理

? ? 1、概念:I/O系統(tǒng) I/O操作 I/O操作特性

? ? 2、I/O控制方式:對CPU和設(shè)備的職能進行合理分工

? ? ? ? 輪詢方式:cpu指定交換字節(jié)數(shù)和起始地址,不斷測試設(shè)備直到拿到所有數(shù)據(jù),串行工作浪費I/O cpu等待時間

? ? ? ? 中斷方式:cpu與設(shè)備間有中斷請求線,需要cpu時刻準(zhǔn)備響應(yīng)設(shè)備中斷,若同時有大量設(shè)備中斷可能丟數(shù)據(jù)

? ? ? ? DMA方式:設(shè)備通過DMA控制器直接與內(nèi)存交換數(shù)據(jù),周期竊用總線控制權(quán),不需要cpu干預(yù)

? ? ? ? 通道方式:I/O處理器,與cpu并行,四級鏈接,三級控制:

? ? ? ? ? ? ? ? ? CPU(I/O指令) ==> 通道(通道命令) ==> 控制器 (動作序列)==> 設(shè)備

? ? 3、設(shè)備控制器

? ? ? ? I/O設(shè)備的硬件:機械部件(設(shè)備本身)和電子部件(如:設(shè)備控制器或適配器,可插入主板擴充槽的印刷電路板)

? ? ? ? 操作系統(tǒng)實際上是與控制器通信,從磁盤中以字位串讀取頭標(biāo)(記錄扇區(qū)等信息),4096 B扇區(qū)和糾錯碼,由控制器裝配成字節(jié),存入控制器內(nèi)部的緩沖區(qū)形成字節(jié)快,在確認(rèn)無錯后,復(fù)制到內(nèi)存。

? ? ?主要功能:

? ? ? ? ?接收和識別CPU或通道發(fā)來的命令

? ? ? ? ?實現(xiàn)數(shù)據(jù)交換

? ? ? ? ?發(fā)現(xiàn)和記錄設(shè)備及自身的狀態(tài)信息,供CPU處理使用

? ? ? ? ? 設(shè)備地址識別?

二、I/O軟件原理

? ?2.1 I/O軟件設(shè)計需要考慮的問題

? ? ? ? 1.設(shè)備無關(guān)性;程序員/用戶只需要跟設(shè)備抽象打交道

? ? ? ? 2.出錯處理;

? ? ? ? 3.同步/異步傳輸;

? ? ? ? ? ? ?異步傳輸:CPU在啟動I/O操作后,可繼續(xù)執(zhí)行其他工作

? ? ? ? ? ? ?同步傳輸:? 阻塞方式,讓啟動I/O的進程掛起等待,直至數(shù)據(jù)傳輸完成

? ? ? ? 4.緩沖技術(shù);建立緩沖區(qū),讓數(shù)據(jù)的到達(dá)率和離去率相匹配,以提高系統(tǒng)吞吐率

??2.2? I/O軟件層次/ I/O子系統(tǒng)層次

? ? ? ? 1.? 中斷處理程序;

? ? ? ? 2.? 設(shè)備驅(qū)動程序;

? ? ? ? 3.? 獨立于設(shè)備的I/O軟件;

? ? ? ? 4.? 用戶空間的I/O軟件;

? ?下四層構(gòu)成內(nèi)核空間I/O軟件 ,linux系統(tǒng)編寫C程序調(diào)用printf()的過程如下圖:

? ? ? ? ?1. 用戶程序調(diào)用標(biāo)準(zhǔn)庫函數(shù)printf() ;

? ? ? ? ?2.? printf函數(shù)中通過一系列系統(tǒng)調(diào)用轉(zhuǎn)到write()函數(shù),write()中有陷阱指令(用戶態(tài)->內(nèi)核態(tài))int 0x80 (IA-32);

? ? ? ? ?3.? 進程進入內(nèi)核態(tài),系統(tǒng)調(diào)用處理程序system_call() --系統(tǒng)調(diào)用的唯一入口,開始執(zhí)行;

? ? ? ? ?4.? 將根據(jù)EAX寄存器中的系統(tǒng)調(diào)用號跳轉(zhuǎn)到當(dāng)前系統(tǒng)調(diào)用對應(yīng)的系統(tǒng)調(diào)用服務(wù)例程sys_write();

? ? ? ? ?5.? 執(zhí)行結(jié)束后返回用戶態(tài),接著執(zhí)行后面一條指令。??

//write()封裝函數(shù)對應(yīng)的匯編代碼,AT&T格式write:push1 %ebx // 將EBX入棧movl $4, %eax // 將系統(tǒng)調(diào)用號送EAXmovl 8(%esp), %ebx // 將第一個參數(shù)fd送EBXmovl 12(%esp), %ecx // 將第二個參數(shù)buf送ECXmovl 16(%esp), %edx // 將第三個參數(shù)n送EDX int $0x80 // 進入系統(tǒng)調(diào)用處理程序system_call執(zhí)行cmpl $-132, %eax // 檢查返回值,假定最大出錯碼為131 jbe .L1 // 若無錯誤,跳轉(zhuǎn)至.L1negl %eax // 將返回值取負(fù)送EAXmovl %eax, error // 將EAX值送errormovl $-1, %eax // 將write函數(shù)返回值置-1 .L1: popl %ebxret

? ? ? ? ? ? ?

? ?2.2.1 I/O中斷處理程序

? ?2.2.2 I/O設(shè)備驅(qū)動程序功能

? ? ? 1.設(shè)備初始化;

? ? ? 2.執(zhí)行設(shè)備驅(qū)動例程;

? ? ? 3、調(diào)用和執(zhí)行中斷處理程序

? ?2.2.3 獨立于設(shè)備的I/O軟件

? ? 執(zhí)行適用于所有設(shè)備的常用功能,并向用戶層軟件提供一致性接口

? ? ? ? ? ? ? 1.設(shè)備命名與保護;

? ? ? ? ? ? ? 2.提供與設(shè)備無關(guān)的快尺寸;

? ? ? ? ? ? ? 3, 緩沖技術(shù);

? ? ? ? ? ? ? 4.設(shè)備分配與狀態(tài)跟蹤;

? ? ? ? ? ? ? 5.錯誤處理與報告(與設(shè)備無關(guān))

? ?2.2.4?用戶空間的I/O軟件

? ? unix高級環(huán)境編程中的各種I/O,如標(biāo)準(zhǔn)I/O、 系統(tǒng)級I/O(read.write)?

? ? C標(biāo)準(zhǔn)I/O庫函數(shù)的不足:

? ? ? ? ?1.? 不存在加鎖、解鎖保證文件的安全性

? ? ? ? ?2.? 所有I/O是同步的,程序必須執(zhí)行完I/O后才能繼續(xù)執(zhí)行

? ? ? ? ?3.? 無法使用其完成某些I/O功能

? ? ? ? ?4.? 進行網(wǎng)絡(luò)編程易于出現(xiàn)緩沖區(qū)溢出

? ?故常常自行封裝系統(tǒng)級I/O構(gòu)造適合自己的I/O軟件,windows API:CreateFile()..?

三、I/O硬件和軟件的接口

? I/O設(shè)備

?設(shè)備控制器

? I/O端口及其編址

四、緩沖技術(shù)(待補充)

五、驅(qū)動調(diào)度技術(shù)

? 提高磁盤I/O速度的方法

六、設(shè)備分配

? ?設(shè)備獨立性:邏輯設(shè)備 映射為 物理設(shè)備

七、虛擬設(shè)備:脫機外圍計算機

八、Linux設(shè)備管理(待完善)

? 5種I/O模型:

? ? ? ? 阻塞I/O

? ? ? ? 非阻塞I/O

? ? ? ? ?復(fù)用型I/O

? ? ? ? ?信號驅(qū)動I/O

? ? ? ? ? 異步I/O

? ? 基本過程:數(shù)據(jù)-> 內(nèi)核緩沖區(qū) ->進程緩沖區(qū)

? 8.1 高級I/O

非阻塞I/O、記錄鎖、I/O多路轉(zhuǎn)接(select/poll)、異步I/O、readv和writev、存儲映射I/O

指定非阻塞I/O的標(biāo)志:

? ? ?1. 調(diào)用open指定O_NONBLOCK;

? ? ?2. 已經(jīng)打開的描述符調(diào)用fcntl,由該函數(shù)打開O_NONBLOCK文件狀態(tài)標(biāo)志;

POSIX.1要求:對于一個非阻塞的描述符,如果無數(shù)據(jù)可讀,則read返回-1,errno設(shè)置為EAGAIN

非阻塞I/O: open、read、write設(shè)置為NONBLOCK,通過輪詢的方式讀寫數(shù)據(jù);

設(shè)備鎖

? 8.2? 終端I/O

工作模式:規(guī)范模式輸入處理,以行為單位處理,對于每個讀請求,終端驅(qū)動程序最多返回一行
? ? ? ? ?非規(guī)范模式輸入處理,輸入字符不裝配成行
? 終端設(shè)備是由通常位于內(nèi)核中的中斷驅(qū)動程序控制的,每個終端設(shè)備都有一個輸入隊列和輸出隊列
? ? ? ? ?如果打開了回顯功能,則在輸入隊列和輸出隊列之間有一個隱含的鏈接

? struct termios {tcflag_t c_iflag; ? /* input flag 通過終端設(shè)備驅(qū)動程序控制字符的輸入 剝除輸入字節(jié)的第8位,允許輸入奇偶校驗*/tcflag_t c_oflag; ? /* output flag 控制字符的輸出, */tcflag_t c_cflag; ? /* control flag RS-232串行線, 忽略調(diào)制解題器的狀態(tài)線,每個字符的一個或兩個停止位*/tcflag_t c_lflag; ? /* local flags 影響驅(qū)動程序與用戶的接口,回顯開關(guān),*/cc_t cc_c[NCCS]; ? ?/* control characters */ }

? ??

c_cflag終端標(biāo)志

c_iflag終端標(biāo)志

c_lflag終端標(biāo)志

c_oflag終端標(biāo)志

終端I/O函數(shù)

與終端有關(guān)函數(shù)的關(guān)系

終端行規(guī)程

#include <termios.h> /* 獲取和設(shè)置終端屬性 */ int tcgetattr(int fd, struct termios *termptr) int tcsetattr(int fd, int opt, const struct termios *termptr)/* 波特率函數(shù) */ speed_t cfgetispeed(const struct termios *termptr) speed_t cfgetospeed(const struct termios *termptr)int cfsetispeed(const struct termios *termptr, speed_t speed); int cfsetospeed(const struct termios *termptr, speed_t speed);#include <stdio.h> /* 確定控制終端的名字 */ char *ctermid(char *ptr)

?

總結(jié)

以上是生活随笔為你收集整理的操作系统总结Unix环境编程(四) ---- 设备管理(I/O原理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。