導航:首頁 > 鋼材市場 > MSR31什麼鋼材

MSR31什麼鋼材

發布時間:2023-01-16 02:42:02

1. msr分區移動到硬碟後部

MSR分區(Microsoft Reserved Partition,縮寫MSR)即Microsoft 保留 (MSR) 分區。是每個 在GUID 分區表 (GPT) 上的 Windows操作系統(Windows 7以上)都要求的分區。系統組件可以將 MSR 分區的部分分配到新的分區以供它們使用。
例如,將基本 GPT 磁碟轉換為動態磁碟後,系統分配的 MSR 分區將被用作「邏輯磁碟管理器」(LDM) 元數據分區。
中文名
MSR分區
外文名
Microsoft Reserved Partition
縮寫
MSR
定義
Microsoft 保留 (MSR) 分區
平台
Windows
區分舉例
MSR 分區的大小會因 GPT 磁碟的大小不同而發生變化。對於小於 16 GB 的磁碟,MSR 分區為 32 MB。對於大於 16 GB 的磁碟,MSR 分區為 128 MB。MSR 分區在「磁碟管理」中不可見,在Diskpart、Diskgenius等磁碟工具里可見,但是用戶無法在 MSR 分區上存儲或刪除數據。
用WIN8系統安裝版分區時,系統自動劃分出「分區1、2、3」,它們是Win8的特有分區。其中300MB為恢復區,100MB為系統分區,128MB為MSR分區。[1]
對於在GPT磁碟上的Windows操作系統,MSR分區不是必須的,可以刪除不受影響。
MSR分區的創建,可以使用此命令:
create partition msr [size=<n>] [offset=<n>] [noerr],單位為MB,
實例,如果要創建一個128MB的MSR分區:
create partition msr size=128
分享你的世界
我要分享見解,
點擊發布
糾錯
參考資料
[1] Win8實測.ZOL.COM.CN [引用日期2012-10-31]
秦皇島軍隊文職報名通道開啟,名額有限,速來報名!

文職廣告
秦皇島負債逾期 無力償還 信用卡逾期高額利息怎麼辦?|

全國債務逾期咨詢中心廣告
縱橫卓創組裝電腦旗艦店 升級包 購買主機修改、加裝、升級配置專用連接 按需選配,請勿亂拍 2T機械升級成4T機械
¥200 元
縱橫卓創組裝電腦旗艦店 升級包 購買主機修改、加裝、升級配置專用連接 按需選配,請勿亂拍 1T機械升級成4T機械
¥300 元
縱橫卓創組裝電腦旗艦店 升級包 購買主機修改、加裝、升級配置專用連接 按需選配,請勿亂拍 1T機械升級成2T機械
¥100 元
京東廣告
大家還在搜
移動硬碟分區
msr
esp和msr分區
分區
廣告
實力唱將,魅力舞姬,超多主播在YY直播等你
相關推薦
MSR分區_相關術語
系統保留分區用於存放系統引導文件
查看詞條
4K對齊高級格式化的分區技術
查看詞條
移動硬碟分區將一個硬碟分成邏輯區
查看詞條
系統盤無需用戶干預的程序
查看詞條
盤符磁碟存儲設備的標識符
查看詞條
硬碟對拷盤對盤的數據克隆
查看詞條
低級格式化格式化之前的一件工作
查看詞條
BIOS中英文對照表電腦開機設置中英對照
查看詞條
磁碟清理空間上提高讀取性能
查看詞條
詞條貢獻者
該詞條共有30人參與編輯,查看全部
詞條有幫助,感謝貢獻者
意見反饋權威合作網路協議
網路是免費編輯平台,無收費代編服務 | 詳情

Bai 京ICP證030173號
編輯
傳視頻
TA說

2. H3C MSR20-40 命令行里如何配置固定外網IP上網 DHCP需要開起來 具體命令是怎樣的

首先要確定你的接入方式,用的是什麼協議,是pppoe協議的還是專線連接的。。
如果是pppoe協議的就得有相應的封裝模塊,如果是專線,直接把網線接到rj-45網口上就行;
然後登陸路由器命令行,進入相應的wan埠配置地址,通過在外網口配置nat基本就OK了。
以下配置假設Ethernet0/0為區域網介面,Ethernet0/1為外網口。
1、配置內網介面(Ethernet0/0):
[MSR20-20] interface Ethernet0/0
[MSR20-20- Ethernet0/0]ip add 192.168.1.1 24
2、使用動態分配地址的方式為區域網中的PC分配地址
[MSR20-20]dhcp server ip-pool 1
[MSR20-20-dhcp-pool-1]network 192.168.1.0 24
[MSR20-20-dhcp-pool-1]dns-list 202.96.134.133
[MSR20-20-dhcp-pool-1] gateway-list 192.168.1.1
3、配置nat
[MSR20-20]nat address-group 1 公網IP 公網IP
[MSR20-20]acl number 3000
[MSR20-20-acl-adv-3000]rule 0 permit ip
4、配置外網介面(Ethernet0/1)
[MSR20-20] interface Ethernet0/1
[MSR20-20- Ethernet0/1]ip add 公網IP
[MSR20-20- Ethernet0/1] nat outbound 3000 address-group 1
加默預設路由
[MSR20-20]route-stac 0.0.0.0 0.0.0.0 外網網關

總結:
在2040路由器下面,
配置外網口,
配置內網口,
配置acl 作nat,
一條默認路由指向電信網關. ok!

3. 家用車買寶來好還是朗逸好具體些。。

