家電維修班,手機維修班,電腦維修班,電工班,焊工班,液晶電視維修班,電動工具維修班、電動車摩托車維修班、網絡營銷培訓、網站設計培訓、淘寶培訓---全國招生 家電維修班,手機維修班,電腦維修班,電工班,焊工班,液晶電視維修班,電動工具維修班、電動車摩托車維修班、網絡營銷培訓、網站設計培訓、淘寶培訓---全國招生

国产精品久久久久久吹潮-国产精品久久久久久久成人午夜-国产精品久久久久久久久久妇女-国产精品久久久久久久久免费观看-一级看片免费视频-一级看片免费视频囗交

您的位置:網站首頁 > 電器維修資料網 > 正文 >

Linux內核的工作原理

★★★★★【文章導讀】:Linux內核的工作原理具體內容是:牛津字典中對"kernel"一詞的定義是:"較軟的、通常是一個堅果可食用的部分。"當然還有第二種定義:"某個東西核心或者 重要的部分。"對linux來說,它的kernel無疑屬于第二種解釋。讓我們來看看這個重要的東西是如何工…

來源: 日期:2013-11-27 21:58:34 人氣:標簽:

Linux內核的工作原理

    牛津字典中對"kernel"一詞的定義是:"較軟的、通常是一個堅果可食用的部分。"當然還有第二種定義:"某個東西核心或者 重要的部分。"對linux來說,它的kernel無疑屬于第二種解釋。讓我們來看看這個重要的東西是如何工作的,先從一點理論說起。

      廣義地來說kernel就是一個軟件,它在硬件和運行在計算機(電腦)上的應用程序之間提供了一個層。嚴格點從計算機(電腦)科學的角度來說,linux中的kernel指的是linus torvalds在90年代初期寫的那點代碼。

      所有的你在linux各版本中看到的其他東西--bash shell、kde窗口管理器、web瀏覽器、x服務器、tux racer以及所有的其他,都不過是運行在linux上的應用而已,而不是操作系統自身的一部分。為了給大家一個更加直觀的感覺,我來舉個例子,比如rhel5的安裝大概要占據2.5gb的硬盤(硬碟hdd存儲媒介之一)空間(具體多大當然視你的選擇安裝來定),在這其中,kernel以及它的各個模塊組件,只有47mb,所占比例約為2%。

      那么kernel到底是如何工作的呢?如下面的圖表。kernel通過許多的進入端口也就是我們從技術角度所說的系統調用,來使得運行在它上面的應用程序可用。kernel使用的系統調用比如"讀"和"寫"來提供你硬件的抽象(abstraction)。



      從程序員的視角來看,這些看起來只是普通的功能調用,然而實際上系統調用在處理器的操作模式上,從用戶空間到kernel空間有一個明顯的切換。同時,系統調用提供了一個"linux虛擬機",可以被認為是對硬件的抽象。

      kernel提供的更明顯的抽象之一是文件系統。舉例來說,這里有一段短的程序是用c寫的,它打開了一個文件并將內容拷貝到標準的輸出:

#include <fcntl.h>
int main()
{
    int fd, count; char buf[1000];
    fd=open("mydata", o_rdonly);
    count = read(fd, buf, 1000);
    write(1, buf, count);
    close(fd);
}

    在這里,你可以看到四個系統調用的例子:打開、讀、寫和關閉。不談這段程序語法的細節,重點是:通過這些系統調用linux kernel提供了一個文件的"錯覺",而實際上它不過是一堆數據有了個名字,這樣一來你就不必去與硬件底層的堆棧、分區、頭和指針、分區等交涉了,而是直接以例子中的方式與硬件"交流",這也就是我們所說的抽象(abstraction),將底層的東西以更易懂的方式表達出來。

      系統文件是kernel提供的較為明顯的一種抽象。還有一些特性不是這么的明顯,比如進程調度。任何一個時間,都可能有好幾個進程或者程序等待著運行。kernel的時間調度給每個進程分配cpu時間,所以就一段時間內來說,我們會有種錯覺:電腦(計算機(電腦))同一時間運行好幾個程序。這是另外一個c程序:

