有兩種方式可以讓設備和應用程序之間聯系:1. 通過為設備創建的一個符號鏈;2. 通過輸出到一個接口WDM驅動程序建議使用輸出到一個接口而不推薦使用創建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創建一個惟一的、獨立于語言的訪問設備的方法。一個應用程序使用Win32APIs來調用設備。在某個Win32 APIs和設備對象的分發函數之間存在一個映射關系。獲得對設備對象訪問的第一步就是打開一個設備對象的句柄。 用符號鏈打開一個設備的句柄為了打開一個設備,應用程序需要使用CreateFile。如果該設備有一個符號鏈出口,應用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統本調用希望打開一個設備。這個設備必須有一個符號鏈,以便應用程序能夠打開它。有關細節查看有關Kdevice和CreateLink的內容。在上述調用中第一個參數中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數不是Windows 98/2000中驅動程序(.sys文件)的路徑。是到設備對象的符號鏈。如果使用DriverWizard產生驅動程序,它通常使用類KunitizedName來構成設備的符號鏈。這意味著符號鏈名有一個附加的數字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應用程序需要被覆蓋的I/O,第六個參數(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設備信息集,該信息集包含了特殊類中的所有設備接口信息。應用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設備接口的抽象。它的成員函數DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設備。下面用一個小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在設備中執行I/O操作一旦應用程序獲得一個有效的設備句柄,它就能使用Win32 APIs來產生到設備對象的IRPs。下面的表顯示了這種對應關系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設備類成員的Close和CleanUp:CreateFile使內核為設備創建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調用Close。如果被打開的設備不支持指定的功能,則調用相應的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應用程序代碼中可能會在打開設備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權的用戶企圖打開這個設備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數轉換成IRP域的方法依賴于設備對象的屬性。當設備設置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創建了一個存儲在IRP中的MDL域。一個設備可以通過調用Kirp::Mdl來存取MDL。當設備設置DO_BUFFERED_IO標志,設備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或寫操作獲得buff地址。當設備不設置DO_BUFFERED_IO標志也不設置DO_DIRECT_IO,內核設置IRP 的UserBuffer域來對應ReadFile或WriteFile中的buff參數。然而,存儲區并沒有被鎖住而且地址只對調用進程有效。驅動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調用,buffer參數的轉換依賴于特殊的I/O控制代碼,它不在設備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構造控制代碼。這個宏的其中一個參數指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數:Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統分配一個單一的緩沖來作為輸入與輸出。驅動程序必須在向輸出緩沖放數據之前拷貝輸入數據。驅動程序通過調用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統緩沖拷貝數據到提供給Ring 3級調用者使用的緩沖中。驅動程序必須在結束前存儲拷貝到IRP的Information成員中的數據個數。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數呈現不同的含義。參數InputBuffer被拷貝到一個系統緩沖,這個緩沖驅動程序可以通過調用KIrp::IoctlBuffer。參數OutputBuffer被映射到KMemory對象,驅動程序對這個對象的訪問通過調用KIrp::Mdl來實現。對于METHOD_OUT_DIRECT,調用者必須有對緩沖的寫訪問權限。注意,對METHOD_NEITHER,內核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調用進程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現在使用一個DeviceIoControl調用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設備拷貝串到里面并將拷貝的資結束設置到FirmwareRevSize中。在驅動程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
上傳時間: 2013-10-17
上傳用戶:gai928943
6.1 存儲器概述1、存儲器定義 在微機系統中凡能存儲程序和數據的部件統稱為存儲器。2、存儲器分類 微機系統中的存儲器分為內存和外存兩類。3、內存儲器的組成 微機系統中的存儲器由半導體存儲器芯片組成。 單片機內部有存儲器,當單片機內部的存儲器不夠用時,可以外擴存儲器。外擴的存儲器就是由半導體存儲器芯片組成的。 當用半導體存儲器芯片組成內存時必須滿足個要求:①每個存儲單元一定要有8個位。②存儲單元的個數滿足系統要求。注意:內存的容量是指它所含存儲單元的個數(每個存儲單元一定要有8個位,可以存儲8位二進制信息)。6.2 半導體存儲器由于集成工藝水平的限制,一個半導體存儲器芯片上所集成的單元個數和每個單元的位數有限,用它構成內存時必須滿足:內存容量和一個存儲單元有8個位的要求,因此內存常常由多個半導體存儲器芯片構成。 半導體存儲器芯片的存儲容量是指其上所含的基本存儲電路的個數,用單元個數×位數表示。掌握:① 已知內存容量和半導體存儲器芯片的容量,求用半導體存儲器芯片構成內存時需要的芯片個數。② 內存的容量=末地址—首地址+1 半導體存儲器芯片分成ROM和RAM兩類。6.2.1 ROM芯片6.2.2 RAM芯片6.3 MCS-51單片機存儲器擴展 在微機系統中存儲器是必不可少。MCS51系列單片機內部的存儲器不夠用時需要外擴半導體存儲器芯片,外擴的半導體存儲器芯片與MCS51系列單片機通過三總線交換信息。二者連接時必須考慮如下問題:1.二者地址線、數據線、控制線的連接。2.工作速度的匹配。CPU在取指令和存儲器讀或寫操作時,是有固定時序的,用戶要根據這些來確定對存儲器存取速度的要求,或在存儲器已經確定的情況下,考慮是否需要Tw周期,以及如何實現。3.片選信號的產生。目前生產的存儲器芯片,單片的容量仍然是有限的,通常總是要由許多片才能組成一個存儲器,這里就有一個如何產生片選信號的問題。4.CPU的驅動能力 。在設計CPU芯片時,一般考慮其輸出線的直流負載能力,為帶一個TTL負載。現在的存儲器一般都為MOS電路,直流負載很小,主要的負載是電容負載,故在小型系統中,CPU是可以直接與存儲器相連的,而較大的系統中,若CPU的負載能力不能滿足要求,可以(就要考慮CPU能否帶得動,需要時就要加上緩沖器,)由緩沖器的輸出再帶負載。6.3.1 ROM芯片的擴展6.3.2 RAM芯片的擴展
標簽: 存儲器接口
上傳時間: 2013-11-22
上傳用戶:moerwang
提出了一種改進的LSM-ALSM子空間模式識別方法,將LSM的旋轉策略引入ALSM,使子空間之間互不關聯的情況得到改善,提高了ALSM對相似樣本的區分能力。討論中以性能函數代替經驗函數來確定拒識規則的參數,實現了識別率、誤識率與拒識率之間的最佳平衡;通過對有限字符集的實驗結果表明,LSM-ALSM算法有效地改善了分類器的識別率和可靠性。關 鍵 詞 學習子空間; 性能函數; 散布矩陣; 最小描述長度在子空間模式識別方法中,一個線性子空間代表一個模式類別,該子空間由反映類別本質的一組特征矢量張成,分類器根據輸入樣本在各子空間上的投影長度將其歸為相應的類別。典型的子空間算法有以下三種[1, 2]:CLAFIC(Class-feature Information Compression)算法以相關矩陣的部分特征向量來構造子空間,實現了特征信息的壓縮,但對樣本的利用為一次性,不能根據分類結果進行調整和學習,對樣本信息的利用不充分;學習子空間方法(Leaning Subspace Method, LSM)通過旋轉子空間來拉大樣本所屬類別與最近鄰類別的距離,以此提高分類能力,但對樣本的訓練順序敏感,同一樣本訓練的順序不同對子空間構造的影響就不同;平均學習子空間算法(Averaged Learning Subspace Method, ALSM)是在迭代訓練過程中,用錯誤分類的樣本去調整散布矩陣,訓練結果與樣本輸入順序無關,所有樣本平均參與訓練,其不足之處是各模式的子空間之間相互獨立。針對以上問題,本文提出一種改進的子空間模式識別方法。子空間模式識別的基本原理1.1 子空間的分類規則子空間模式識別方法的每一類別由一個子空間表示,子空間分類器的基本分類規則是按矢量在各子空間上的投影長度大小,將樣本歸類到最大長度所對應的類別,在類x()iω的子空間上投影長度的平方為()211,2,,()argmax()jMTkkjpg===Σx (1)式中 函數稱為分類函數;為子空間基矢量。兩類的分類情況如圖1所示。
上傳時間: 2013-12-25
上傳用戶:熊少鋒
單片計算機(簡稱單片機)在工作時,因某種原因造成突然掉電,將會丟失數據存儲器(RAM)里的數據,沖掉前期工作的所有信息。為了在突然掉電時能夠保持數據存儲器(RAM)的數據,保證單片機系統穩定、可靠地工作,數據信息處理的安全,雖然單片機主電源里有大容量濾波電容器,當掉電時,單片機靠貯存在電容器里的能量,一般能維持工作半個周期(10ms)左右。為此,要求一旦市電發生瞬間斷電時,必須要有一種電源能在小于10ms 的時間內重新送電,確保單片機系統正常運行,這一任務就由UPS 來完成。電源系統瞬時掉電所產生的干擾會造成單片機的計算錯誤和數據丟失,有了UPS 可以使單片機系連續可靠地工作。單片機系統除使用UPS 外,下面介紹一種行之有效的后備電源。通過理論和實踐證明,當供電電壓由5V 下降到4 5V時單片機通常均能正常運行,但電壓再往下跌落時,單片機就不能繼續正常運行。在一般情況下CPU、CMOS、TTL 電路將因電源電壓跌落而首先不能正常運行,RAM在電壓跌落到比較低時尚能工作。因為單片機使用的主電源均有大容量電容,所以在主電源失電時,如果按放電曲線在下跌到單片機能正常運行工作的最低電壓之前,把后備電源接上便能保持單片機正常運行。
上傳時間: 2013-11-02
上傳用戶:niumeng16
作為嵌入式系統主控單元——單片機,其軟件往往是一個微觀的實時操作系統,且大部分是為某種應用而專門設計的。系統程序有實時過程控制或實時信息處理的能力,要求能夠及時響應隨機發生的外部事件并對該事件做出快速處理。而分時操作系統卻是把CPU的時間劃分成長短基本相同的時間區間,即“時間片”,通過操作系統的管理,把這些時間片依次輪流地分配給各個用戶使用。如果某個作業在時間片結束之前,整個任務還沒有完成,那么該作業就被暫停下來,放棄CPU,等待下一輪循環再繼續做。此時CPU又分配給另一個作業去使用。由于計算機的處理速度很快,只要時間片的間隔取得適當,那么一個用戶作業從用完分配給它的一個時間片到獲得下一個CPU時間片,中間有所“停頓”;但用戶察覺不出來,好像整個系統全由它“獨占”似的。分時操作系統主要具有以下3個特點:① 多路性。用戶通過各自的終端,可以同時使用一個系統。② 及時性。用戶提出的各種要求,能在較短或可容忍的時間內得到響應和處理。③ 獨占性。在分時系統中,雖然允許多個用戶同時使用一個CPU,但用戶之間操作獨立,互不干涉。分時操作系統主要是針對小型機以上的計算機提出的。一般而言,微處理器(MPU)驅動的通用計算機,系統設計人員對每一臺的最終具體應用都是不得而知的,因此,在價格允許的情況下,硬件設計務求CPU時鐘盡可能的快;計算及管理能力盡可能的強;程序和數據存儲器的容量盡可能的大;各種計算機外設的配接盡可能的詳盡等等,特別是采用分時操作系統的機器,因為是一機多用戶的管理系統,它的要求就更高了。相對而言,微控制器(MCU)俗稱單片機,是一個單片集成系統,它將這些或那些計算機所需的外設,諸如程序和數據存儲器、端口以及有關的子系統集成到一片芯片上。從硬件上,單片機系統與采用分時操作系統的計算機系統是無法比擬的。但是,在單片機系統的設計中,設計人員對其最終具體應用是一清二楚的,它的使用環境相對是單一固定的。所控制的過程的可預見性為分時系統思想的實現提供了可能性。具體一點就是:雖然單片機的CPU速度較低,但其任務是可預見的,這樣作業調度將變得簡單而無須占用很多的CPU時間,同時“時間片”的設計是具體而有針對性的,因此可變得很有效。一、單片機分時系統的設計單片機系統往往是一個嵌入式的控制系統,因此目前絕大部分的單片機系統還是一實時系統。能夠真正體現分時系統的設計思想的往往是那些多路重復檢測控制系統。即便是在這些多路重復檢測控制系統中,它的實時性也是非常重要的。也就是說,在單片機系統中應用了分時系統設計思想,但其及時性應首先進行考慮。
上傳時間: 2013-12-23
上傳用戶:佳期如夢
九.輸入/輸出保護為了支持多任務,80386不僅要有效地實現任務隔離,而且還要有效地控制各任務的輸入/輸出,避免輸入/輸出沖突。本文將介紹輸入輸出保護。 這里下載本文源代碼。 <一>輸入/輸出保護80386采用I/O特權級IPOL和I/O許可位圖的方法來控制輸入/輸出,實現輸入/輸出保護。 1.I/O敏感指令輸入輸出特權級(I/O Privilege Level)規定了可以執行所有與I/O相關的指令和訪問I/O空間中所有地址的最外層特權級。IOPL的值在如下圖所示的標志寄存器中。 標 志寄存器 BIT31—BIT18 BIT17 BIT16 BIT15 BIT14 BIT13—BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 00000000000000 VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF I/O許可位圖規定了I/O空間中的哪些地址可以由在任何特權級執行的程序所訪問。I/O許可位圖在任務狀態段TSS中。 I/O敏感指令 指令 功能 保護方式下的執行條件 CLI 清除EFLAGS中的IF位 CPL<=IOPL STI 設置EFLAGS中的IF位 CPL<=IOPL IN 從I/O地址讀出數據 CPL<=IOPL或I/O位圖許可 INS 從I/O地址讀出字符串 CPL<=IOPL或I/O位圖許可 OUT 向I/O地址寫數據 CPL<=IOPL或I/O位圖許可 OUTS 向I/O地址寫字符串 CPL<=IOPL或I/O位圖許可 上表所列指令稱為I/O敏感指令,由于這些指令與I/O有關,并且只有在滿足所列條件時才可以執行,所以把它們稱為I/O敏感指令。從表中可見,當前特權級不在I/O特權級外層時,可以正常執行所列的全部I/O敏感指令;當特權級在I/O特權級外層時,執行CLI和STI指令將引起通用保護異常,而其它四條指令是否能夠被執行要根據訪問的I/O地址及I/O許可位圖情況而定(在下面論述),如果條件不滿足而執行,那么將引起出錯碼為0的通用保護異常。 由于每個任務使用各自的EFLAGS值和擁有自己的TSS,所以每個任務可以有不同的IOPL,并且可以定義不同的I/O許可位圖。注意,這些I/O敏感指令在實模式下總是可執行的。 2.I/O許可位圖如果只用IOPL限制I/O指令的執行是很不方便的,不能滿足實際要求需要。因為這樣做會使得在特權級3執行的應用程序要么可訪問所有I/O地址,要么不可訪問所有I/O地址。實際需要與此剛好相反,只允許任務甲的應用程序訪問部分I/O地址,只允許任務乙的應用程序訪問另一部分I/O地址,以避免任務甲和任務乙在訪問I/O地址時發生沖突,從而避免任務甲和任務乙使用使用獨享設備時發生沖突。 因此,在IOPL的基礎上又采用了I/O許可位圖。I/O許可位圖由二進制位串組成。位串中的每一位依次對應一個I/O地址,位串的第0位對應I/O地址0,位串的第n位對應I/O地址n。如果位串中的第位為0,那么對應的I/O地址m可以由在任何特權級執行的程序訪問;否則對應的I/O地址m只能由在IOPL特權級或更內層特權級執行的程序訪問。如果在I/O外層特權級執行的程序訪問位串中位值為1的位所對應的I/O地址,那么將引起通用保護異常。 I/O地址空間按字節進行編址。一條I/O指令最多可涉及四個I/O地址。在需要根據I/O位圖決定是否可訪問I/O地址的情況下,當一條I/O指令涉及多個I/O地址時,只有這多個I/O地址所對應的I/O許可位圖中的位都為0時,該I/O指令才能被正常執行,如果對應位中任一位為1,就會引起通用保護異常。 80386支持的I/O地址空間大小是64K,所以構成I/O許可位圖的二進制位串最大長度是64K個位,即位圖的有效部分最大為8K字節。一個任務實際需要使用的I/O許可位圖大小通常要遠小于這個數目。 當前任務使用的I/O許可位圖存儲在當前任務TSS中低端的64K字節內。I/O許可位圖總以字節為單位存儲,所以位串所含的位數總被認為是8的倍數。從前文中所述的TSS格式可見,TSS內偏移66H的字確定I/O許可位圖的開始偏移。由于I/O許可位圖最長可達8K字節,所以開始偏移應小于56K,但必須大于等于104,因為TSS中前104字節為TSS的固定格式,用于保存任務的狀態。 1.I/O訪問許可檢查細節保護模式下處理器在執行I/O指令時進行許可檢查的細節如下所示。 (1)若CPL<=IOPL,則直接轉步驟(8);(2)取得I/O位圖開始偏移;(3)計算I/O地址對應位所在字節在I/O許可位圖內的偏移;(4)計算位偏移以形成屏蔽碼值,即計算I/O地址對應位在字節中的第幾位;(5)把字節偏移加上位圖開始偏移,再加1,所得值與TSS界限比較,若越界,則產生出錯碼為0的通用保護故障;(6)若不越界,則從位圖中讀對應字節及下一個字節;(7)把讀出的兩個字節與屏蔽碼進行與運算,若結果不為0表示檢查未通過,則產生出錯碼為0的通用保護故障;(8)進行I/O訪問。設某一任務的TSS段如下: TSSSEG SEGMENT PARA USE16 TSS <> ;TSS低端固定格式部分 DB 8 DUP(0) ;對應I/O端口00H—3FH DB 10000000B ;對應I/O端口40H—47H DB 01100000B ;對用I/O端口48H—4FH DB 8182 DUP(0ffH) ;對應I/O端口50H—0FFFFH DB 0FFH ;位圖結束字節TSSLen = $TSSSEG ENDS 再假設IOPL=1,CPL=3。那么如下I/O指令有些能正常執行,有些會引起通用保護異常: in al,21h ;(1)正常執行 in al,47h ;(2)引起異常 out 20h,al ;(3)正常實行 out 4eh,al ;(4)引起異常 in al,20h ;(5)正常執行 out 20h,eax ;(6)正常執行 out 4ch,ax ;(7)引起異常 in ax,46h ;(8)引起異常 in eax,42h ;(9)正常執行 由上述I/O許可檢查的細節可見,不論是否必要,當進行許可位檢查時,80386總是從I/O許可位圖中讀取兩個字節。目的是為了盡快地執行I/O許可檢查。一方面,常常要讀取I/O許可位圖的兩個字節。例如,上面的第(8)條指令要對I/O位圖中的兩個位進行檢查,其低位是某個字節的最高位,高位是下一個字節的最低位。可見即使只要檢查兩個位,也可能需要讀取兩個字節。另一方面,最多檢查四個連續的位,即最多也只需讀取兩個字節。所以每次要讀取兩個字節。這也是在判別是否越界時再加1的原因。為此,為了避免在讀取I/O許可位圖的最高字節時產生越界,必須在I/O許可位圖的最后填加一個全1的字節,即0FFH。此全1的字節應填加在最后一個位圖字節之后,TSS界限范圍之前,即讓填加的全1字節在TSS界限之內。 I/O許可位圖開始偏移加8K所得的值與TSS界限值二者中較小的值決定I/O許可位圖的末端。當TSS的界限大于I/O許可位圖開始偏移加8K時,I/O許可位圖的有效部分就有8K字節,I/O許可檢查全部根據全部根據該位圖進行。當TSS的界限不大于I/O許可位圖開始偏移加8K時,I/O許可位圖有效部分就不到8K字節,于是對較小I/O地址訪問的許可檢查根據位圖進行,而對較大I/O地址訪問的許可檢查總被認為不可訪問而引起通用保護故障。因為這時會發生字節越界而引起通用保護異常,所以在這種情況下,可認為不足的I/O許可位圖的高端部分全為1。利用這個特點,可大大節約TSS中I/O許可位圖占用的存儲單元,也就大大減小了TSS段的長度。 <二>重要標志保護輸入輸出的保護與存儲在標志寄存器EFLAGS中的IOPL密切相關,顯然不能允許隨便地改變IOPL,否則就不能有效地實現輸入輸出保護。類似地,對EFLAGS中的IF位也必須加以保護,否則CLI和STI作為敏感指令對待是無意義的。此外,EFLAGS中的VM位決定著處理器是否按虛擬8086方式工作。 80386對EFLAGS中的這三個字段的處理比較特殊,只有在較高特權級執行的程序才能執行IRET、POPF、CLI和STI等指令改變它們。下表列出了不同特權級下對這三個字段的處理情況。 不同特權級對標志寄存器特殊字段的處理 特權級 VM標志字段 IOPL標志字段 IF標志字段 CPL=0 可變(初POPF指令外) 可變 可變 0 不變 不變 可變 CPL>IOPL 不變 不變 不變 從表中可見,只有在特權級0執行的程序才可以修改IOPL位及VM位;只能由相對于IOPL同級或更內層特權級執行的程序才可以修改IF位。與CLI和STI指令不同,在特權級不滿足上述條件的情況下,當執行POPF指令和IRET指令時,如果試圖修改這些字段中的任何一個字段,并不引起異常,但試圖要修改的字段也未被修改,也不給出任何特別的信息。此外,指令POPF總不能改變VM位,而PUSHF指令所壓入的標志中的VM位總為0。 <三>演示輸入輸出保護的實例(實例九)下面給出一個用于演示輸入輸出保護的實例。演示內容包括:I/O許可位圖的作用、I/O敏感指令引起的異常和特權指令引起的異常;使用段間調用指令CALL通過任務門調用任務,實現任務嵌套。 1.演示步驟實例演示的內容比較豐富,具體演示步驟如下:(1)在實模式下做必要準備后,切換到保護模式;(2)進入保護模式的臨時代碼段后,把演示任務的TSS段描述符裝入TR,并設置演示任務的堆棧;(3)進入演示代碼段,演示代碼段的特權級是0;(4)通過任務門調用測試任務1。測試任務1能夠順利進行;(5)通過任務門調用測試任務2。測試任務2演示由于違反I/O許可位圖規定而導致通用保護異常;(6)通過任務門調用測試任務3。測試任務3演示I/O敏感指令如何引起通用保護異常;(7)通過任務門調用測試任務4。測試任務4演示特權指令如何引起通用保護異常;(8)從演示代碼轉臨時代碼,準備返回實模式;(9)返回實模式,并作結束處理。
上傳時間: 2013-12-11
上傳用戶:nunnzhy
1. RS-232-C 詳解 22. 串口通信基本接線方法 123. 串口通訊的概念及接口電路 134. 有關RS232和RS485接口的問答 145. 同步通信方式 166. 通信協議197. 實戰串行通訊258. 全雙工和半雙工方式 339. 淺析PC 機串口通訊流控制 3410. 奇偶校驗 3511. 開發通信軟件的技術與技巧 3612. 接口技術的基本知識 4113. 一個單片機串行數據采集/傳輸模塊的設計 4414. 單工、半雙工和全雙工的定義 4815. 從RS232 端口獲得電源4916. 串行同步通信的應用5017. 串行通信波特率的一種自動檢測方法5318. RS-232、RS-422 與RS-485 標準及應用5619. 串口泵 6串行通信接口標準經過使用和發展,目前已經有幾種。但都是在RS-232標準的基礎上經過改進而形成的。所以,以RS-232C為主來討論。RS-323C 標準是美國EIA(電子工業聯合會)與BELL等公司一起開發的1969 年公布的通信協議。它適合于數據傳輸速率在0~20000b/s 范圍內的通信。這個標準對串行通信接口的有關問題,如信號線功能、電器特性都作了明確規定。由于通行設備廠商都生產與RS-232C制式兼容的通信設備,因此,它作為一種標準,目前已在微機通信接口中廣泛采用。在討論RS-232C 接口標準的內容之前,先說明兩點:首先,RS-232-C標準最初是遠程通信連接數據終端設備DTE(Data Terminal Equipment)與數據通信設備DCE(Data Communication Equipment)而制定的。因此這個標準的制定,并未考慮計算機系統的應用要求。但目前它又廣泛地被借來用于計算機(更準確的說,是計算機接口)與終端或外設之間的近端連接標準。顯然,這個標準的有些規定及和計算機系統是不一致的,甚至是相矛盾的。有了對這種背景的了解,我們對RS-232C標準與計算機不兼容的地方就不難理解了。其次,RS-232C 標準中所提到的“發送”和“接收”,都是站在DTE 立場上,而不是站在DCE 的立場來定義的。由于在計算機系統中,往往是CPU 和I/O設備之間傳送信息,兩者都是DTE,因此雙方都能發送和接收。
上傳時間: 2013-11-21
上傳用戶:crazyer
摘要: 本文介紹了L ED 顯示屏常規型驅動電路的設計方式及其存在的缺陷, 提出了簡單的L ED 顯示屏恒流驅動方式及電路的實現。關鍵詞:L ED 顯示屏 動態掃描 驅動電路中圖分類號: TN 873+ . 93 文獻標識碼:A 文章編號: 1005- 9490(2001) 03- 0252- 051 引 言 L ED 顯示屏是80 年代后期在全球迅速發展起來的新型信息顯示媒體, 它利用發光二極管構成的點陣模塊或像素單元, 組成大面積顯示屏幕, 以其可靠性高、使用壽命、環境適應能力強、性能價格比高、使用成本低等特點, 在信息顯示領域已經得到了非常廣泛的應用[ 1 ]。L ED 顯示屏主要包括發光二極管構成的陣列、驅動電路、控制系統及傳輸接口和相應的應用軟件等, 其中驅動電路設計的好壞, 對L ED 顯示屏的顯示效果、制作成本及系統的運行性能起著很重要的作用。所以, 設計一種既能滿足控制驅動的要求, 同時使用器件少、成本低的控制驅動電路是很有必要的。本文就常規型驅動電路的設計作些分析并提出恒流驅動電路的設計方式。2 L ED 顯示屏常規驅動電路的設計 L ED 顯示屏驅動電路的設計, 與所用控制系統相配合, 通常分為動態掃描型驅動及靜態鎖存型驅動二大類。以下就動態掃描型驅動電路的設計為例為進行分析:動態掃描型驅動方式是指顯示屏上的4 行、8 行、16 行等n 行發光二極管共用一組列驅動寄存器, 通過行驅動管的分時工作, 使得每行L ED 的點亮時間占總時間的1ön , 只要每行的刷新速率大于50 Hz, 利用人眼的視覺暫留效應, 人們就可以看到一幅完整的文字或畫面[ 2 ]。常規型驅動電路的設計一般是用串入并出的通用集成電路芯片如74HC595 或MC14094 等作為列數據鎖存, 以8050 等小功率N PN 三極管為列驅動, 而以達林頓三極管如T IP127 等作為行掃描管, 其電路如圖1 所示。
上傳時間: 2014-02-19
上傳用戶:lingzhichao
存儲器技術.doc 計算機的主存儲器(Main Memory),又稱為內部存儲器,簡稱為內存。內存實質上是一組或多組具備數據輸入輸出和數據存儲功能的集成電路。內存的主要作用是用來存放計算機系統執行時所需要的數據,存放各種輸入、輸出數據和中間計算結果,以及與外部存儲器交換信息時作為緩沖用。由于CPU只能直接處理內存中的數據 ,所以內存是計算機系統中不可缺少的部件。內存的品質直接關系到計算機系統的速度、穩定性和兼容性。 4.1 存儲器類型計算機內部存儲器有兩種類型,一種稱為只讀存儲器ROM(Read Only Memiry),另一種稱為隨機存儲器RAM(Random Access Memiry)。 4.1.1 只讀存儲器只讀存儲器ROM主要用于存放計算機固化的控制程序,如主板的BIOS程序、顯卡BIOS控制程序、硬盤控制程序等。ROM的典型特點是:一旦將數據寫入ROM中后,即使在斷電的情況下也能夠永久的保存數據。從使用上講,一般用戶能從ROM中讀取數據,而不能改寫其中的數據。但現在為了做一日和尚撞一天鐘于軟件或硬件程序升級,普通用戶使用所謂的閃存(Flash Memiry)也可以有條件地改變ROM中的數據。有關只讀存儲器ROM的內容將在第11章中介紹,本章主要介紹隨機存儲器。4.1.2 隨機存取存儲器隨機存取存儲器RAM的最大特點是計算機可以隨時改變RAM中的數據,并且一旦斷電,TAM中數據就會立即丟失,也就是說,RAM中的數據在斷電后是不能保留的。從用于制造隨機存取存儲器的材料上看,RAM又可分為靜態隨機存儲器SRAM(Static RAM)和動態隨機存儲器DRAM(Dymamic RAM)兩種。1. 動態隨機存儲器在DRAM中數據是以電荷的形式存儲在電容上的,充電后電容上的電壓被認為是邏輯上的“1”,而放電后的電容上的電壓被認為是邏輯上的“0”認。為了減少存儲器的引腳數,就反存儲器芯片的每個基本單元按行、列矩陣形式連接起來,使每個存儲單元位于行、列的交叉點。這樣每個存儲單元的地址做一日和尚撞一天鐘可以用位數較少的行地址和列地址兩個部分表示,在對每個單元進行讀寫操作時,就可以采用分行、列尋址方式寫入或讀出相應的數據,如圖4-1所示。 由于電容充電后,電容會緩慢放電,電容 上的電荷會逐漸
標簽: 存儲器
上傳時間: 2014-01-10
上傳用戶:18752787361
TimeQuest就一定要搞定完整版,學習TimeQuest很好的資料
標簽: TimeQuest
上傳時間: 2013-11-07
上傳用戶:laozhanshi111