朗逸好很多部位的保護上達到滿分。我們可以從官方的說明上得到數據:朗逸的正面100%重疊剛性壁障碰撞試驗得分達到了13.67分,其中頭部、頸部和大腿方面的保護都得到了滿分;在40%正面偏置碰撞試驗中,朗逸得到了16分的滿分成績,而在側面碰撞試驗,朗逸的腹部和骨盆碰撞結果都得到了4分的滿分成績,此項測試的得分也達到了15.74分,僅差0.26分就可以獲得滿分,這一成績是C-NCAP有史以來A類乘用車中的最好成績。 1在主動安全系統方面,朗逸採用了Teves公司最新一代的MK70 MABS系統,更好地結合了ABS、EBD、MSR發動機阻力矩控制和MASR發動機介入的牽引力控制,大大降低車輛失控的可能性。剎車片採用了NAO陶瓷材質,配有米其林輪胎,非常適合車速較低的中國道路,而且還能顯著降低制動噪音,在低溫狀況下,也延長了制動盤的壽命,降低了保養成本。 2此外,當輪胎壓力低於標准超過25-30%時,輪胎氣壓監控系統TPR就通過儀錶板中的警告燈提醒駕駛員,避免行車威脅。朗逸還有一個同級車中獨有的裝備,當ABS判斷出駕駛員採取了緊急制動時,緊急制動報警裝置會打開車尾雙跳燈,以提醒後方車輛及時作出反應,防止追尾。 在工藝應用上保持了為了製造高質量的LAVIDA朗逸,上海大眾建造了全新的符合大眾集團最新康采恩標準的LAVIDA朗逸車身生產線,增加了61台工業機器人,包含2台激光焊接機器人,並首次引入了奧迪柔性製造中心技術,大量使用了更節能環保的一體式中頻點焊設備,以及國際上最先進的機器人滾折邊技術和中頻凝膠技術。大眾備受贊譽的激光焊接工藝此次也應用在了LAVIDA朗逸上,其激光焊縫總長度近10m。 3另外,為了打造LAVIDA朗逸的完美車身,此次上海大眾還採用國際先進的模具設計和製造技術,全新開發了LAVIDA朗逸沖壓模具,以確保零件尺寸的精確和表面質量的優良。與此同時,在LAVIDA朗逸的生產過程中,還大量應用了整體沖壓成形技術,採用盡量大尺寸的合理的車身總成分塊,從而加強了車身的整體性,不僅使車身剛度得到加強,在碰撞時具有更高的安全性,也提高了車身裝配尺寸精度,使產品更加精細美觀。高分秘密在於精良的製造工藝 首先是沖壓工藝,作為生產製造的第一步,沖壓工藝在很大程度上決定了產品品質的高低。據悉,此次上海大眾採用國際先進的模具設計和製造技術,全新開發了朗逸沖壓模具,並且生產過程中,還大量應用了整體沖壓成形技術,採用盡量大尺寸的合理的車身總成分塊,從而加強了車身的整體性。這種設計不僅使車身剛度得到加強,在碰撞時具有更高的安全性,還提高了車身裝配尺寸精度,使產品更加精細美觀。另外,在與車身安全性密切相關的門板防撞板、中柱內板等安全件上,上海大眾還應用了熱成形工藝。熱成形工藝本來是用於航空航天領域的一種技術,主要用於加工在常溫下不容易成形的超高強度材料,目前國內僅有極少數汽車廠家使用這種高端技術。 沖壓工藝主要是為了塑造身板,接下來就是車身製造,了確保朗逸的車身質量,此次上海大眾依照大眾集團最新康采恩標准,對朗逸車身生產線進行了全面提升,增加了61台工業機器人,包含2台激光焊接機器人,並首次引入了奧迪柔性製造中心技術,大量使用了更節能環保的一體式中頻點焊設備,以及國際上最先進的機器人滾折邊技術和中頻凝膠技術。 據介紹,大眾備受贊譽的激光焊接工藝此次在朗逸上也有廣泛應用,其激光焊縫總長度近10米,這在同級別車里是不多見的,甚至可以和一般的中高級轎車相媲美。 轎車製造過程中最難安排、最難控制的就是總裝工藝,轎車的密封性和駕駛過程中的噪音大小都取決於總裝工藝。為了將朗逸打造成名副其實的精品轎車,此次上海大眾也採用高標准嚴格把好總裝這一關。在朗逸的裝配過程中,上海大眾使用了大量高精度電動擰緊工具,並實現重要螺栓擰緊數據上網,以確保裝配精度和 100%合格率。這種嚴密的數據記錄方式一般只用於發動機裝配,在總裝生產線上廣泛使用這項技術使上海大眾在國內同行業處於絕對領先水平。朗逸還採用了駕駛艙模塊化裝配,大大提高了整車的剛度和密封性、安全性,減少了行車過程中的噪音,並能經受住同行業中時間最長的雨淋測試的考驗。 眾所周知,日系車在汽車碰撞測試中屢創佳績,常常獲得五星的美譽,但這畢竟是碰撞試驗,現實中我們目睹更多的情況卻是日系車在觸目驚心的交通事故中被撞得面目全非,甚至出現一分為二的慘像,日系車津津樂道的吸能這時也通常啞然失語,開始羨慕車身強度驚人的德系車。還是那句話,主被動安全配置要重視,精益求精的製造工藝更要提倡,不過說到底,自己養成良好的駕駛習慣是關鍵。 人性化 LAVIDA朗逸的空間和動力雖然值得稱道,不過充滿中國元素的內飾更能體現上海大眾的造車理念,那就是為普通消費者製造高品質的大眾車。與外形設計一樣,LAVIDA朗逸的內飾設計也是全新的。運用大眾的設計理念,結合中國消費者的審美觀念,上海大眾的本土設計團隊設計出了更加貼近中國市場的內飾。 LAVIDA朗逸的內飾保持了大眾車系整潔、嚴謹的設計理念,同時融入中國消費者追求高級的思想,在形體設計上採用了以曲線和圓形為主的元素,這與大眾車系方正而傳統的設計,有很大的不同,沒有了老式的呆板增加了幾分時尚高雅,給人眼前一亮的感覺。 朗逸的不少小細節做得很細致,讓我有"驚喜"的感覺。」一位在上海大眾4S店中做保養的朗逸車主這樣評價自己的愛車。長、寬、高分別為4608mm、1743mm和1465mm的LAVIDA,其軸距達到了2610mm。寬敞的空間讓駕駛者和乘坐者倍感舒適。而朗逸外觀車燈上的設計科技感和時尚感非常強,在實用性上也超越了不少車型,這更讓不少購車者「一見鍾情」。 內飾上,朗逸擺脫了德式風格的古板和嚴肅,添加了不少充滿情趣的中式風格。在配置方面,2.0L的後視鏡、三輻式多功能方向盤等標配讓人感到滿意;USB介面和MP3功能、真皮打孔座椅等諸多配置也都顯出不同一般的細致;定速巡航、倒車雷達則主要為安全駕駛考慮,非常實用和必要。轉向燈後延 延伸轉向燈的長度,能夠更為有效的提醒後面的行人及車輛。這個細節可能會被很多消費者所忽視,不過它的作用卻不可小覷,尤其是在晚上轉彎時會非常實用,過往車輛有更多機會看到轉向燈,在安全性方面就多了一份保險。倒車雷達 當距離障礙物1.2m時會發出「嘀嘀」聲,當車輛與障礙物距離縮小至0.3m時將轉變成連續音。如果倒車時車速大於15Km/h,那將出現雷達無法識別障礙物的情況。倒車雷達對於剛從駕校畢業的菜鳥車主來說可謂得力助手,當車子在小區里的停車位上穩當挺好後,想必會有小小的成就感吧。自動感應雨刷 雨刷調節按鈕一般在方向盤上,駕駛員可以根據雨量的大小自己調節,遇到雨雪等惡劣天氣時的確有些麻煩;而雨刷自動感應,通過車內後視鏡下面的一個感應器,來控制雨刷的速度。雨越大,雨刷速度就越大,非常方便。 後備箱鎖的設計 後備箱沒有鎖眼,所以通過撬壞鎖芯的方法偷盜物品在朗逸上行不通。開啟後備箱只能通過遙控鑰匙或者駕駛員門上的開啟按鈕。值得一提的是,朗逸在後備箱內還設置了一個逃生拉線,如果你被困在後備箱內,可以通過拉動這個拉線從內部打開後備箱逃生。盡管這個功能正常情況下不大用到,不過有備無患啦。 發動機下護板 行車時防止石礪飛入機艙室,一般來說,家用車輛的底盤都不會很高,這樣的結果是為了降低汽車的重心從而獲得更好的穩定性,不過弊端就是遇到坎坷的道路會損壞底盤,而發動機護板就能起到很好的保護作用。另外平滑的地盤讓氣流通過更加順暢,減少阻力的同時還能在一定程度上保證行車時車身更加穩定。 音響系統 朗逸配置的虛擬6碟CD/MP3播放機,可以通過抓軌技術將CD-AUDIO格式碟片的音樂存入車輛內置的FLASH存儲介質中,可存儲播放音樂大 7.5小時。當您聽完1/4盤CD,整張CD的內容就已經存儲完畢。支持SD、USB、AUX介面,確保了各種媒體文件的方便導入,以上介質中所能被識別的播放文件格式包括ISO-MPEG、AUDIO、LAYER-3(MP3)和WINDOWS MEDIA AUDIO(WMA)等,對於喜歡音樂、追求時尚的潮人很有吸引力喲。 此外,除了不錯的音響系統,朗逸還配備了義大利Pasubio高透氣真皮座椅,而車內甲醛含量控制在1mg/100g,比國家室內空氣質量標准嚴格9倍。 環保 Tiptronic 6擋手自動一體變速箱不僅使得朗逸的動力輸出表現出色,而且也起到了節油環保的作用。這款6速Tiptronic手/自動一體變速箱的動態換擋程序可提供D檔(標准型-經濟省油)和S檔(運動型-動力澎湃)兩種不同換檔模式。它可以根據駕駛者提出的駕駛要求自行分析行駛情況,自動尋找與行駛條件相匹配的換檔時機。當然,如果想追求更此次駕乘感受的用戶也可以將自動擋轉換為手動擋。 在Tiptronic 6速變速箱的設定中,不用超過60 km/h車主就能享受到第6檔齒輪的省油體驗,而傳統4速自動變速箱可能還只工作在第3檔。發動機轉速的差異決定了兩者油耗成績的高低。據調查,朗逸車主對朗逸的油耗情況基本滿意,有一位接受采訪的車主說當他駕駛2.0L自動版車型在「全程滿載並開啟空調的國道路段」行駛時,平均油耗約為 8L/100km左右。 除此之外,當駕駛者使用「最佳化模式」時,這款變速箱可以更合理的利用發動機在不同轉速下的動力輸出,即充分發揮出其動力潛能。而在換檔模式自動學習功能的幫助下,換檔時上下檔位間沖擊小,使得駕駛更平穩舒適。 檢舉 回答人的補充 2009-10-31 19:07 13萬的裸車還是蠻多的,一般家用推薦朗逸,雖說平台比較落後,當時畢竟掛著大眾的牌子,做工,安全方面還是可以的!如果喜歡運動風格的,推薦兩廂福克斯,自己家就是09款兩廂福克斯1.8AT。福克斯雖說是兩廂車,當時空間還是不錯的,特別寬度,比琪達,思域都要寬,甚至可以跟B級車有的一拼,09款的福克斯無論在外型內飾方面都有了不小的提高,對於這點還是比較滿意的。還有底盤是採用跟沃爾沃S40同一平台的技術生產出來的,是這個價位性價比最高的底盤了!操控跟懸掛都是福克斯的主打絕對不會另車主失望。雖說日系車省油,但是付出的代價往往比較大,很多日系車連防撞梁都沒有,底盤的鋼條更是細得可怕!安全方面福克斯做得還是不錯的! 檢舉 回答人的補充 2009-10-31 19:13 主要建議以下幾款