#include <stdlib.h>
main()
{
  if (fork()) {
    write(1, "parent\n", 7);
    wait(0);
    exit(0);
  }
  else {
    write(1, "child\n", 6);
    exit(0);
  }
}
   
      在這個程序中創建了一個新進程,而原來的進程(父進程)和新進程(子進程)都編寫了標準輸出然后結束。注意系統調用fork(), exit() 以及 wait()執行程序的創建、結束和各自同步。這是進程管理和調度中 典型的簡單調用。

      kernel還有一個更加不易見到的功能,連程序員都不易察覺,那就是存儲管理。每個程序運行得都好像它有個自己的地址空間來調用一樣,實際上它跟其他進程一樣共享計算機(電腦)的物理存儲,如果系統運行的存儲過低,它的地址空間甚至會被磁盤的交互區暫時寄用。存儲管理的另外一個方面是防止一個進程訪問其他進程的地址空間--對于多進程操作系統來說這是很必要的一個防范措施。

      kernel同樣還配置網絡鏈接協議比如ip、tcp和udp等,它們在網絡上提供機器對機器(machine-to-machine)和進程對進程(process-to-process)的通信。這里又會造成一種假象,即tcp在兩個進程之間提供了一個固定連接--就好像連接兩個電話的銅線一樣,實際中卻并沒有固定的連接,特殊的引用協議比如ftp、dns和http是通過用戶級程序來實施的,而并非kernel的一部分。

      linux(像之前的unix)在安全方面口碑很好,這是因為kernel跟蹤記錄了每個運行進程的user id和group id,每次當一個應用企圖訪問資源(比如打開一個文件來寫入)的時候,kernel就會核對文件上的訪問許可然后做出允許/禁止的命令。這種訪問控制模式 終對整個linux系統的安全作用很大。

      kernel還提供了一大套模塊的集合,其功能包括如何處理與硬件設備交流的諸多細節、如何從磁盤讀取一個分區、如果從網絡接口卡獲取數據包等。有時我們稱這些為設備驅動。

      模塊化的kernel

      現在我們隊kernel是做什么的已經有了一些了解,讓我們再來簡單看下它的物理組成。早期版本的linux kernel是整體式的,也就是說所有的部件都靜態地連接成一個(很大的)執行文件。

相比較而言,現在的linux kernel是模塊化的:許多功能包含在模塊內,然后動態地載入kernel中。這使得kernel的內核很小,而且在運行kernel時可以不必reboot就能載入和替代模塊。

kernel的內核在boot time時從位于/boot 目錄的一個文件加載進存儲中,通常這個/boot 目錄會被叫做kernelversion,kernelversion與kernel版本有關。(如果你想知道你的kernel版本是什么,運行命令行顯示系統信息-r。)kernel的模塊位于目錄/lib/modules/kernelversion之下,所有的組件都會在kernel安裝時被拷貝。

管理模塊

大部分情況下,linux管理它的模塊不需要你的幫忙,但是如果必要的時候有命令行可以來手動檢查和管理模塊。比如,為了查清楚當前到底哪個模塊在載入kernel。這里有一個輸出的例子:

# lsmod
pcspkr              4224  0
hci_usb            18204  2
psmouse            38920  0
bluetooth          55908  7 rfcomm,l2cap,hci_usb
yenta_socket      27532  5
rsrc_nonstatic    14080  1 yenta_socket
isofs              36284  0

輸出的內容包括:模塊的名字、大小、使用次數和依賴于它的模塊列表。使用次數對防止卸載當前活躍的模塊非常總要。linux只允許使用次數為零的模塊被移除。

你可以使用modprobe來手動加載和卸載模塊,(還有兩個命令行叫做insmod和rmmod,但modprobe更易于使用因為它自動移除了模塊依賴)。比如lsmod的輸出在我們的電腦(計算機(電腦))上顯示了一個名叫isofs的卸載模塊,它的使用次數是零而且沒有依賴模塊,(isofs是一個模塊,它支持cd上使用的iso系統文件格式)這種情況下,kernel會允許我們卸載模塊:

