1. 請問,在ACDSee GIF 圖像中931*400是什麼意思
像素啦~~
不能知道真實的尺寸,
英文名稱:Pixel
[編輯本段]像素定義
「像素」(Pixel) 是由 Picture(圖像) 和 Element(元素)這兩個單詞的字母所組成的,是用來計算數碼影像的一種單位,如同攝影的相片一樣,數碼影像也具有連續性的濃淡階調,我們若把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成,這些小方點就是構成影像的最小單位「像素」(Pixel)。這種最小的圖形的單元能在屏幕上顯示通常是單個的染色點。越高位的像素,其擁有的色板也就越豐富,越能表達顏色的真實感。 一個像素通常被視為圖像的最小的完整采樣。這個定義和上下文很相關。例如,我們可以說在一幅可見的圖像中的像素(例如列印出來的一頁)或者用電子信號表示的像素,或者用數碼表示的像素,或者顯示器上的像素,或者數碼相機(感光元素)中的像素。這個列表還可以添加很多其它的例子,根據上下文,會有一些更為精確的同義詞,例如畫素,采樣點,位元組,比特,點,斑,超集,三合點,條紋集,窗口,等等。我們也可以抽象地討論像素,特別是使用像素作為解析度地衡量時,例如2400像素每英寸(ppi)或者640像素每線。點有時用來表示像素,特別是計算機市場營銷人員,因此ppi有時所寫為DPI(dots per inch)。 用來表示一幅圖像的像素越多,結果更接近原始的圖像。一幅圖像中的像素個數有時被稱為圖像解析度,雖然解析度有一個更為特定的定義。像素可以用一個數表示,譬如一個"3兆像素" 數碼相機,它有額定三百萬像素,或者用一對數字表示,例如「640乘480顯示器」,它有橫向640像素和縱向480像素(就像VGA顯示器那樣),因此其總數為640 × 480 = 307,200像素。 數字化圖像的彩色采樣點(例如網頁中常用的JPG文件)也稱為像素。取決於計算機顯示器,這些可能不是和屏幕像素有一一對應的。在這種區別很明顯的區域,圖像文件中的點更接近紋理元素。 在計算機編程中,像素組成的圖像叫點陣圖或者光柵圖像。光柵一詞源於模擬電視技術。點陣圖化圖像可用於編碼數字影像和某些類型的計算機生成藝術。
[編輯本段]原始和邏輯像素
因為多數計算機顯示器的解析度可以通過計算機的操作系統來調節,顯示器的像素解析度可能不是一個絕對的衡量標准。 現代液晶顯示器按設計有一個原始解析度,它代表像素和三元素組之間的完美匹配。(陰極射線管也是用紅-綠-藍熒光三元素組,但是它們和圖像像素並不重合,因此和像素無法比較)。 對於該顯示器,原始解析度能夠產生最精細的圖像。但是因為用戶可以調整解析度,顯示器必須能夠顯示其它解析度。非原始解析度必須通過在液晶屏幕上擬合重新采樣來實現,要使用插值演算法。這經常會使屏幕看起來破碎或模糊。例如,原始解析度為1280×1024的顯示器在解析度為1280×1024時看起來最好,也可以通過用幾個物理三元素組來表示一個像素以顯示800×600,但可能無法完全顯示1600×1200的解析度,因為物理三元素組不夠。 像素可以是長方形的或者方形的。有一個數稱為長寬比,用於表述像素有多方。例如1.25:1的長寬比表示每個像素的寬是其高度的1.25倍。計算機顯示器上的像素通常是方的,但是用於數字影像的像素有矩形的長寬比,例如那些用於CCIR 601數字圖像標準的變種PAL和NTSC制式的,以及所對應的寬屏格式。 單色圖像的每個像素有自己的輝度。0通常表示黑,而最大值通常表示白色。例如,在一個8點陣圖像中,最大的無符號數是255,所以這是白色的值。 在彩色圖像中,每個像素可以用它的色調,飽和度,和亮度來表示,但是通常用紅綠藍強度來表示(參看紅綠藍)。
[編輯本段]比特每像素
一個像素所能表達的不同顏色數取決於比特每像素(BPP)。這個最大數可以通過取二的色彩深度次冪來得到。例如,常見的取值有 : 8 bpp [28=256;(256色)]; 16 bpp [216=65536; (65,536色,稱為高彩色)]; 24 bpp [224=16777216; (16,777,216色,稱為真彩色)]; 48 bpp [248=281474976710656;(281,474,976,710,656色,用於很多專業的掃描儀) 。 256色或者更少的色彩的圖形經常以塊或平面格式存儲於顯存中,其中顯存中的每個像素是到一個稱為調色板的顏色數組的索引值。這些模式因而有時被稱為索引模式。雖然每次只有256色,但是這256種顏色選自一個選擇大的多的調色板,通常是16兆色。改變調色板中的色彩值可以得到一種動畫效果。視窗95和視窗98的標志可能是這類動畫最著名的例子了。 對於超過8位的深度,這些數位就是三個分量(紅綠藍)的各自的數位的總和。一個16位的深度通常分為5位紅色和5位藍色,6位綠色(眼睛對於綠色更為敏感)。24位的深度一般是每個分量8位。在有些系統中,32位深度也是可選的:這意味著24位的像素有8位額外的數位來描述透明度。在老一些的系統中,4bpp(16色)也是很常見的。 當一個圖像文件顯示在屏幕上,每個像素的數位對於光柵文本和對於顯示器可以是不同的。有些光柵圖像文件格式相對其他格式有更大的色彩深度。例如GIF格式,其最大深度為8位,而TIFF文件可以處理48位像素。沒有任何顯示器可以顯示48位色彩,所以這個深度通常用於特殊專業應用,例如膠片掃描儀和列印機。這種文件在屏幕上採用24位深度繪制。
[編輯本段]子像素
很多顯示器和圖像獲取系統出於不同原因無法顯示或感知同一點的不同色彩通道。這個問題通常通過多個子像素的辦法解決,每個子像素處理一個色彩通道。例如,LCD顯示器通常將每個像素水平分解位3個子像素。多數LED顯示器將每個像素分解為4個子像素;一個紅,一個綠,和兩個藍。多數數碼相機感測器也採用子像素,通過有色濾波器實現。(CRT顯示器也採用紅綠藍熒光點,但是它們和圖像像素並不對齊,因此不能稱為子像素)。 對於有子像素的系統,有兩種不同的處理方式:子像素可以被忽略,將像素作為最小可以存取的圖像元素,或者子像素被包含到繪制計算中,這需要更多的分析和處理時間,但是可以在某些情況下提供更出色的圖像。 後一種方式被用於提高彩色顯示器的外觀解析度。這種技術,被稱為子像素繪制,利用了像素幾何來分別操縱子像素,對於設為原始解析度的平面顯示器來講最為有效(因為這種顯示器的像素幾何通常是固定的而且是已知的)。這是反走樣的一種形式,主要用於改進文本的顯示。微軟的ClearType,在Windows XP上可用,是這種技術的一個例子。
[編輯本段]兆像素
一個兆像素(megapixel)是一百萬個像素,通常用於表達數碼相機的解析度。例如,一個相機可以使用2048×1536像素的解析度,通常被稱為有「3.1百萬像素」 (2048 × 1536 = 3,145,728)。 數碼相繼使用感光電子器件,或者是耦合電荷設備(CCDs)或者CMOS感測器,它們記錄每個像素的輝度級別。在多數數碼相機中,CCD採用某種排列的有色濾波器,在Bayer濾波器拼合中帶有紅,綠,藍區域,使得感光像素可以記錄單個基色的輝度。相機對相鄰像素的色彩信息進行插值,這個過程稱為解拼(de-mosaic),然後建立最後的圖像。這樣,一個數碼相機中的x兆像素的圖像最後的彩色解析度最後可能只有同樣圖像在掃描儀中的解析度的四分之一。這樣,一幅藍色或者紅色的物體的圖像傾向於比灰色的物體要模糊。綠色物體似乎不那麼模糊,因為綠色被分配了更多的像素(因為眼睛對於綠色的敏感性)。參看[1]的詳細討論。 作為一個新的發展,Foveon X3 CCD採用三層圖像感測器在每個像素點探測紅綠藍強度。這個結構消除了解拼的需要因而消除了相關的圖像走樣,例如高對比度的邊的色彩模糊這種走樣。
[編輯本段]類似概念
從像素的思想衍生出幾個其它類型的概念,例如體元素(voxel),紋理元素(texel)和曲面元素(surfel),它們被用於其它計算機圖形學和圖像處理應用。
[編輯本段]數碼相機的像素
像素是衡量數碼相機的最重要指標。像素指的是數碼相機的解析度。它是由相機里的光電感測器上的光敏元件數目所決定的,一個光敏元件就對應一個像素。因此像素越大,意味著光敏元件越多,相應的成本就越大。 數碼相機的圖像質量是由像素決定的,像素越大,照片的解析度也越大,列印 尺寸在不降低列印質量的同時也越大。早期的數碼相機都是低於100萬像素的。從1999年下半年開始,200萬像素的產品漸漸成為市場的主流。(笑話,現在的手機都普遍200萬像素了,家庭用的相機一般都要500~600萬像素左右比較合適.要不還不如手機拍照.) 當前的數碼相機的發展趨勢,像素宛如PC機的CPU主頻,有越來越大的勢頭。 其實從市場分類角度看,面向普及型的產品,考慮性價比的因素,像素並不是 越大越好。畢竟200萬像素的產品,已經能夠滿足目前普通消費者的大多數應用。因 此大多數廠商在高端數碼相機追求高像素的同時,當前其產量最大的,仍是面向普 及型的百萬像素產品。專業級的數碼相機,已有超過1億像素級的產品。而300萬像 素級的產品,將隨著CCD(成像晶元)製造技術的進步和成本的進一步下降,也將很 快成為消費市場的主流。 另外值得消費者注意的是,當前的數碼相機產品,在像素標稱上分為CCD像素和經軟體優化後的像素,後者大大高於前者。如某品牌目前流行的數碼相機,其CCD像素為230萬,而軟體優化後的像素可達到330萬。
[編輯本段]像素畫
像素其實是由很多個點組成。 我們這里說的「像素畫」並不是和矢量圖對應的點陣式圖像,而是指的一種圖標風格的圖像,此風格圖像強調清晰的輪廓、明快的色彩,同時像素圖的造型往往比較卡通,因此得到很多朋友的喜愛。 像素圖的製作方法幾乎不用混疊方法來繪制光滑的線條,所以常常採用.gif格式,而且圖片也經常以動態形式出現.但由於其特殊的製作過程,如果隨意改變圖片的大小,風格就難以保證了。 像素畫的應用范圍相當廣泛,從小時候玩的FC家用紅白機的畫面直到今天的GBA手掌機;從黑白的手機圖片直到今天全彩的掌上電腦;即使我們日以面對的電腦中也無處不充斥著各類軟體的像素圖標。如今像素畫更是成為了一門藝術,深深的震撼著你我。
[編輯本段]效象素值
首先我們要明確一點,一張數碼照片的實際象素值跟感應器的象素值是有所不同的。以一般的感應器為例,每個象素帶有一個光電二極體,代表著照片中的一個象素。例如一部擁有500萬象素的數碼相機,它的感應器能輸出解析度為 2,560 x 1,920的圖像—其實精確來講,這個數值只相等於490萬有效象素。有效象素周圍的其他象素負責另外的工作,如決定「黑色是什麼」。很多時候,並不是所有感應器上的象素都能被運用。索尼F505V就是其中的經典案例。索尼F505V的感應器擁有334萬象素,但它最多智能輸出1,856 x 1,392即260萬象素的圖像。歸其原因,是索尼當時把比舊款更大的新型感應器塞進舊款數碼相機裡面,導致感應器尺寸過大,原來的鏡頭不能完全覆蓋感應器中的每個象素。 因此,數碼相機正是運用」感應器象素值比有效象素值大「這一原理輸出數碼圖片。在當今市場不斷追求高象素的環境下,數碼相機生產商常常在廣告中以數值更高的感應器象素為對象,而不是反映實際成像清晰度的有效象素。
[編輯本段]感應器象素插值
在通常情況下,感應器中不同位置的每個象素構成圖片中的每個象素。例如一張500萬象素的照片由感應器中的500萬個象素對進入快門的光線進行測量、處理而獲得(有效象素外的其他象素只負責計算)。但是我們有時候能看到這樣的數碼相機:只擁有300萬象素,卻能輸出600萬象素的照片!其實這里並沒有什麼虛假的地方,只是照相機在感應器300萬象素測量的基礎上,進行計算和插值,增加照片象素。 當攝影者拍攝JPEG格式的照片時,這種「照相機內擴大」的成像質量會比我們在電腦上擴大優秀,因為「照相機內擴大」是在圖片未被壓縮成JPEG格式前完成的。有數碼相片處理經驗的攝友都清楚,在電腦裡面擴大JPEG圖片會使畫面細膩和平滑度迅速下降。雖然數碼相機插值所得的圖片會比感應器象素正常輸出的圖片畫質好,但是插值所得的圖片文件大小比正常輸出的圖片大得多(如300萬感應器象素插值為600萬象素,最終輸入記憶卡的圖片為600萬象素)。因此,插值所得的高象素看來並沒有太多的可取之處,其實運用插值就好像使用數碼變焦-並不能創造原象素無法記錄的細節地方。
[編輯本段]CCD總象素
CCD總象素也是一個相當重要指標,由於各生產廠家採用不同技術,所以其廠家標稱CCD像素並不直接對應相機實際像素,所以購買數碼相機時更要看相機實際所具有總像素數。一般來講總像素水平達到300萬左右就可以滿足一般應用了,一般200萬象素、100萬象素產品也可以滿足低端使用,當然更高象素數碼相機可以得到更高質量照片,現在有些公司已經開始推出600萬象素級別普通數碼相機了。
關於相機的發展變化
數碼相機的發展變化,在某種意義上說,比人們預料的要快得多。截至2007年底,高像素的相機已經進入一般消費者手中。比如八百萬像素的相機,價格已經不是很高。像素可為3,264X2,448=7,990,272。
2. 0x7c931ec3 指令引用的 0x03c6302a 內存。 該內存不能為 written 是怎麼回事啊
內存不能為read/written 問題的簡單解決辦法:(原創答案,歡迎分享→請活學活用→僅供參考):
一、硬體的可能性是比較小的,如果是硬體,那就應該是內存條跟主機不兼容的問題導致的 如果能排除硬體上的原因(內存條不兼容,更換內存)往下看:
二、系統或其它軟體引起的,可用下述方法處理: 系統本身有問題,及時安裝官方發行的補丁,必要時重裝系統。 病毒問題:殺毒 。殺毒軟體與其它軟體沖突:卸載有問題的軟體。顯卡、音效卡驅動是否正確安裝或者是否被惡意覆蓋否?重新安裝顯卡音效卡驅動。
1、使用系統自帶的sfc命令,修復受到損壞的系統文件恢復到正常狀態。
開始→運行→輸入cmd,打開「命令提示符」窗口→輸入字元串命令sfc/scannow→回車→耐心等待命令程序對每個系統文件搜索掃描→一旦發現系統文件的版本不正確或者系統文件已經損壞→它就能自動彈出提示界面→要求插入Windows系統的安裝光碟→從中提取正常的系統文件來替代不正常的系統文件→達到修復系統文件的目的→最後重新啟動計算機。
2、安裝過的Domino這程序導致有問題,你可以在開始→運行→msconfig→啟動項目→關閉Domino啟動項→如果關閉不了→可以用卡卡助手之類的系統設置軟體把它強行關掉→如果還是不行的→證明你系統中毒→那就重新安裝系統徹底解決。
三、瀏覽器出現內存不能讀、寫的提示:
1、運行→regedit→進入注冊表, 在→
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks
這個位置有一個正常的鍵值{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 將其他的刪除。
2、打開CMD窗口輸入如下命令:
for %i in (%windir%\system32\*.dll) do regsvr32.exe /s %i 回車
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回車
兩條分別運行完成後重啟機器。
四、如果以上方法無法解決只能使用最後一招:
完全注冊dll:打開「運行」輸入→cmd→回車
然後把下面這行字元復制到黑色cmd框裡面去回車等待dll文件全部注冊完成就關閉可以了,為防止輸入錯誤可以復制這條指令,然後在命令提示符後擊滑鼠右鍵→粘貼→回車,耐心等待,直到屏幕滾動停止。
(下面是要運行的代碼):
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
完成後重新啟動機器。
五、如果你電腦裡面存在NET.Framework這個微軟的組件服務而你又不使用它→那麼卸載這個服務可能會解決問題:開始→設置→控制面板→添加刪除程序→NET.Framework→刪除。
六、關閉這個報告(治標不治本):
1、右擊桌面上「我的電腦」→屬性→高級→錯誤報告→錯誤匯報→勾選「禁用錯誤匯報」→「但在發生嚴重錯誤時通知我」復選框→確定。這樣處理對於一些小錯誤,Windows XP就不會彈出錯誤提示了。
2、如果不行徹底關閉錯誤報告服務。開始→運行中輸入→services.msc→打開「服務」窗口→找到「Error Reporting Service」→打開「Error Reporting Service的屬性」對話框→將「啟動類型」改為「已禁用」→確定後重新啟動系統。
簡單有效的處理方法是看錯誤提示,哪一個軟體引起的沖突就卸載那個軟體,重新啟動機器以後首先關閉殺毒軟體,重新運行安裝。
3. 拜託各位告我怎麼備份,
分類: 電腦/網路 >> 操作系統/系統故障
問題描述:
麻煩詳細一點謝謝
解析:
使用GHOST啊 而且做這樣的備份最好是系統在剛做好的時候 這樣的系統最干凈。至於GHOST的使用這里我就不詳細的說了。因為這是個老問題了你搜索一下就知道有很多的說明了。
這是我以前回答別人問GHOST的用法,你可以參考一下:
我現在一直用GHOST6 先把這個只有931KB的大小的文件拷下來其中只有兩個文件ghost.exe和ghostxp.exe (比如把他拷D:\ghost6)現在開始使用,我用的是DOS版不知道有沒有WINDOWS版的,不管哪個版本操作上應該都是差不多的:
1.用光碟啟動進入DOS。
2.具體操作是這樣的D:\CD GHOST6---)D:\GHOST6\GHOST 然後進入GHOST的操作界面
3.如果你要進行備份整個系統盤比如C盤 選擇「partition」 再選擇「to image」意思就是將C盤備份成一鏡像文件 然後硬碟選擇如果是單硬碟直接點確定。然後再進行盤符選擇. 肯定選擇C盤點.確定進入選擇將鏡像放的路徑.可以不進行選擇直接點確定.這樣就將該鏡像放在D;\ghost6下(還有這一步還得給該鏡像取名 這可以隨便起 比如back~1)。然後進入選擇將C盤做成鏡像的壓縮的程度。我一般選擇「fast'就是中間一項 然後確定就開始進行備份一般大概10來分鍾。
4.如果要將該鏡像恢復到C盤前面操作都是一樣。進入操作界面後選擇」partition" 再選擇「from image" 確定 再確定 選擇C盤 然後選擇鏡像所在的路徑 基本上一路確定就開始恢復。不過這里一定要慎重的就是選擇恢復到盤的選擇上 千萬不能選擇錯誤 否則恢復到其他盤的話 其他盤的數據就全部丟失了。
以上只是我自己操作的一些經驗,是根據記憶寫下來的,可能很多地方還有需要補充。要熟悉還得自己親自動手多操作幾次就可以了,
4. CIE 931色度圖怎麼看
CIE 1931 色度圖 (2維標准觀測)
目的
這個工程的目的就是證明如何顯示一個1931 CIE(Commission International de l'Eclairage 國際照明協會)的色度圖,同樣還包括1960和1976介紹中對其的改革。額外地,這個圖可以使用1931的2維標准觀測來顯示,也可以用1964年的10維標准觀測來顯示,我們還試著解釋它們之間的不同。
背景
標准觀測(Standard Observer)。CIE標准觀測是基於協會和建造者的表格的二維區域。CIE 1964標准觀測是10維的。 引導到1931標准觀測的實驗只使用了視網膜中的一個小凹槽,覆蓋了視野的2維。1964年附加的標准觀測是基於視網膜10維區域的色彩比配實驗。觀測忽略了中央的2維點。當視覺感受被期望為4維時,1964的標准觀測就被推薦出來了。
CIE標准觀測通常都基於許多實驗,這些實驗是用少數擁有普通視力的人做出的。沒有真正的觀測是也CIE標准觀測一樣的。請參考[Judd75, pp. 153-157] or [Billmeyer81, pp.42-45]。關於新聞組的投遞,Danny提出「1964觀測有50個觀測者左右,而1931隻有一打。1964的工作包括一些外國的已經獲得博士學位的同事,但是早期的工作只有包括倫敦附近的一些英國人」。
根據[Foley96, p. 580], 1964的表格並不是普遍為計算機使用的,因為它強調很大的一個顏色區域,這個區域里的大多數顏色並不是圖象中能夠找到的。
下面的圖能夠被「標准」表格色度程序顯示,當程序被校準了以後尺寸也就正確了。
CIE 1931 2-Degree Field of View
CIE 1964 10-Degree Field of View
要得到附加的CIE1931和1964觀測信息,請看[Judd75, p. 155] or [Billmeyer81, p. 42]。
顏色匹配函數。一系列關於1931和1964標准觀測的顏色匹配函數被定義了。這兩個標准觀測的1納米的定義可以在文件中找到,cxyz31_1.txt 和 cxyz64_1.txt, at [CIE 標准, http://cvision.ucsd.e/cie.htm], 或者表格在 [Wyszecki82]。
CIE顏色匹配函數的一納米表格給出了7個標準的圖。但是根據[Wyszecki82, p. 131]「那些大量的用來定義顏色匹配函數的數字圖形是不必像實驗得到顏色匹配數據那樣具有驗證,基於這個數字圖形的表格上的值有一個相比較的精密度的。視覺色彩匹配和這里的精密度是有很大距離的。」但是有了這個精密度和計算機,還有色度表上的坐標,我們可以直接用色度匹配函數來計算出顏色,而不必像以前一樣用表格來計算了。
1931顏色匹配函數的圖形就在下面:
CIE1964顏色匹配函數的曲線彎度就和上面的或者[Billmeyer81, p. 44]有一點點區別。
色度圖
CIE 1931 xy Chromaticity Diagram
馬蹄鐵線是光譜軌跡。
連接馬蹄鐵底部結束的線叫作無光譜的「紫色線」
In terms of the tristimulus values X, Y and Z:
x = X / (X + Y + Z)
y = Y / (X + Y + Z)
z = Z / (X + Y + Z)
x + y + z = 1
See [Fortner97, pp. 95-100, 102-116]
這個CIE圖標的表示給予綠色區域一個並不平衡的面積。對於原來1931CIE色度圖的各種改變被提議修正這個失真,還要歸整出一個唯一近似的色度空間。
理論上來說,最小可分辨區域應該是原形的,但是由於不唯一的色度圖,對於這個區域卻是橢圓形,而且這種區域在色度圖中由位置的不同而有不同的尺寸大小。碎小的這種橢圓區域在CIE色度圖中常被指出。[Chamberlin80, p. 67-68]
根據[Fortner97, p. 104],控制波長和純度的因素經常在色度圖中用來描述顏色,也表達了色調和飽和度的概念。
注意:沒有一個輸出設備能夠輸出精確的CIE圖象,因為輸出設備都是有固定的墨和顏色的,固定的幾種顏色是不能夠表達所有可以看見的顏色的。
1960 CIE uv Chromaticity Diagram
Conversion of 1931 xy coordinates to 1960 uv coordinates:
u = 4x / (-2x + 12y + 3)
v = 6y / (-2x + 12y + 3)
In terms of the tristimulus values X, Y and Z:
u = 4X / (X + 15Y +3Z)
v = 6Y / (X + 15Y + 3Z)
Conversion of 1960 uv coordinates to 1931 xy coordinates:
x = 3u / (2u - 8v + 4)
y = 2v / (2u - 8v + 4)
See [Agoston87, p. 240], [Judd75, p. 296], [Billmeyer81, p. 57].
這個1960的公式「碾碎」了所有黃色,褐色,橙色和紅色,把它們放入了一個相關的很小的色度圖區域,這個圖是在色差點和光譜軌跡之間的。這個區域應該足夠地大,因為這些顏色出現在食物,油,繪畫和其它工業領域。[Chamerlin80, p. 60],1976的色度圖有了更好的改進:
1976 CIE u'v' Chromaticity Diagram
Conversion of 1976 u'v' coordinates to 1931 xy coordinates:
x = 9u' / (6u' - 16v' + 12)
y = 4v' / (6u' - 16v' + 12)
z = (-3u' - 20v' + 12) / (6u' - 16v' + 12)
For conversion from 1960 to 1976 coordinates:
u' = u
u' = 4x / (-2x + 12y + 3)
u' = 4X / (X + 15Y +3Z)
v' = 3v/2
v' = 9Y / (X + 15Y + 3Z)
v' = 9y / (-2x + 12y + 3)
w' = (-6x + 3y + 3) / (-2x + 12y + 3)
[Chamberlin80, p. 60], [Billmeyer81, p. 58], [Hunt87, Appendix 6, p. 197].
1976年圖表的優點是每點之間的距離已經近似於均衡的距離了,1931中的一些定義並不確切。但是歷史的慣性獲得了勝利的優勢:1976圖表並沒有像1931圖表那樣廣泛使用。
Chromaticity Coordinates of Phosphors.
(中間一些表格顯示不正常,請去酷太陽實驗室查看詳細資料)
也可以參看Phosphors for Cathode Ray Tubes 或者 Phosphor Handbook。
Maxwell三角形和色階
在麥氏維爾三角形中,從三個附加根源出現的顏色可以混合成任何一個可能的顏色。在麥氏維爾三角形實驗室報告中有更詳細的解釋。
RGB的色度坐標定義了一個可以被所有CRT顯示器可能顯示顏色色麥氏維爾三角形(或者色階)。在單個顯示器上,在各種顏色空間上正確顯示色階是不可能的,因為色階有輕微的不同,有些顏色不能夠精確地顯示出來。色階可以被近似出來,但是,例如下面顯示的SMPTE色階存在於各種色度圖中:
SMPTE Gamut in 1931 CIE xy Chromaticity Diagram
SMPTE Gamut in 1960 CIE uv Chromaticity Diagram
SMPTE Gamut in 1976 CIE u'v' Chromaticity Diagram
1931和1964色度圖並不嚴格正確,但在對於論證目的的色度圖程序來說是允許的。
順便說一下,YUV的Y是被顏色中白色部分所糾正的GAMMA,CIE XYZ 中的Y是並不確切的白色。它們存在聯系,但不相同。請看顏色制度。
5. 嵌入式系統linux內核開發實戰指南的目錄
第1部分 嵌入式系統硬體開發
第1章 嵌入式系統概述 2
這一章對嵌入式系統的概念及其特點和應用作了概括介紹,筆者根據自己多年的經驗闡述了對嵌入式系統的理解,並對一些常見的嵌入式處理器的硬體數據進行了比較。
1.1 嵌入式系統概念 2
1.2 嵌入式處理器 3
1.3 嵌入式系統應用 4
1.4 嵌入式系統發展 4
1.5 一些嵌入式處理器的硬體特性比較 5
第2章 ARM處理器概述 16
為了使本書內容完整,從第2章到第7章中的內容大部分是筆者閱讀《ARM體系結構與編程》(詳情參見附錄中的參考文獻)的筆記和心得,把與嵌入式系統開發和Linux內核密切相關的硬體知識進行了概括和整理,本章主要介紹了ARM處理器的特點、ARM處理器的體系架構版本和ARM處理器系列。
2.1 ARM發展歷程 16
2.2 ARM處理器特點 17
2.3 ARM處理器應用 17
2.4 ARM體系架構 18
2.4.1 ARM體系架構版本 18
2.4.2 ARM體系架構變種(Variant) 20
2.4.3 ARM體系架構版本命名格式 22
2.5 ARM處理器 22
2.5.1 ARM7系列處理器 23
2.5.2 ARM9系列處理器 24
2.5.3 ARM9E系列處理器 24
2.5.4 ARM10E系列處理器 25
2.5.5 SecurCore系列處理器 25
2.5.6 StrongARM處理器 26
2.5.7 Xscale處理器 26
第3章 ARM指令及其定址方式 27
本章主要介紹了ARM處理器的指令和定址方式以及ARM匯編偽指令,這是做ARM處理器應用系統底層軟體開發必備的知識。
3.1 ARM處理器的程序狀態寄存器(PSR) 27
3.2 ARM指令的條件碼 28
3.3 ARM指令介紹 29
3.3.1 跳轉指令 29
3.3.2 數據處理指令 30
3.3.3 乘法指令 31
3.3.4 雜類算術指令 32
3.3.5 狀態寄存器訪問指令 32
3.3.6 Load/Store內存訪問指令 33
3.3.7 批量Load/Store內存訪問指令 34
3.3.8 LDREX和STREX指令 35
3.3.9 信號量操作指令 37
3.3.10 異常中斷產生指令 37
3.3.11 ARM協處理器指令 37
3.4 ARM指令定址方式 39
3.4.1 數據處理指令的操作數的定址方式 39
3.4.2 字及無符號位元組的Load/Store指令的定址方式 43
3.4.3 雜類Load/Store指令的定址方式 47
3.4.4 批量Load/Store指令的定址方式 49
3.4.5 協處理器Load/Store指令的定址方式 51
3.4.6 ARM指令的定址方式總結 52
3.5 ARM匯編偽操作(Directive) 53
3.5.1 符號定義偽操作 54
3.5.2 數據定義偽操作 54
3.5.3 匯編控制偽操作 56
3.5.4 棧中數據幀描述偽操作 57
3.5.5 信息報告偽操作 57
3.5.6 其他偽操作 58
3.6 ARM匯編偽指令 59
3.7 Thumb指令介紹 60
第4章 ARM處理器內存管理單元(MMU) 61
本章主要介紹了ARM處理器內存管理單元(MMU)的工作原理,Linux內存管理功能是通過處理器硬體MMU實現的,在沒有MMU的處理器系統中,Linux只能工作在物理地址模式,沒有虛擬(線性)地址空間的概念。
4.1 ARM處理器中CP15協處理器的寄存器 61
4.1.1 訪問CP15寄存器的指令 61
4.1.2 CP15寄存器介紹 62
4.2 MMU簡介 70
4.3 系統訪問存儲空間的過程 71
4.3.1 使能MMU時的情況 71
4.3.2 禁止MMU時的情況 71
4.3.3 使能/禁止MMU時應注意的問題 72
4.4 ARM處理器地址變換過程 72
4.4.1 MMU的一級映射描述符 73
4.4.2 MMU的二級映射描述符 74
4.4.3 基於段的地址變換過程 75
4.4.4 粗粒度大頁地址變換過程 75
4.4.5 粗粒度小頁地址變換過程 76
4.4.6 細粒度大頁地址變換過程 76
4.4.7 細粒度小頁地址變換過程 77
4.4.8 細粒度極小頁地址變換過程 77
4.5 ARM存儲空間訪問許可權控制 78
4.6 TLB操作 79
4.6.1 使TLB內容無效 79
4.6.2 鎖定TLB內容 79
4.6.3 解除TLB中被鎖定的地址變換條目 80
4.7 存儲訪問失效 80
4.7.1 MMU失效(MMU Fault) 80
4.7.2 外部存儲訪問失效(External Abort) 81
第5章 ARM處理器的Cache和Write Buffer 82
本章主要介紹了ARM處理器高速緩存(Cache)和寫緩存(Write Buffer)的工作原理,使讀者了解如何提高處理器的性能。
5.1 Cache和Write Buffer一般性介紹 82
5.1.1 Cache工作原理 82
5.1.2 地址映像方式 83
5.1.3 Cache寫入方式原理簡介 84
5.1.4 關於Write-through和Write-back 85
5.1.5 Cache替換策略 86
5.1.6 使用Cache的必要性 87
5.1.7 使用Cache的可行性 87
5.2 ARM處理器中的Cache和Write Buffer 88
5.2.1 基本概念 88
5.2.2 Cache工作原理 88
5.2.3 Cache地址映射和變換方法 89
5.2.4 Cache分類 90
5.2.5 Cache替換演算法 91
5.2.6 Cache內容鎖定 91
5.2.7 MMU映射描述符中B位和C位的含義 92
5.2.8 Cache和Writer Buffer編程介面 93
5.3 ARM處理器的快速上下文切換技術 94
5.3.1 FCSE概述 94
5.3.2 FCSE原理 94
5.3.3 FCSE編程介面 95
第6章 ARM處理器存儲訪問一致性問題 97
本章介紹了在支持MMU、Cache和DMA的系統中可能出現的存儲訪問一致性問題,以及Linux中解決類似問題的方法。
6.1 存儲訪問一致性問題介紹 97
6.1.1 地址映射關系變化造成的數據不一致性 97
6.1.2 指令cache的數據不一致性問題 98
6.1.3 DMA造成的數據不一致問題 99
6.1.4 指令預取和自修改代碼 99
6.2 Linux中解決存儲訪問一致性問題的方法 99
第7章 ARM處理器工作模式與異常中斷處理 101
本章主要介紹了ARM處理器的工作模式和異常中斷處理過程,這是ARM處理器系統啟動程序編寫者或Bootloader開發人員的必備知識。
7.1 ARM處理器工作模式 101
7.2 ARM處理器異常中斷向量表和優先順序 103
7.3 ARM處理器異常中斷處理 104
7.3.1 進入異常中斷處理 104
7.3.2 退出異常中斷處理 105
7.4 ARM處理器的中斷(IRQ或FIQ) 109
第8章 ARM處理器啟動過程 110
本章根據筆者的開發經驗介紹了ARM處理器系統的啟動過程以及編寫ARM處理器系統啟動程序需要注意的事項。
8.1 ARM處理器上電/復位操作 110
8.2 ARM處理器系統初始化過程 111
8.3 ARM處理器系統初始化編程注意事項 111
第9章 嵌入式系統設計與調試 113
本章根據筆者10多年的開發經驗介紹了嵌入式系統的設計流程和調試方法,列舉了大量筆者工作中碰到的實際案例。本章內容對於嵌入式系統硬體開發和調試有較高的參考、指導價值。
9.1 嵌入式系統設計流程 113
9.2 嵌入式系統硬體原理設計與審核 114
9.3 硬體設計工具軟體 117
9.4 嵌入式系統調試模擬工具 117
9.5 嵌入式系統調試診斷方法 118
第10章 自製簡易JTAG下載燒寫工具 123
本章根據筆者自己製作簡易JTAG線纜的經驗,介紹了簡易JTAG線纜的硬體原理和軟體流程,這是初學者必備的最廉價的工具,必須掌握。
10.1 JTAG簡介 123
10.1.1 一些基本概念 124
10.1.2 JTAG介面信號 124
10.1.3 TAP控制器的狀態機 125
10.1.4 JTAG介面指令集 129
10.2 簡易JTAG線纜原理 130
10.2.1 PC並口定義 130
10.2.2 PC並口的寄存器 131
10.2.3 簡易JTAG線纜原理圖 133
10.2.4 簡易JTAG線纜燒寫連接圖(見圖10-5) 134
10.3 簡易JTAG燒寫代碼分析 135
10.3.1 簡易JTAG燒寫程序(flashp)使用說明 135
10.3.2 flash與CPU連接及flash屬性描述文件 136
10.3.3 簡易JTAG燒寫程序的執行邏輯和流程 138
第2部分 Linux內核開發初步
第11章 Bootloader 142
本章根據筆者的工作經驗介紹了流行的幾種Bootloader、Bootloader應該具備的基本功能以及Bootloader的裁剪與移植。
11.1 Bootloader的任務和作用 142
11.2 各種各樣的Bootloader 143
11.3 Bootloader編譯環境 144
11.4 Bootloader的移植與裁減 145
11.5 編譯Bootloader 145
11.6 燒寫Bootloader 146
11.7 Bootloader使用舉例 148
11.8 Bootloader修改舉例 149
第12章 創建嵌入式Linux開發環境 151
本章介紹了如何創建嵌入式系統Linux內核交叉開發環境,本章和後續3章的內容是嵌入式系統Linux內核開發的基礎,必須掌握。
12.1 安裝Linux host 151
12.2 在虛擬機中安裝Linux host 152
12.3 安裝Linux交叉編譯環境 157
12.4 在主機上設置TFTP Server 160
12.5 在主機上設置DHCP Server 161
12.6 在主機上設置Telnet server 161
12.7 在開發過程中使用NFS 162
12.8 設置超級終端 163
第13章 編譯Linux內核 166
本章介紹了Linux內核的配置和編譯方法。
13.1 獲取Linux內核源代碼 166
13.2 Linux內核目錄結構 166
13.3 配置Linux內核 167
13.4 編譯Linux內核 168
第14章 創建Linux根文件系統 170
本章介紹了Linux的根文件系統的結構以及創建根文件系統的方法。
14.1 根文件系統概述 170
14.2 根文件系統目錄結構 171
14.3 獲取根文件系統組件源代碼 171
14.4 編譯根文件系統源代碼 171
14.5 創建一個32MB的RAMDISK根文件系統 173
14.6 在根文件系統中添加驅動模塊或者應用程序 173
第15章 固化Linux內核和根文件系統 174
本章介紹了固化(燒寫)Linux內核和根文件系統的方法。
第16章 關於Clinux 176
本章簡要介紹了Clinux與標准Linux的區別。
16.1 Clinux簡介 176
16.2 Clinux源代碼目錄結構 177
16.3 Clinux與標准Linux的區別 178
16.4 編譯Clinux 179
第3部分 Linux 2.6內核原理
第17章 Linux 2.6.10@ARM啟動過程 182
本章以start_kernel()和init()函數中調用到的函數說明的方式,介紹了從Linux匯編代碼入口到init內核進程最後調用用戶空間init命令的Linux整個啟動過程。本章內容是筆者第一次閱讀Linux內核源代碼時對這些函數的注釋,僅供讀者了解start_kernel()和init()函數中調用到的每個函數的大致功能時使用。
17.1 Linux 2.6.10中與ARM處理器平台硬體相關的結構和全局變數 182
17.1.1 相關數據結構 182
17.1.2 相關全局變數 187
17.2 Linux匯編代碼入口 189
17.3 Linux匯編入口處CPU的狀態 189
17.4 start_kernel()函數之前的匯編代碼執行過程 190
17.5 start_kernel()函數中調用的函數介紹 192
17.5.1 lock_kernel()函數 192
17.5.2 page_address_init()函數 192
17.5.3 printk(linux_banner) 193
17.5.4 setup_arch(&command_line)函數 193
17.5.5 setup_per_cpu_areas()函數 198
17.5.6 smp_prepare_boot_cpu()函數 199
17.5.7 sched_init()函數 199
17.5.8 build_all_zonelists()函數 200
17.5.9 page_alloc_init()函數 200
17.5.10 printk(Kernel command line: %s
, saved_command_line) 201
17.5.11 parse_early_param()函數 201
17.5.12 parse_args()函數 201
17.5.13 sort_main_extable()函數 202
17.5.14 trap_init()函數 202
17.5.15 rcu_init()函數 202
17.5.16 init_IRQ()函數 203
17.5.17 pidhash_init()函數 203
17.5.18 init_timers()函數 203
17.5.19 softirq_init()函數 204
17.5.20 time_init()函數 204
17.5.21 console_init()函數 205
17.5.22 profile_init()函數 206
17.5.23 local_irq_enable()函數 207
17.5.24 vfs_caches_init_early()函數 207
17.5.25 mem_init()函數 208
17.5.26 kmem_cache_init()函數 210
17.5.27 numa_policy_init()函數 225
17.5.28 calibrate_delay()函數 227
17.5.29 pidmap_init()函數 228
17.5.30 pgtable_cache_init()函數 229
17.5.31 prio_tree_init()函數 229
17.5.32 anon_vma_init()函數 229
17.5.33 fork_init(num_physpages)函數 229
17.5.34 proc_caches_init()函數 230
17.5.35 buffer_init()函數 231
17.5.36 unnamed_dev_init()函數 231
17.5.37 security_init()函數 231
17.5.38 vfs_caches_init(num_physpages)函數 232
17.5.39 radix_tree_init()函數 237
17.5.40 signals_init()函數 237
17.5.41 page_writeback_init()函數 237
17.5.42 proc_root_init()函數 238
17.5.43 check_bugs()函數 240
17.5.44 acpi_early_init()函數 244
17.5.45 rest_init()函數 244
17.6 init()進程執行過程 265
17.6.1 smp_prepare_cpus(max_cpus)函數 265
17.6.2 do_pre_smp_initcalls()函數 265
17.6.3 fixup_cpu_present_map()函數 267
17.6.4 smp_init()函數 267
17.6.5 sched_init_smp()函數 268
17.6.6 populate_rootfs()函數 268
17.6.7 do_basic_setup()函數 283
17.6.8 sys_access()函數 292
17.6.9 free_initmem()函數 301
17.6.10 unlock_kernel()函數 301
17.6.11 numa_default_policy()函數 302
17.6.12 sys_p()函數 302
17.6.13 execve()函數 302
第18章 Linux內存管理 305
從本章開始,筆者將帶領讀者走進神秘的Linux內核世界。筆者在閱讀內核源代碼以及兩本相關參考書(見參考文獻)的基礎上,以自己的理解和語言總結概括了Linux內核每個組件的原理。筆者對與每個內核組件相關的關鍵數據結構和全局變數作了盡量詳盡的說明,並且對核心函數進行了詳細注釋,在向讀者灌輸理論知識的同時引導讀者自己去閱讀、分析Linux內核源代碼。本章講解了Linux內核第一大核心組件「內存管理」的原理和實現內幕。
18.1 Linux內存管理概述 305
18.1.1 Linux內存管理的一些基本概念 305
18.1.2 內存管理相關數據結構 309
18.1.3 內存管理相關宏和全局變數 330
18.1.4 Linux內存管理的任務 341
18.1.5 Linux中的物理和虛擬存儲空間布局 341
18.2 為虛擬(線性地址)存儲空間建立頁表 345
18.3 設置存儲空間的訪問控制屬性 348
18.4 Linux中的內存分配和釋放 350
18.4.1 在系統啟動初期申請內存 350
18.4.2 系統啟動之後的內存分配與釋放 360
第19章 Linux進程管理 480
本章講解了Linux內核第二大核心組件「進程管理」的原理和實現內幕。
19.1 進程管理概述 480
19.1.1 進程相關概念 480
19.1.2 進程分類 481
19.1.3 0號進程 481
19.1.4 1號進程 481
19.1.5 其他一些內核線程 482
19.1.6 進程描述符(struct task_struct) 482
19.1.7 進程狀態 482
19.1.8 進程標識符(PID) 483
19.1.9 current宏定義 484
19.1.10 進程鏈表 484
19.1.11 PID hash表和鏈表 485
19.1.12 硬體上下文(Hardware Context) 485
19.1.13 進程資源限制 485
19.1.14 進程管理相關數據結構 486
19.1.15 進程管理相關宏定義 502
19.1.16 進程管理相關全局變數 514
19.2 進程管理相關初始化 520
19.3 進程創建與刪除 529
19.4 進程調度 551
19.4.1 進程類型 553
19.4.2 進程調度類型 554
19.4.3 基本時間片計算方法 555
19.4.4 動態優先順序演算法 556
19.4.5 互動式進程 556
19.4.6 普通進程調度 557
19.4.7 實時進程調度 557
19.4.8 進程調度函數分析 558
19.5 進程切換 576
19.6 用戶態進程間通信 581
19.6.1 信號(Signal) 581
19.6.2 管道(pipe)和FIFO(命名管道) 627
19.6.3 進程間通信原語(System V IPC) 641
第20章 Linux文件管理 651
本章講解了Linux內核第三大核心組件「文件系統」的原理和實現內幕。
20.1 文件系統概述 651
20.1.1 Linux文件管理相關概念 652
20.1.2 Linux文件管理相關數據結構 657
20.1.3 Linux文件管理相關宏定義 682
20.1.4 Linux文件管理相關全局變數 691
20.2 文件管理相關初始化 699
20.3 文件系統類型注冊 711
20.4 掛接文件系統 712
20.5 文件系統類型超級塊讀取 730
20.5.1 get_sb_single()通用超級塊讀取函數 731
20.5.2 get_sb_nodev()通用超級塊讀取函數 737
20.5.3 get_sb_bdev()通用超級塊讀取函數 738
20.5.4 get_sb_pseudo()通用超級塊讀取函數 740
20.6 路徑名查找 747
20.7 訪問文件操作 759
20.7.1 打開文件 759
20.7.2 關閉文件 766
20.7.3 讀文件 768
20.7.4 寫文件 785
20.8 非同步I/O系統調用 792
20.9 Linux特殊文件系統 792
20.9.1 rootfs文件系統 793
20.9.2 sysfs文件系統 797
20.9.3 devfs設備文件系統 800
20.9.4 bdev塊設備文件系統 803
20.9.5 ramfs文件系統 804
20.9.6 proc文件系統 804
20.10 磁碟文件系統 813
20.10.1 ext2文件系統相關數據結構 813
20.10.2 ext2文件系統磁碟分區格式 819
20.10.3 ext2文件系統的各種文件 820
20.10.4 創建ext2文件系統 821
20.10.5 ext2文件系統的操作方法 822
20.11 關於initramfs 824
20.11.1 initramfs概述 824
20.11.2 initramfs與initrd的區別 824
20.11.3 initramfs相關全局變數 825
20.11.4 initramfs被編譯鏈接的位置 825
20.11.5 initramfs文件的生成過程 825
20.11.6 initramfs二進制文件格式說明(cpio格式) 828
20.11.7 initramfs二進制文件和列表文件對照示例 829
20.11.8 initramfs利弊 830
20.12 關於initrd 830
20.12.1 initrd概述 830
20.12.2 initrd相關全局變數 831
20.13 關於gzip壓縮文件 832
第21章 Linux模塊設計 834
本章講解了Linux內核模塊程序與應用程序的區別以及如何編寫和載入Linux內核模塊程序。
21.1 Linux模塊設計概述 834
21.2 Linux的內核空間和用戶空間 834
21.3 內核模塊與應用程序的區別 835
21.4 編譯模塊 837
21.5 裝載和卸載模塊 837
21.6 模塊層疊 838
21.7 模塊版本依賴 839
21.8 模塊編程示例 839
第22章 Linux系統異常中斷管理 841
本章講解了Linux內核如何管理系統異常中斷以及Linux系統調用的實現內幕。
22.1 Linux異常中斷處理 841
22.2 指令預取和數據訪問中止異常中斷處理 849
22.2.1 指令預取中止異常中斷處理 850
22.2.2 數據訪問中止異常中斷處理 858
22.3 Linux中斷處理 863
22.3.1 內核模式下的中斷處理 863
22.3.2 用戶模式下的中斷處理 867
22.4 從中斷返回 868
22.5 Linux中斷管理 869
22.5.1 Linux中斷管理相關數據結構與全局變數 870
22.5.2 Linux中斷管理初始化 872
22.5.3 安裝和卸載中斷處理程序 874
22.5.4 使能和禁止中斷 878
22.6 Linux系統調用 880
22.6.1 Linux系統調用內核實現過程 880
22.6.2 從系統調用返回 889
22.6.3 Linux系統調用用戶程序介面函數 890
22.6.4 Linux系統調用用戶介面函數與內核實現函數之間參數傳遞 899
第23章 Linux軟中斷和工作隊列 901
本章講解了Linux內核中的兩種延遲處理機制「軟中斷」和「工作隊列」的原理和實現。
23.1 概述 901
23.2 Linux軟中斷 902
23.2.1 軟中斷相關數據結構和全局變數 903
23.2.2 軟中斷初始化 904
23.2.3 軟中斷的核心操作函數do_softirq() 908
23.2.4 軟中斷看護進程執行函數ksoftirqd() 912
23.2.5 如何使用軟中斷 913
23.3 Linux工作隊列 918
23.3.1 Linux工作隊列相關數據結構和全局變數 918
23.3.2 Linux工作隊列初始化 921
23.3.3 將工作加入到工作隊列中 924
23.3.4 工作者進程執行函數worker_thread() 928
23.3.5 使用Linux工作隊列 931
第24章 Linux並發與競態 933
本章講解了Linux內核同步機制,包括幾種鎖定技術以及免鎖演算法。
24.1 並發與競態概述 933
24.1.1 Linux中的並發源 934
24.1.2 競態可能導致的後果 934
24.1.3 避免競態的規則 934
24.2 消除競態的「鎖定」技術 935
24.2.1 信號量(semphore)和互斥體(mutual exclusion) 935
24.2.2 讀寫信號量(rw_semaphore) 938
24.2.3 完成量(completion) 941
24.2.4 自旋鎖(spinlock_t) 942
24.2.5 讀寫自旋鎖(rwlock_t) 946
24.2.6 使用「鎖定」技術的注意事項 949
24.3 消除競態的非「鎖定」方法 949
24.3.1 免鎖演算法 949
24.3.2 原子操作 950
24.3.3 位操作 951
24.3.4 順序鎖 952
24.3.5 讀-復制-更新(Read-Copy-Update,RCU) 954
第25章 Linux設備驅動程序 958
本章講解了Linux內核第四大核心組件「設備驅動」的原理和實現內幕。同時還總結歸納了編寫各種設備驅動程序的方法和步驟。
25.1 設備驅動程序概述 958
25.1.1 設備驅動程序組成部分 959
25.1.2 設備號 959
25.1.3 設備文件 960
25.1.4 編寫設備驅動程序的關鍵 961
25.2 字元設備驅動程序 961
25.2.1 字元設備相關數據結構 961
25.2.2 字元設備相關全局變數 963
25.2.3 字元設備驅動程序全局初始化 963
25.2.4 為字元設備分配設備號 964
25.2.5 注冊字元設備驅動程序 968
25.2.6 字元設備的操作方法 971
25.2.7 用戶對字元設備驅動程序的調用過程 972
25.2.8 如何編寫字元設備驅動程序 974
25.2.9 關於TTY設備驅動程序 974
25.2.10 控制台設備驅動程序 975
25.3 塊設備驅動程序 986
25.3.1 塊設備相關數據結構 986
25.3.2 塊設備相關宏定義 997
25.3.3 塊設備相關全局變數 999
25.3.4 塊設備驅動程序全局初始化 1004
25.3.5 為塊設備分配主設備號 1006
25.3.6 注冊塊設備驅動程序 1009
25.3.7 塊設備驅動程序的操作方法 1017
25.3.8 調用塊設備驅動程序過程 1017
25.3.9 I/O調度 1031
25.3.10 如何編寫塊設備驅動程序 1032
25.4 網路設備驅動程序 1033
25.4.1 網路設備驅動程序概述 1033
25.4.2 網路設備相關數據結構 1034
25.4.3 網路設備相關宏定義 1044
25.4.4 網路設備相關全局變數 1045
25.4.5 創建net_device結構 1046
25.4.6 注冊網路設備 1048
25.4.7 網路設備的操作方法 1050
25.4.8 網路設備中斷服務程序 1051
25.4.9 如何編寫網路設備驅動程序 1051
25.5 PCI設備驅動程序 1052
25.5.1 PCI介面定義 1053
25.5.2 PCI設備的三個地址空間 1057
25.5.3 PCI匯流排仲裁 1058
25.5.4 PCI設備編號 1059
25.5.5 如何訪問PCI配置空間 1059
25.5.6 如何配置PCI設備 1061
25.5.7 PCI驅動程序相關數據結構 1062
25.5.8 PCI驅動程序相關宏定義 1068
25.5.9 PCI驅動程序相關全局變數 1068
25.5.10 Bootloader和內核做的事 1069
25.5.11 PCI驅動程序注冊 1069
25.5.12 PCI驅動程序介面函數 1071
25.5.13 如何編寫PCI驅動程序 1072
第4部分 Linux內核開發高級指南
第26章 Linux系統參數設置 1076
從本章開始的後續章節主要講解了比較高級或者平時較少關注的Linux內核方面的知識,本章講解了Linux中的4種系統參數格式和設置方法。
26.1 旗語系統參數(tag) 1076
26.1.1 與旗語系統參數相關數據結構和全局變數 1076
26.1.2 旗語系統參數說明 1082
26.1.3 旗語系統參數設置方法 1084
26.2 前期命令行設置的系統參數 1084
26.2.1 與前期命令行系統參數相關數據結構和全局變數 1084
26.2.2 前期命令行設置的系統參數說明 1085
26.2.3 前期命令行系統參數設置方法 1086
26.2.4 如何添加自己的前期命令行設置的系統參數 1087
26.3 老式命令行系統參數 1087
26.3.1 與老式命令行系統參數相關數據結構和全局變數 1087
26.3.2 老式命令行設置的系統參數說明 1088
26.3.3 老式命令行設置的系統參數設置方法 1089
26.3.4 如何添加自己的老式命令行設置的系統參數 1089
26.4 命令行系統參數 1089
26.4.1 與命令行系統參數相關數據結構和全局變數 1089
26.4.2 命令行設置的系統參數說明 1090
26.4.3 命令行設置的系統參數設置方法 1090
第27章 Linux內核調試 1091
本章介紹了Linux內核的調試方法。
27.1 打開Linux內核及其各模塊自帶的調試開關 1091
27.2 內核剖析(Profiling) 1093
27.3 通過列印調試(printk) 1095
27.3.1 關於printk() 1095
27.3.2 內核信息級別 1096
27.3.3 列印速度限制 1097
27.3.4 控制台重定向 1098
27.4 使用proc文件系統調試 1098
27.5 oops消息 1098
27.6 通過跟蹤命令strace調試 1099
27.7 使用gdb、kdb、kgdb調試 1099
第28章 Linux內核移植 1101
本章介紹了Linux內核的移植方法。
第29章 Linux內核優化 1104
本章介紹了Linux內核的優化方法。
29.1 編譯優化 1104
29.2 根據CPU特性進行優化 1105
29.3 對內核進行裁減 1105
29.4 優化系統內存配置 1106
29.5 優化系統啟動過程以縮減系統啟動時間 1106
29.6 內存映射優化 1107
29.7 工具軟體輔助優化 1107
第30章 Linux定時器 1109
本章介紹了Linux內核的軟體定時器。
30.1 定時器相關數據結構 1109
30.2 定時器相關宏定義 1111
30.3 定時器相關全局變數 1112
30.4 定時器和時鍾初始化 1113
30.5 獲取系統時間 1114
30.6 延遲函數 1115
30.7 與定時器相關系統調用 1115
30.8 使用定時器方法 1116
第31章 雜項 1117
本章介紹了PER_CPU變數以及Linux中的數據類型定義。
31.1 per_cpu變數 1117
31.2 Linux中的數據類型定義 1118
第32章 編譯鏈接文件說明 1119
本章注釋了ARM處理器系統中Linux內核的鏈接文件,以幫助讀者了解編譯出來的Linux內核各區段在內存中的存放位置。
參考文獻 1125
6. 解決Apache Tomcat Default Files的Nessus中危漏洞
【問題描述】
Nessus掃描出的Tomcat默認文件相關的中危漏洞,如下:
12085 - Apache Tomcat Default Files -
Synopsis
The remote web server contains default files.
Description
The default error page, default index page, example JSPs, and/or example servlets are installed on the remote Apache Tomcat server. These files should be removed as they may help an attacker uncover information about the remote Tomcat install or host itself.
See Also
https://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q6
https://www.owasp.org/index.php/Securing_tomcat
Solution
Delete the default index page and remove the example JSP and servlets. Follow the Tomcat or OWASP instructions to replace or modify the default error page.
Risk Factor
Medium
CVSS v3.0 Base Score
7.3 (CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L)
CVSS Base Score
6.8 (CVSS2#AV:N/AC:M/Au:N/C:P/I:P/A:P)
References
XREF CWE:20
XREF CWE:74
XREF CWE:79
XREF CWE:442
XREF CWE:629
XREF CWE:711
XREF CWE:712
XREF CWE:722
XREF CWE:725
XREF CWE:750
XREF CWE:751
XREF CWE:800
XREF CWE:801
XREF CWE:809
XREF CWE:811
XREF CWE:864
XREF CWE:900
XREF CWE:928
XREF CWE:931
XREF CWE:990
Plugin Information:
Published: 2004/03/02, Modified: 2018/01/30
Plugin Output
tcp/8983
The following default files were found :
/nessus-check/default-404-error-page.html
【問題分析】
原因是tomcat默認的404頁面帶了tomcat的版本號,被Nessus掃描工具認定為中危漏洞。只需將該頁面的tomcat版本號去除即可。
【解決方法】
參照 https://blog.csdn.net/damaolly/article/details/73927938
替換404頁面為自定義的404頁面,去除tomcat版本號即可。
1、在web.xml中增加error-page的配置
2、自定義solr_error_page.html頁面,頁面中不要存放tomcat版本號。
(2019-06-12 更新)由於Nessus掃描庫升級,規則變更,導致該自定義頁面solr_error_page.html又被掃描出來了,因此乾脆將該頁面修改為最簡模式,如下:
3、將自定義solr_error_page.html頁面放置在如下web應用目錄和ROOT下。
4、重啟tomcat服務方可生效。