標致307,寶來,福克斯,世嘉, 速騰(以上包括兩、三廂的)

以上幾款是A級車真正的王牌車型

都是歐美車型,安全、操控很好。

底盤調校,懸掛,剎車很好、

使用的鋼材很好,品質保證啊。

特別是鋼材,比如日本車就是一超薄鐵皮車

還有剎車,懸掛啊差別很明顯

油耗在這個級別不是最大的問題,當然以上幾個福克斯要相對油耗高點

其他的都很合適,相比一般的日本車也就高1個樣子。

買車啊,還是歐洲的好

主要是安全,而且歐洲車造車的工藝、技術和理念,是其他的完全比不了的 寶來簡潔,不過簡潔的似乎有點單調了,這個還是得看個人審美傾向吧,其實新款也沒有以前好看!外觀是不一樣,就是鈑金,車漆和老寶來都差很多,更別提裡面的內飾,真皮座椅的品質,簡直不是一個檔次的。老寶來是最好的(已停產),現在的新寶來我不建議買!如果您喜歡寶來,趁寶來經典還沒停產,趕緊買寶來經典吧,還能找到原來寶來的影子【透露著微微的舊時代好萊塢電影的感覺(個人體會)】。現在家用車刮運動風啊,運動轎跑大受歡迎啊,一則是外觀動感、帥氣、時尚,二則是動力充沛、配置豐富,推薦款性價比高的國產自主車:比亞迪L3吧,頂著年度最受歡迎新車的光環,很是閃耀。