# modprobe -r isofs

現在,isofs不再顯示在ismod的輸出中,kernel由此節省了36,284字節的存儲。如果你放入cd并且讓它自動安裝,kernel將自動重新載入isofs模塊,而且isofs的使用次數增加到1次。如果這時候你還試圖移除模塊,就不會成功了因為它正在被使用:

# modprobe -r isofs
fatal: module isofs is in use.
   
lsmod只是列出了當前被載入的模塊,modprobe則將列出所有可用的模塊,它實際上輸出了/lib/modules/kernelversion目錄下所有的模塊,名單會很長!

實際上,使用modprobe來手動加載一個模塊并不常見,但確實可以通過modprobe命令行來對模塊設置參數,例如:

# modprobe usbcore blinkenlights=1

我們并不是在創建blinkenlights,而是usbcore模塊的實參數。

那么如何知道一個模塊會接受什么參數呢?一個比較好的方法是使用modinfo命令,它列出了關于模塊的種種信息。這里有一個關于模塊snd-hda-intel的例子

# modinfo snd-hda-intel
filename:      /lib/modules/2.6.20-16-generic/kernel/sound/pci/hda/snd-hda-intel.ko
description:    intel hda driver
license:        gpl
srcversion:    a3552b2df3a932d88ffc00c
alias:          pci:v000010ded0000055dsv*sd*bc*sc*i*
alias:          pci:v000010ded0000055csv*sd*bc*sc*i*
depends:        snd-pcm,snd-page-alloc,snd-hda-codec,snd
vermagic:      2.6.20-16-generic smp mod_unload 586
parm:          index:index value for intel hd audio interface. (int)
parm:          id:id string for intel hd audio interface. (charp)
parm:          model:use the given board model. (charp)
parm:          position_fix:fix dma pointer (0 = auto, 1 = none, 2 = posbuf, 3 = fifo size). (int)
parm:          probe_mask:bitmask to probe codecs (default = -1). (int)
parm:          single_cmd:use single command to communicate with codecs (for debugging only). (bool)
parm:          enable_msi:enable message signaled interrupt (msi) (int)
parm:          enable:bool

對我們來說比較有興趣的以"parm"開頭的那些部分:顯示了模塊所接受的參數。這些描述都比較簡明,如果想要更多的信息,那就安裝kernel的源代碼,在類似于/usr/src/kernelversion/documentation的目錄下你會找到。

里面會有一些有趣的東西,比如文件/usr/src/kernelversion/documentation/sound/alsa/alsa-configuration.txt描述的是被許多alsa聲音模塊承認的參數;/usr/src/kernelversion/documentation/kernel-parameters.txt這個文件也很有用。

