這個問題中「內核」這個詞過於籠統。對於當前的通用計算機系統的來說內核一般只做資源管理調度、進程間通信、驅動服務等工作,不做具體的工作內容。或者說內核在初始化後就將使用者的權利逐漸交給了用戶進程,自己則進入一種服務提供的狀態,這時候用戶系統通過計算機做任何具體操作都要通過用戶層程序和內核進行溝通(以系統調用為主),來在內核的特權幫助下完成操作。

但是你說內核自己能不能幹你通過用戶層做的那些事?理論上當然是完全沒有問題的。通用計算機的內核只是在完成自己的初始化後就把交互權給了用戶了,它完全也可以在設計時不提供交互,而是在初始化自己後自己直接用內核級別的線程/進程繼續執行具體的操作。很多不需要交互的專用設備上的系統就是這樣設計的,可以讓設備上就跑一個內核,內核中提供必要的內存管理和進程調度等,以及定向的驅動,然後就在內核中用一到多個任務來做定向的工作。有的提供必要的輸入介面,讓系統內核做定向的事情的同時接受輸入,改變參數和指令後繼續工作。

其實這對於電子類專業畢業的學生或從業者來說非常常見(鄙人也是電子專業畢業的)。因為他們就是經常面對著裸板,上面沒有任何操作系統。而他們面對的需求也往往是定向性的,比如驅動各感測器做數據採集,數據的處理,節點間必要的通信,控制點的控制,等等。這些任務往往在一到多個節點上完成,每一個節點是一個獨立的電路,上面可能跑一個單循環任務的內核程序。也可能跑著多任務的內核程序。舉個簡單的例子,比如將一個特定設備的系統分成三個主要工作:多個感測器的數據採集,數據的計算,以及不同控制信號的發出。這就形成一個簡單的帶輸入輸出的控制系統,這個系統的內核並不需要龐大的通用計算機內核,因為硬體資源不足以跑複雜的內核程序,內存大小連應付複雜內核的調用棧都不夠。所以這就需要定製化的內核程序,提供簡單的進程(甚至進程都提供不了只能有線程,因為做不到進程隔離)調度等,需不需要文件系統也看情況,然後內核只創建幾個必要的進程/線程,並執行已經設計好的程序。如負責數據採集的進程/線程就負責通過感測器進程做數據採集,將採集來的數據以預定的形式(如緩衝隊列)存儲,在等待感測器IO期間可以調度其它程序,如數據處理程序,對數據進行計算,並將結果分給負責控制的進程,控制進程等到信號後就根據計算結果發出控制。這一系列任務都是在一個非常小的內核內完成,非常適合定製化的特定系統。

所以內核能不能讓計算機工作,答案當然是能的。這就好比問沒有了馬龍他們,只有那個不會打球的「胖子」教練,中國乒乓球會被怎樣對待?不好意思,用趙本山老師的話講就是「雖然你大媽已經不是你原來的大媽了,但是你大爺還是你大爺。」同理,內核不做的事情不代表它不能做。內核能做什麼,完全看你設計讓它做什麼。


如果明確限定了不能安裝新的軟體的話(比如這台設備性能不行、儲存空間不夠等),那一般會選擇直接改內核,把自己想要的功能寫成內核啟動後的一段代碼,然後直接把改過的內核刷進設備里。畢竟,正常尺寸的內核裡面一般已經實現了

  1. 基本的任務調度能力
  2. 基本的內存管理能力
  3. 文件系統相關驅動與API介面
  4. 網路IO相關驅動與API介面

有了這幾大項之後這台設備已經能勝任很多簡單的任務了,比如在自己家地下室用單片機做溫控釀葡萄酒、在家裡搭一個內網防火牆/DHCP伺服器之類的。

如果嫌棄這個設備獃頭獃腦沒有人機交互的話,也可以自己用C語言擼一個簡單的shell。在有內核的情況下鍵盤USB驅動應該已經可用了,移植一個glibc或者靜態編譯一套glibc進去的話getc函數也可以用,基礎知識夠硬的話應該能在一兩個小時內做到「按A鍵亮綠燈、按B鍵亮紅燈」之類的簡單交互,再想要更複雜的能力就要自己潛心敲代碼了。


Linux 的話,只有內核,會甩出一個特殊的內核崩潰錯誤。

Linux 必須有一個 init 進程,當然這個進程幹啥無所謂,哪怕只有一個 for 循環。那是程序的事情不是內核的事情。

反正必須是 pid = 1 ,而且不能退出。


如果沒有安裝殼子座位輪子方向盤。。。只安裝了發動機的汽車

會被怎樣使用?

——供起來擺那讓人讚美唄:動力好強啊,外形好酷啊,一點都不胖真的好骨感啊!


連上終端,一切好說,

沒有終端,那就只能觀賞了.


可以用來放乾電池電量吧


用啥呀,沒法用。

滑鼠無法使用,硬碟無法讀取,網卡沒有驅動無法聯網。

那感覺就像你去飯館吃飯問老闆有沒有醬油,老闆給你一把黃豆讓你自己發酵。運氣好半年之後就有醬油了


推薦閱讀:
相关文章