4. 安裝Windows 8 分區時 系統分區 恢復 MSR(保留)

  1. MSR分區(Microsoft Reserved Partition,縮寫MSR)即Microsoft 保留 (MSR) 分區。

  2. MSR分區(Microsoft Reserved Partition,縮寫MSR)即Microsoft 保留 (MSR) 分區。是每個 在GUID分區表(GPT) 上的 Windows操作系統(windows7以上)都要求的分區。

  3. 系統組件可以將 MSR 分區的部分分配到新的分區以供它們使用。例如,將基本 GPT 磁碟轉換為動態磁碟後,系統分配的 MSR 分區將被用作「邏輯磁碟管理器」(LDM) 元數據分區。


5. 汽車OBD中的MI是指什麼

OBD作為一個專有名詞的縮寫,其全稱為On Board Diagnostics,中文的意思是:車載自動診斷系統。這套系統能在汽車運行過程中實時監測發動機電控系統及車輛的其它功能模塊的工作狀況,如有發現工況異常,則根據特定的演算法判斷出具體的故障,並以診斷故障代碼(DTC,Diagnostic Trouble Codes)的形式存儲在系統內的存儲器上。系統自診斷後得到的有用信息可以為車輛的維修和保養提供幫助,維修人員可以利用汽車原廠專用儀器讀取故障碼,從而可以對故障進行快速定位,以便於對車輛的修理,減少人工診斷的時間。

6. 寶馬車的ASC是什麼意思

一個名詞而已。。 ABS:電子剎車防抱死控制,車速在35km/h以上,剎車時作用。 ASC:加速防滑剎車控制,車輛起步時及以後任何時刻進入戒備作用狀態。 MSR:發動機扭力控制,ASC動作時,控制發動機動力下降。 ECD:電子剎車力分配。 DBC:動態剎車控制。 DSC:電子剎車車身穩定系統。 新的寶馬車E38、E39、E46、E65/E66、E53車型上均安裝ASC或DSC系統。 ASC系統監測四輪車速及節氣門信號,用以控制發動機扭力輸出。 ASC+T控制系統在ABS系統功能上加裝MSR功能,用以監測行駛中車輪轉速不一致,對自動調節剎車力及發動機動力輸出。此功能又同時可以通過ASC開關解除。 DSC控制系統在ASC控制功能上增加對車輛水平橫向移動及甩尾旋轉運動時的自動監測功能。通過轉向角度感測器、橫向加速感測器、旋轉加速感測器監測,調節四輪剎車力自動分配動作降低發動機扭矩及變速箱減檔操作。達到車輛動態行駛中車身穩定功能。 EMF:電子停車駐動系統

7. CPU和CPUID是什麼關系

在 Linux 2.4 內核中,用戶態 Ring3 代碼請求內核態 Ring0 代碼完成某些功能是通過系統調用完成的,而系統調用的是通過軟中斷指令(int 0x80)實現的。在 x86 保護模式中,處理 INT 中斷指令時,CPU 首先從中斷描述表 IDT 取出對應的門描述符,判斷門描述符的種類,然後檢查門描述符的級別 DPL 和 INT 指令調用者的級別 CPL,當 CPL<=DPL 也就是說 INT 調用者級別高於描述符指定級別時,才能成功調用,最後再根據描述符的內容,進行壓棧、跳轉、許可權級別提升。內核代碼執行完畢之後,調用 IRET 指令返回,IRET 指令恢復用戶棧,並跳轉會低級別的代碼。

其實,在發生系統調用,由 Ring3 進入 Ring0 的這個過程浪費了不少的 CPU 周期,例如,系統調用必然需要由 Ring3 進入 Ring0(由內核調用 INT 指令的方式除外,這多半屬於 Hacker 的內核模塊所為),許可權提升之前和之後的級別是固定的,CPL 肯定是 3,而 INT 80 的 DPL 肯定也是 3,這樣 CPU 檢查門描述符的 DPL 和調用者的 CPL 就是完全沒必要。正是由於如此,Intel x86 CPU 從 PII 300(Family 6,Model 3,Stepping 3)之後,開始支持新的系統調用指令 sysenter/sysexit。sysenter 指令用於由 Ring3 進入 Ring0,SYSEXIT 指令用於由 Ring0 返回 Ring3。由於沒有特權級別檢查的處理,也沒有壓棧的操作,所以執行速度比 INT n/IRET 快了不少。

不同系統調用方式的性能比較:

下面是一些來自互聯網的有關 sysenter/sysexit 指令和 INT n/IRET 指令在 Intel Pentium CPU 上的性能對比:

表1:系統調用性能測試測試硬體:Intel® Pentium® III CPU, 450 MHzProcessor Family: 6 Model: 7 Stepping: 2

用戶模式花費的時間 核心模式花費的時間
基於 sysenter/sysexit 指令的系統調用 9.833 microseconds 6.833 microseconds
基於中斷 INT n 指令的系統調用 17.500 microseconds 7.000 microseconds

數據來源:[1]

數據來源:[2]

表2:各種 CPU 上 INT 0x80 和 SYSENTER 執行速度的比較

CPU Int0x80 sysenter
Athlon XP 1600+ 277 169
800MHz mode 1 athlon 279 170
2.8GHz p4 northwood ht 1152 442

上述數據為對 100000 次 getppid() 系統調用所花費的 CPU 時鍾周期取的平均值
數據來源[3]

自這種技術推出之後,人們一直在考慮在 Linux 中加入對這種指令的支持,在 Kernel.org 的郵件列表中,主題為 "Intel P6 vs P7 system call performance" 的大量郵件討論了採用這種指令的必要性,郵件中列舉的理由主要是 Intel 在 Pentium 4 的設計上存在問題,造成 Pentium 4 使用中斷方式執行的系統調用比 Pentium 3 以及 AMD Athlon 所耗費的 CPU 時鍾周期多上 5~10 倍。因此,在 Pentium 4 平台上,通過 sysenter/sysexit 指令來執行系統調用已經是刻不容緩的需求。