前幾天在ubuntu論壇有一個例子,說的是如何將參數傳遞到一個模塊(詳見https://help.ubuntu.com/community/hdaintelsoundhowto)。實際上問題的關鍵是snd-hda-intel參數在正確驅動聲音硬件時需要一點操作,而且在boot time加載時會中止。解決方法的一部分是將probe_mask=1選項賦給模塊,如果你是手動加載模塊,你需要輸入:

# modprobe snd-hda-intel probe_mask=1

更有可能,你在文件/etc/modprobe.conf中放置這樣類似的一行:options snd-hda-intel probe_mask=1

這"告訴"modprobe每次在加載snd-hda-intel模塊時包含probe_mask=1選項。現在的有些linux版本將這一信息分離進/etc/modprobe.d下的不同文件中了,而不是放入modprobe.conf中。

/proc系統文件

linux kernel同樣通過/proc系統文件來展示了許多細節。為了說明/proc,我們首先需要擴展我們對于文件的理解。除了認為文件就是存儲在硬盤(硬碟hdd存儲媒介之一)或者cd或者存儲空間上的持久信息之外,我們還應當把它理解為任何可以通過傳統系統調用如:打開、讀、寫、關閉等訪問的信息,當然它也可以被常見的程序訪問。

/proc之下的"文件"完全是kernel虛擬的一個部分,給我們一個視角可以看到kernel內部的數據結構。實際上,許多linux的報告工具均能夠很好地呈現在/proc下的文件中尋到的格式化版本的信息。比如,一列/proc/modules將展示一列當前加載的模塊。

同樣的,/proc/meminfo提供了關于虛擬存儲系統當前狀態的更多細節信息,而類如vmstat的工具則是以一種更加可理解的方式提供了相同的一些信息;/proc/net/arp顯示了系統arp cache的當前內容,從命令行來說,arp -a顯示的也是相同的信息。

尤其有意思的是/proc/sys下的"文件"。/proc/sys/net/ipv4/ip_forward下的設置告訴我們kernel是否將轉發ip數據包,也就是說是否扮演網關的作用。現在,kernel告訴我們這是關閉的:

# cat /proc/sys/net/ipv4/ip_forward
0

當你發現你可以對這些文件寫入的時候,你會覺得更加有意思。繼續舉例來說:

# echo 1 > /proc/sys/net/ipv4/ip_forward

將在運行的kernel中打開ip 轉發(ip forwarding)

除了使用cat和echo來檢查和更正/proc/sys下的設置以外,你也可以使用sysctl命令:

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

這等同于:
# cat /proc/sys/net/ipv4/ip_forward
0

也等同于:
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

還等同于:
# echo 1 > /proc/sys/net/ipv4/ip_forward
   

需要注意的是,以這種方式你所做的設置改變只能影響當前運行的kernel的,當reboot的時候就不再有效。如果想讓設置永久有效,將它們放置在/etc/sysctl.conf文件中。在boot time時,sysctl將自動重新確定它在此文件下找到的任何設置。

/etc/sysctl.conf下的代碼行大概是這樣的:net.ipv4.ip_forward=1

性能調優(performance tuning)

有這樣一個說法:/proc/sys下可寫入的參數孕育了整個linux性能調優的亞文化。我個人覺得這種說法有點過夸,但這里會有幾個你確實很想一試的例子:oracle 10g的安裝說明(www.oracle.com/technology/obe/obe10gdb/install/linuxpreinst/linuxpreinst.htm)要求你設置一組參數,包括:kernel.shmmax=2147483648 這將公用存儲器的大小設置為2gb。(公用存儲器是處理期內的通信機制,允許存儲單元在多個進程的地址空間內同時可用)

ibm 'redpaper'在linux性能和調優方面的說明(www.redbooks.ibm.com/abstracts/redp4285.html)在調教/proc/sys下的參數方面給出了不少建議,包括:vm.swappiness=100 這個參數控制著存儲頁如何被交換到磁盤。

一些參數可以被設置從而提高安全性,如net.ipv4.icmp_echo_ignore_broadcasts=1 它"告訴"kernel不必響應icmp請求,從而使得你的網絡免受類如smurf攻擊之類的拒絕服務器(server網絡資源下載)(denial-of-service)型攻擊。
net.ipv4.conf.all.rp_filter=1 則是"告訴"kernel加強入站過濾(ingress filtering)和出站過濾(egress filtering)
【看看這篇文章在百度的收錄情況】

相關文章

聯系方式

  • 0731-85579057 , 0731-85569651
  • 點擊這里給我發消息點擊這里給我發消息點擊這里給我發消息
網站欄目導航: 培訓課程 手機硬件 手機軟件 綜合維修 學校資訊 考證指南 就業導航 招生指南 教學管理 入學須知 學校圖片 教學大綱 師資力量 學生感言 學校概況 教學實景 手機維修培訓資訊 電腦維修培訓 維修間故事 手機維修培訓 液晶電視維修培訓 家電維修資料網 電器維修資料網 招生地區 刷機教程 家電維修 手機技巧 老版網站 招生平臺網絡工程
友情鏈接: 監控安裝培訓 電動工具維修 家電維修學校 電工培訓學校 液晶電視維修 焊工培訓學校 電工焊工學校 電腦維修學校 家電維修培訓 電腦維修培訓 家裝電工培訓網絡安裝維護 主板維修 液晶顯示器 筆記本電腦維修 電腦組裝維護 電腦硬件維修 電腦維修 電工考證 電工證 裝修電工 水電工 維修電工 電工 焊接技術 電焊工 焊工 電動設備維修 電動工具維修 制冷維修 空調維修 冰箱維修  更多>>
陽光-手機維修教育品牌學校
點擊這里給我發消息 點擊這里給我發消息 點擊這里給我發消息
電工培訓學校 電動車維修學校 摩托車維修學校 摩托車維修培訓 手機維修培訓 家電維修培訓 電腦維修培訓 電動工具維修培訓 液晶電視維修培訓 安防監控培訓 空調維修培訓 網絡營銷培訓 網站設計培訓 淘寶網店培訓 電器維修培訓 家電維修學校 電工培訓 焊工培訓 電工學校 電工培訓學校 電動車維修學校 摩托車維修學校 摩托車維修培訓 手機維修培訓 家電維修培訓 電腦維修培訓 電動工具維修培訓 液晶電視維修培訓 安防監控培訓 空調維修培訓 網絡營銷培訓 網站設計培訓 淘寶網店培訓 電器維修培訓 家電維修學校 電工培訓 焊工培訓 電工學校 電工培訓學校 電動車維修學校 摩托車維修學校 摩托車維修培訓 手機維修培訓 家電維修培訓 電腦維修培訓 電動工具維修培訓 液晶電視維修培訓 安防監控培訓 空調維修培訓 網絡營銷培訓 網站設計培訓 淘寶網店培訓 電器維修培訓 家電維修學校 電工培訓 焊工培訓 電工學校 電工培訓學校 電動車維修學校 摩托車維修學校 摩托車維修培訓 手機維修培訓 家電維修培訓 電腦維修培訓 電動工具維修培訓 液晶電視維修培訓 安防監控培訓 空調維修培訓 網絡營銷培訓 網站設計培訓 淘寶網店培訓 電器維修培訓 家電維修學校 電工培訓 焊工培訓 電工學校
中山市,固原市,銀川市,玉樹,海東,隴南市,酒泉市,張掖市,天水市,金昌市,蘭州市,榆林市,延安市,渭南市,銅川市,阿里,山南,拉薩市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,畢節,銅仁,遵義市,貴陽市,甘孜州,資陽市,達州市,宜賓市,南充市,遂寧市,綿陽市,瀘州市,自貢市,三亞市,崇左市,河池市,玉林市,欽州市,梧州市,柳州市,梅州市,肇慶市,湛江市,佛山市,珠海市,韶關市,湘西州,懷化市,郴州市,張家界市,邵陽市,株洲市,仙桃市,隨州市,荊州市,荊門市,襄樊市,黃石市,駐馬店市,信陽市,南陽市,漯河市,中衛市,石嘴山市,海西,海南藏州,黃南州,海北,甘南,慶陽市,平涼市,武威市,白銀市,嘉峪關市,安康市,漢中市,咸陽市,寶雞市,林芝,日喀則,昌都,迪慶,德宏,大理,西雙版納,紅河州,臨滄市,麗江市,保山市,曲靖市,黔東州,黔西州,安順市,六盤水市,涼山州,阿壩州,雅安市,廣安市,眉山市,內江市,廣元市,德陽市,攀枝花市,成都市,海口市,來賓市,百色市,貴港市,北海市,桂林市,南寧市,云浮市,揭陽市,潮州市,清遠市,陽江市,汕尾市,惠州市,茂名市,江門市,汕頭市,深圳市,廣州市,婁底市,永州市,益陽市,岳陽市,湘潭市,長沙市,恩施州,黃岡市,孝感市,鄂州市,十堰市,武漢市,周口市,商丘市,三門峽市,許昌市,焦作市,安陽市,鶴壁市,平頂山市,開封市,鄭州市,聊城市,濱州市,德州市,萊蕪市,日照市,泰安市,煙臺市,濰坊市,東營市,淄博市,上饒市,濟南市,撫州市,宜春市,贛州市,新余市,九江市,景德鎮市,寧德市,南平市,泉州市,莆田市,廈門市,宣城市,亳州市,六安市,宿州市,黃山市,滁州市,安慶市,淮北市,馬鞍山市,蚌埠市,蕪湖市,合肥市,麗水市,舟山市,衢州市,金華市,湖州市,嘉興市,寧波市,宿遷市,鎮江市,鹽城市,連云港市,蘇州市,徐州市,南京市,綏化市,牡丹江市,佳木斯市,大慶市,鶴崗市,哈爾濱市,白城市,白山市,遼源市,吉林市,葫蘆島市,鐵嶺市,盤錦市,阜新市,錦州市,本溪市,鞍山市,沈陽市,錫林郭勒盟,通遼市,烏海市,呂梁市,忻州市,晉中市,晉城市,陽泉市,太原市,廊坊市,承德市,保定市,邯鄲市,唐山市,寧夏,甘肅省,西藏,貴州省,重慶市,廣西,湖南省,河南省,江西省,安徽省,江蘇省,黑龍江省,遼寧省,山西省,天津市,四平市,內蒙古,吳忠市,果洛,西寧市,定西市,商洛市,西安市,那曲,黔南州,巴中市,樂山市,賀州市,防城港市,東莞市,河源市,常德市,衡陽市,咸寧市,宜昌市,濮陽市,新鄉市,洛陽市,菏澤市,臨沂市,威海市,濟寧市,棗莊市,青島市,吉安市,鷹潭市,萍鄉市,南昌市,龍巖市,漳州市,三明市,福州市,池州市,巢湖市,阜陽市,銅陵市,淮南市,臺州市,紹興市,溫州市,杭州市,泰州市,揚州市,淮安市,南通市,常州市,無錫市,大興安嶺,黑河市,七臺河市,伊春市,雙鴨山市,雞西市,齊齊哈爾市,延邊,松原市,通化市,長春市,朝陽市,遼陽市,營口市,丹東市,撫順市,大連市,阿拉善盟,興安盟,烏蘭察布市,巴彥淖爾市,呼倫貝爾市,鄂爾多斯市,赤峰市,包頭市,呼和浩特市,臨汾市,運城市,朔州市,長治市,大同市,衡水市,滄州市,張家口市,邢臺市,秦皇島市,石家莊市,青海省,陜西省,云南省,四川省,海南省,廣東省,湖北省,山東省,福建省,浙江省,上海市,吉林省,河北省,北京市 主站蜘蛛池模板: 成人在线不卡| 国产高清视频网站| 免费啪视频| 插丝袜| 成人女人a毛片在线看| 国产日本在线观看| 涩涩视频www在线观看入口| 日韩一区二区免费看| 妞干网在线播放| 欧美亚洲综合网| 亚洲一级毛片免费在线观看| xxxwww欧美性| 欧美羞羞视频| 中文字幕丝袜美腿| 一级α片视频| 国产精品2020| 两性色午夜视频自由成熟的性| 亚洲国产一区二区三区青草影视| a天堂v| 永久免费av网站| 99re免费视频| 射射射综合网| 日日爽爽| 欧美一区二区三区综合色视频| 成人网18免费| 中国一级特黄特色真人毛片| 欧美性极品videosbest| 网站免黄| 黄色网址在线视频| 我要看黄色毛片| 日本va视频| 日本韩国免费| 成人看片免费| 欧美日韩视频一区三区二区| 97人洗澡人人澡人人爽人人| 国产成人精品一区二区三区| 欧美成人免费全部观看在线看 | 好吊色青青青国产在线播放| 毛片免费看看| 日韩免费a级在线观看| 婷婷免费在线|