sysenter/sysexit 系統調用的機制:

在 Intel 的軟體開發者手冊第二、三卷(Vol.2B,Vol.3)中,4.8.7 節是關於 sysenter/sysexit 指令的詳細描述。手冊中說明,sysenter 指令可用於特權級 3 的用戶代碼調用特權級 0 的系統內核代碼,而 SYSEXIT 指令則用於特權級 0 的系統代碼返回用戶空間中。sysenter 指令可以在 3,2,1 這三個特權級別調用(Linux 中只用到了特權級 3),而 SYSEXIT 指令只能從特權級 0 調用。

執行 sysenter 指令的系統必須滿足兩個條件:1.目標 Ring 0 代碼段必須是平坦模式(Flat Mode)的 4GB 的可讀可執行的非一致代碼段。2.目標 RING0 堆棧段必須是平坦模式(Flat Mode)的 4GB 的可讀可寫向上擴展的棧段。

在 Intel 的手冊中,還提到了 sysenter/sysexit 和 int n/iret 指令的一個區別,那就是 sysenter/sysexit 指令並不成對,sysenter 指令並不會把 SYSEXIT 所需的返回地址壓棧,sysexit 返回的地址並不一定是 sysenter 指令的下一個指令地址。調用 sysenter/sysexit 指令地址的跳轉是通過設置一組特殊寄存器實現的。這些寄存器包括:

SYSENTER_CS_MSR - 用於指定要執行的 Ring 0 代碼的代碼段選擇符,由它還能得出目標 Ring 0 所用堆棧段的段選擇符;

SYSENTER_EIP_MSR - 用於指定要執行的 Ring 0 代碼的起始地址;

SYSENTER_ESP_MSR-用於指定要執行的Ring 0代碼所使用的棧指針

這些寄存器可以通過 wrmsr 指令來設置,執行 wrmsr 指令時,通過寄存器 edx、eax 指定設置的值,edx 指定值的高 32 位,eax 指定值的低 32 位,在設置上述寄存器時,edx 都是 0,通過寄存器 ecx 指定填充的 MSR 寄存器,sysenter_CS_MSR、sysenter_ESP_MSR、sysenter_EIP_MSR 寄存器分別對應 0x174、0x175、0x176,需要注意的是,wrmsr 指令只能在 Ring 0 執行。

這里還要介紹一個特性,就是 Ring0、Ring3 的代碼段描述符和堆棧段描述符在全局描述符表 GDT 中是順序排列的,這樣只需知道 SYSENTER_CS_MSR 中指定的 Ring0 的代碼段描述符,就可以推算出 Ring0 的堆棧段描述符以及 Ring3 的代碼段描述符和堆棧段描述符。

在 Ring3 的代碼調用了 sysenter 指令之後,CPU 會做出如下的操作:

1. 將 SYSENTER_CS_MSR 的值裝載到 cs 寄存器

2. 將 SYSENTER_EIP_MSR 的值裝載到 eip 寄存器

3. 將 SYSENTER_CS_MSR 的值加 8(Ring0 的堆棧段描述符)裝載到 ss 寄存器。

4. 將 SYSENTER_ESP_MSR 的值裝載到 esp 寄存器

5. 將特權級切換到 Ring0

6. 如果 EFLAGS 寄存器的 VM 標志被置位,則清除該標志

7. 開始執行指定的 Ring0 代碼

在 Ring0 代碼執行完畢,調用 SYSEXIT 指令退回 Ring3 時,CPU 會做出如下操作:

1. 將 SYSENTER_CS_MSR 的值加 16(Ring3 的代碼段描述符)裝載到 cs 寄存器

2. 將寄存器 edx 的值裝載到 eip 寄存器

3. 將 SYSENTER_CS_MSR 的值加 24(Ring3 的堆棧段描述符)裝載到 ss 寄存器

4. 將寄存器 ecx 的值裝載到 esp 寄存器

5. 將特權級切換到 Ring3

6. 繼續執行 Ring3 的代碼

由此可知,在調用 SYSENTER 進入 Ring0 之前,一定需要通過 wrmsr 指令設置好 Ring0 代碼的相關信息,在調用 SYSEXIT 之前,還要保證寄存器edx、ecx 的正確性。

如何得知 CPU 是否支持 sysenter/sysexit 指令

根據 Intel 的 CPU 手冊,我們可以通過 CPUID 指令來查看 CPU 是否支持 sysenter/sysexit 指令,做法是將 EAX 寄存器賦值 1,調用 CPUID 指令,寄存器 edx 中第 11 位(這一位名稱為 SEP)就表示是否支持。在調用 CPUID 指令之後,還需要查看 CPU 的 Family、Model、Stepping 屬性來確認,因為據稱 Pentium Pro 處理器會報告 SEP 但是卻不支持 sysenter/sysexit 指令。只有 Family 大於等於 6,Model 大於等於 3,Stepping 大於等於 3 的時候,才能確認 CPU 支持 sysenter/sysexit 指令。

Linux 對 sysenter/sysexit 系統調用方式的支持

在 2.4 內核中,直到最近的發布的 2.4.26-rc2 版本,沒有加入對 sysenter/sysexit 指令的支持。而對 sysenter/sysexit 指令的支持最早是2002 年,由 Linus Torvalds 編寫並首次加入 2.5 版內核中的,經過多方測試和多次 patch,最終正式加入到了 2.6 版本的內核中。

http://kerneltrap.org/node/view/531/1996

http://lwn.net/Articles/18414/

具體談到系統調用的完成,不能孤立的看內核的代碼,我們知道,系統調用多被封裝成庫函數提供給應用程序調用,應用程序調用庫函數後,由 glibc 庫負責進入內核調用系統調用函數。在 2.4 內核加上老版的 glibc 的情況下,庫函數所做的就是通過 int 指令來完成系統調用,而內核提供的系統調用介面很簡單,只要在 IDT 中提供 INT 0x80 的入口,庫就可以完成中斷調用。

在 2.6 內核中,內核代碼同時包含了對 int 0x80 中斷方式和 sysenter 指令方式調用的支持,因此內核會給用戶空間提供一段入口代碼,內核啟動時根據 CPU 類型,決定這段代碼採取哪種系統調用方式。對於 glibc 來說,無需考慮系統調用方式,直接調用這段入口代碼,即可完成系統調用。這樣做還可以盡量減少對 glibc 的改動,在 glibc 的源碼中,只需將 "int $0x80" 指令替換成 "call 入口地址" 即可。

下面,以 2.6.0 的內核代碼配合支持 SYSENTER 調用方式的 glibc2.3.3 為例,分析一下系統調用的具體實現。

內核在啟動時做的准備

前面說到的這段入口代碼,根據調用方式分為兩個文件,支持 sysenter 指令的代碼包含在文件 arch/i386/kernel/vsyscall-sysenter.S 中,支持int中斷的代碼包含在arch/i386/kernel/vsyscall-int80.S中,入口名都是 __kernel_vsyscall,這兩個文件編譯出的二進制代碼由arch/i386/kernel/vsyscall.S所包含,並導出起始地址和結束地址。

2.6 內核在啟動的時候,調用了新增的函數sysenter_setup(參見arch/i386/kernel/sysenter.c),在這個函數中,內核將虛擬內存空間的頂端一個固定地址頁面(從0xffffe000開始到0xffffeffff的4k大小)映射到一個空閑的物理內存頁面。然後通過之前執行CPUID的指令得到的數據,檢測CPU是否支持sysenter/sysexit指令。如果CPU不支持,那麼將採用INT調用方式的入口代碼拷貝到這個頁面中,然後返回。相反,如果CPU支持SYSETER/SYSEXIT指令,則將採用SYSENTER調用方式的入口代碼拷貝到這個頁面中。使用宏 on_each_cpu在每個CPU上執行enable_sep_cpu這個函數。

在enable_sep_cpu函數中,內核將當前CPU的TSS結構中的ss1設置為當前內核使用的代碼段,esp1設置為該TSS結構中保留的一個256位元組大小的堆棧。在X86中,TSS結構中ss1和esp1本來是用於保存Ring 1進程的堆棧段和堆棧指針的。由於內核在啟動時,並不能預知調用sysenter指令進入Ring 0後esp的確切值,而應用程序又無權調用wrmsr指令動態設置,所以此時就借用esp1指向一個固定的緩沖區來填充這個MSR寄存器,由於Ring 1根本沒被啟用,所以並不會對系統造成任何影響。在下面的文章中會介紹進入Ring 0之後,內核如何修復ESP來指向正確的Ring 0堆棧。關於TSS結構更細節的應用可參考代碼include/asm-i386/processor.h)。

然後,內核通過wrmsr(msr,val1,val2)宏調用wrmsr指令對當前CPU設置MSR寄存器,可以看出調用宏的第三個參數即edx都被設置為0。其中SYSENTER_CS_MSR的值被設置為當前內核用的所在代碼段;SYSENTER_ESP_MSR被設置為esp1,即指向當前CPU的 TSS結構中的堆棧;SYSENTER_EIP_MSR則被設置為內核中處理sysenter指令的介面函數sysenter_entry(參見 arch/i386/kernel/entry.S)。這樣,sysenter指令的准備工作就完成了。

通過內核在啟動時進行這樣的設置,在每個進程的進程空間中,都能訪問到內核所映射的這個代碼頁面,當然這個頁面對於應用程序來說是只讀的。我們通過新版的ldd工具查看任意一個可執行程序,可以看到下面的結果:

[root@test]# file dynamic
dynamic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
[root@test]# ldd dynamic
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/tls/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

這個所謂的"linux-gate.so.1"的內容就是內核映射的代碼,系統中其實並不存在這樣一個鏈接庫文件,它的名字是由ldd自己起的,而在老版本的ldd中,雖然能夠檢測到這段代碼,但是由於沒有命名而且在系統中找不到對應鏈接庫文件,所以會有一些顯示上的問題。有關這個問題的背景,可以參考下面這個網址: http://sources.redhat.com/ml/libc-alpha/2003-09/msg00263.html。

由用戶態經庫函數進入內核態

為了配合內核使用新的系統調用方式,glibc中要做一定的修改。新的glibc-2.3.2(及其以後版本中)中已經包含了這個改動,在glibc源代碼的sysdeps/unix/sysv/linux/i386/sysdep.h文件中,處理系統調用的宏INTERNAL_SYSCALL在不同的編譯選項下有不同的結果。在打開支持sysenter/sysexit指令的選項I386_USE_SYSENTER下,系統調用會有兩種方式,在靜態鏈接(編譯時加上-static選項)情況下,採用"call *_dl_sysinfo"指令;在動態鏈接情況下,採用"call *%gs:0x10"指令。這兩種情況由glibc庫採用哪種方法鏈接,實際上最終都相當於調用某個固定地址的代碼。下面我們通過一個小小的程序,配合 gdb來驗證。

首先是一個靜態編譯的程序,代碼很簡單:

main()
{
getuid();
}

將代碼加上static選項用gcc靜態編譯,然後用gdb裝載並反編譯main函數。

[root@test opt]# gcc test.c -o ./static -static
[root@test opt]# gdb ./static
(gdb) disassemble main
0x08048204 <main+0>: push %ebp
0x08048205 <main+1>: mov %esp,%ebp
0x08048207 <main+3>: sub $0x8,%esp
0x0804820a <main+6>: and $0xfffffff0,%esp
0x0804820d <main+9>: mov $0x0,%eax
0x08048212 <main+14>: sub %eax,%esp
0x08048214 <main+16>: call 0x804cb20 <__getuid>
0x08048219 <main+21>: leave
0x0804821a <main+22>: ret

可以看出,main函數中調用了__getuid函數,接著反編譯__getuid函數。

(gdb) disassemble 0x804cb20
0x0804cb20 <__getuid+0>: push %ebp
0x0804cb21 <__getuid+1>: mov 0x80aa028,%eax
0x0804cb26 <__getuid+6>: mov %esp,%ebp
0x0804cb28 <__getuid+8>: test %eax,%eax
0x0804cb2a <__getuid+10>: jle 0x804cb40 <__getuid+32>
0x0804cb2c <__getuid+12>: mov $0x18,%eax
0x0804cb31 <__getuid+17>: call *0x80aa054
0x0804cb37 <__getuid+23>: pop %ebp
0x0804cb38 <__getuid+24>: ret

上面只是__getuid函數的一部分。可以看到__getuid將eax寄存器賦值為getuid系統調用的功能號0x18然後調用了另一個函數,這個函數的入口在哪裡呢?接著查看位於地址0x80aa054的值。

(gdb) X 0x80aa054
0x80aa054 <_dl_sysinfo>: 0x0804d7f6

看起來不像是指向內核映射頁面內的代碼,但是,可以確認,__dl_sysinfo指針的指向的地址就是0x80aa054。下面,我們試著啟動這個程序,然後停在程序第一條語句,再查看這個地方的值。

(gdb) b main
Breakpoint 1 at 0x804820a
(gdb) r
Starting program: /opt/static
Breakpoint 1, 0x0804820a in main ()
(gdb) X 0x80aa054
0x80aa054 <_dl_sysinfo>: 0xffffe400

可以看到,_dl_sysinfo指針指向的數值已經發生了變化,指向了0xffffe400,如果我們繼續運行程序,__getuid函數將會調用地址0xffffe400處的代碼。

接下來,我們將上面的代碼編譯成動態鏈接的方式,即默認方式,用gdb裝載並反編譯main函數

[root@test opt]# gcc test.c -o ./dynamic
[root@test opt]# gdb ./dynamic
(gdb) disassemble main
0x08048204 <main+0>: push %ebp
0x08048205 <main+1>: mov %esp,%ebp
0x08048207 <main+3>: sub $0x8,%esp
0x0804820a <main+6>: and $0xfffffff0,%esp
0x0804820d <main+9>: mov $0x0,%eax
0x08048212 <main+14>: sub %eax,%esp
0x08048214 <main+16>: call 0x8048288
0x08048219 <main+21>: leave
0x0804821a <main+22>: ret

由於libc庫是在程序初始化時才被裝載,所以我們先啟動程序,並停在main第一條語句,然後反匯編getuid庫函數



(gdb) b main
Breakpoint 1 at 0x804820a
(gdb) r
Starting program: /opt/dynamic
Breakpoint 1, 0x0804820a in main ()
(gdb) disassemble getuid
Dump of assembler code for function getuid:
0x40219e50 <__getuid+0>: push %ebp
0x40219e51 <__getuid+1>: mov %esp,%ebp
0x40219e53 <__getuid+3>: push %ebx
0x40219e54 <__getuid+4>: call 0x40219e59 <__getuid+9>
0x40219e59 <__getuid+9>: pop %ebx
0x40219e5a <__getuid+10>: add $0x84b0f,%ebx
0x40219e60 <__getuid+16>: mov 0xffffd87c(%ebx),%eax
0x40219e66 <__getuid+22>: test %eax,%eax
0x40219e68 <__getuid+24>: jle 0x40219e80 <__getuid+48>
0x40219e6a <__getuid+26>: mov $0x18,%eax
0x40219e6f <__getuid+31>: call *%gs:0x10
0x40219e76 <__getuid+38>: pop %ebx
0x40219e77 <__getuid+39>: pop %ebp
0x40219e78 <__getuid+40>: ret

可以看出,庫函數getuid將eax寄存器設置為getuid系統調用的調用號0x18,然後調用%gs:0x10所指向的函數。在gdb中,無法查看非DS段的數據內容,所以無法查看%gs:0x10所保存的實際數值,不過我們可以通過編程的辦法,內嵌匯編將%gs:0x10的值賦予某個局部變數來得到這個數值,而這個數值也是0xffffe400,具體代碼這里就不再贅述。

由此可見,無論是靜態還是動態方式,最終我們都來到了0xffffe400這里的一段代碼,這里就是內核為我們映射的系統調用入口代碼。在gdb中,我們可以直接反匯編來查看這里的代碼

(gdb) disassemble 0xffffe400 0xffffe414
Dump of assembler code from 0xffffe400 to 0xffffe414:0xffffe400: push %ecx
0xffffe401: push %edx
0xffffe402: push %ebp
0xffffe403: mov %esp,%ebp
0xffffe405: sysenter
0xffffe407: nop
0xffffe408: nop
0xffffe409: nop
0xffffe40a: nop
0xffffe40b: nop
0xffffe40c: nop
0xffffe40d: nop
0xffffe40e: jmp 0xffffe403
0xffffe410: pop %ebp
0xffffe411: pop %edx
0xffffe412: pop %ecx
0xffffe413: ret
End of assembler mp.

這段代碼正是arch/i386/kernel/vsyscall- sysenter.S文件中的代碼。其中,在sysenter之前的是入口代碼,在0xffffe410開始的是內核返回處理代碼(後面提到的 SYSENTER_RETURN即指向這里)。在入口代碼中,首先是保存當前的ecx,edx(由於sysexit指令需要使用這兩個寄存器)以及 ebp。然後調用sysenter指令,跳轉到內核Ring 0代碼,也就是sysenter_entry入口處。

內核中的處理和返回

sysenter_entry整個的實現可以參見arch/i386/kernel/entry.S。內核處理SYSENTER的代碼和處理INT的代碼不太一樣。通過sysenter指令進入Ring 0之後,由於當前的ESP並非指向正確的內核棧,而是當前CPU的TSS結構中的一個緩沖區(參見上文),所以首先要解決的是修復ESP,幸運的是,TSS結構中ESP0成員本身就保存有Ring 0狀態的ESP值,所以在這里將TSS結構中ESP0的值賦予ESP寄存器。將ESP恢復成指向正確的堆棧之後,由於SYSENTER不是通過調用門進入Ring 0,所以在堆棧中的上下文和使用INT指令的不一樣,INT指令進入Ring 0後棧中會保存如下的值。

低地址

返回用戶態的EIP
用戶態的CS
用戶態的EFLAGS
用戶態的ESP
用戶態的SS(和DS相同)
高地址
因此,為了簡化和重用代碼,內核會用pushl指令往棧中放入上述各值,值得注意的是,內核在棧中放入的相對應用戶態EIP的值,是一個代碼標簽 SYSENTER_RETURN,在vsyscall-sysenter.S可以看到,它就在sysenter指令的後面(在它們之間,有一段NOP,是內核返回出錯時的處理代碼)。接下來,處理系統調用的代碼就和中斷方式的處理代碼一模一樣了,內核保存所有的寄存器,然後系統調用表找到對應系統調用的入口,完成調用。最後,內核從棧中取出前面存入的用戶態的EIP和ESP,存入edx和ecx寄存器,調用SYSEXIT指令返回用戶態。返回用戶態之後,從棧中取出ESP,edx,ecx,最終返回glibc庫。

其它操作系統以及其它硬體平台的支持

值得一提的是,從 Windows XP 開始,Windows 的系統調用方式也從軟中斷 int 0x2e 轉換到採用 sysenter 方式,由於完全不再支持 int 方式,因此 Windows XP 的對 CPU 的最低配置要求是 PentiumII 300MHz。在其它的操作系統例如 *BSD 系列,目前並沒有提供對 sysenter 指令的支持。

在 CPU 方面,AMD 的 CPU 支持一套與之對應的指令 SYSCALL/SYSRET。在純 32 位的 AMD CPU 上,還沒有支持 sysenter 指令,而在 AMD 推出的 AMD64 系列 CPU 上,處於某些模式的情況下,CPU 能夠支持 sysenter/sysexit 指令。在 Linux 內核針對 AMD64 架構的代碼中,採用的還是 SYSCALL/SYSRET 指令。至於這兩種指令最終誰將成為標准,目前還無法得出結論。

未來

我們將 Intel 的 sysenter/sysexit 指令,AMD 的 SYSCALL/SYSRET 指令統稱為"快速系統調用指令"。"快速系統調用指令"比起中斷指令來說,其消耗時間必然會少一些,但是隨著 CPU 設計的發展,將來應該不會再出現類似 Intel Pentium4 這樣懸殊的差距。而"快速系統調用指令"比起中斷方式的系統調用方式,還存在一定局限,例如無法在一個系統調用處理過程中再通過"快速系統調用指令"調用別的系統調用。因此,並不一定每個系統調用都需要通過"快速系統調用指令"來實現。比如,對於復雜的系統調用例如 fork,兩種系統調用方式的時間差和系統調用本身運行消耗的時間來比,可以忽略不計,此處採取"快速系統調用指令"方式沒有什麼必要。而真正應該使用" 快速系統調用指令"方式的,是那些本身運行時間很短,對時間精確性要求高的系統調用,例如 getuid、gettimeofday 等等。因此,採取靈活的手段,針對不同的系統調用採取不同的方式,才能得到最優化的性能和實現最完美的功能。

參考資料

[1] VxWorks Optimized for Intel Architecture, Hdei Nunoe, Wind River, Member of Technical Staff Leo Samson, Wind River, Technical Marketing Engineer David Hillyard, Intel Corporation, Mgr., Platform Architect

[2] Kernel Entry / Kernel Exit , Marcus Voelp & University Karlsruhe

[3] Dave Jones' blog, http://diary.codemonkey.org.uk/index.php?month=12&year=2002

[4] Linux 內核源碼 v2.6.0 http://www.kernel.org/ [Linus Torvalds,2004]

[5] GNU C Library glibc 2.3.3 源碼 http://www.gnu.org/software/libc/libc.html

Linux Kernel Mailing List 中對系統調用方式的討論: [5] Linux Kernel Mailing List, "Intel P6 vs P7 system call performance" http://www.ussg.iu.e/hypermail/linux/kernel/0212.1/index.html#1286 http://www.ussg.iu.e/hypermail/linux/kernel/0212.3/index.html#54

Linux 內核首次引入對 sysenter/sysexit 指令的支持: [6] Linux Kernel Mailing List, "Add "sysenter" support on x86, and a "vsyscall" page." http://lwn.net/Articles/18414/

8. linux arm嵌入式開發中的 MSR指令什麼意思

在ARM處理器中,只有MSR指令可以對狀態寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。
由於xPSR寄存器代表了CPU的狀態,其每個位有特殊意義,在執行對xPSR狀態寄存器寫入時(讀取時不存在該用法),為了防止誤操作和方便記憶,將xPSR里32位分成四個區域,每個區域用小寫字母表示:

c 控制域屏蔽 psr[7..0]

x 擴展域屏蔽 psr[15..8]

s 狀態域屏蔽 psr[23..16]

f 標志域屏蔽 psr[31..24]

注意:區域名必須為小寫字母

向對應區域進行執行寫入時,使用xPSR_x可以指定寫入區域,而不影響狀態寄存器其它位,如:

使能IRQ中斷:

ENABLE_IRQ

MRS R0, CPSR ; 將CPSR寄存器內容讀出到R0

BIC R0, R0,#0x80 ; 清掉CPSR中的I控制位

MSR CPSR_c,R0 ; 將修改後的值寫回 CPSR寄存器的對應控制域

MOV PC,LR ; 返回上一層函數

禁用IRQ中斷:

DISABLE_IRQ

MRS R0 CPSR ; 將CPSR寄存器內容讀出到R0

ORR R0, R0,#0x80 ; 設置CPSR中的I控制位

MSR CPSR_c,R0 ; 將修改後的值寫回 CPSR寄存器的對應控制域

MOV PC,LR ; 返回上一層函數

閱讀全文

與MSR31什麼鋼材相關的資料

熱點內容
半自動鋼筋扎鉤多少錢一個 瀏覽:796
山東有什麼無縫鋼管廠 瀏覽:15
鑽地下鋼管是什麼 瀏覽:501
鋁板怎麼和鋼材焊接在一起 瀏覽:63
鋼材允許應力是什麼意思 瀏覽:462
花紋板鋪混泥土如何布鋼筋 瀏覽:533
鋼筋鏈條怎麼封口焊接 瀏覽:10
模具的改模設計檔案怎麼做 瀏覽:353
鋼材pip是什麼意思 瀏覽:63
鋼鐵是怎麼煉成的中的愛情 瀏覽:499
鋼鐵雄心4為什麼被封 瀏覽:268
螺紋鋼下差多少錢 瀏覽:837
空心普通鋼管的密度是多少 瀏覽:236
鋼板天溝的安裝套什麼定額 瀏覽:764
鋁合金用什麼油漆噴 瀏覽:956
模具廠開機床月工資多少 瀏覽:282
76是什麼鋼管 瀏覽:396
地磅焊接如何保護感測器 瀏覽:889
不銹鋼板secc什麼意思 瀏覽:144
鋁合金陽台怎麼認型材 瀏覽:225