第一次看見操作系統源代碼時是什麼感受?
01-12
題主大一汪。C語言課,教員給我們看了一下Linux的源代碼。瞬間獃滯,「我**你個**的,怎麼回事,這特么什麼玩意兒啊?好歹勞資也把C學得個八九不離十,啥看不懂。 」題主心裡那個無奈啊╭(°A°`)╮
下面有我自己的回答 和聽VOA差不多吧,不管常速、慢速反正就是聽不懂。你說:「哎!這個我會!」然而連在一起什麼又不會了。 源碼亦然,一看「唉?這個地方我能看懂。」,在仔細一看「哎,卧槽,這什麼鬼東東啊!」大家回答都比較專業,有木有通俗易懂一點的?或者抖個機靈也行啊
在Solaris kernel組工作了三年 每次做點新東西看到新的模塊的代碼都覺得是另一個次元的東西。。
寫的真爛,什麼玩意啊,這麼多 goto, 注釋呢,變數名怎麼這麼不規範。
我在接觸到Windows的代碼那一刻就明白了,根本不會有人去看代碼的,網上說什麼【可以靠【使用能拿到代碼的操作系統】來提高編程水平】的都是謠言。
小學五年級的時候第一次聽說Linux,跑到一個地方花攢下來的錢去借用別人的電腦下載Linux 2.4的代碼,然後跑到列印社妄圖列印出來看。然而那個時候家裡並沒有電腦。後來才知道,要是真全部列印出來,我又沒那麼多錢。於是列印了什麼Readme,Makefile之流,也花了好多錢……依然記得因為換行符的問題,發現記事本不換行……要用寫字板。匿了,是因為家庭條件所限,地域所限。轉眼十二年過去了,我也在所三流學校CS畢業。然並卵。現在開始慢慢補自己欠下的技術債,期望自己達到自己對自己最初的願景。好在當下是一個好的時代,你能獲取到幾乎任何你想獲取到的東西,唯一需要做的是自己不要浮躁。(最後一段與題目無干)
第一次碰Pintos的時候沒覺得特別難. 不過只看了作業要求的那幾個點, 還是第一期的作業, 都不複雜.第一次碰linuxkernel的時候真是有點兒驚. 從完全無從下手到修好一個實際的bug被upstream merge用了半年時間... 算是資質比較差的了...我第一段讀懂的linux代碼是x86下處理page fault的代碼, 如果你想學, 也可以從這裡入手.: Linux/arch/x86/mm/fault.c後來我又看了zbuddy/zswap/efi/pstore相關的代碼, 然後後來我轉行做獵頭去了.
鑒於這個是內核相關的問題, 我貼個簡短的硬廣:
招KVM內核態開發, 熟悉KVM/storage/net 之一的優先.好歹勞資也把C學得個八九不離十,啥看不懂。
大型工程會構建自己的領域特異工具。對於C語言這種,會大量使用宏。你直接看到的是人家包了不知道多少層的東西。
而且C語言的課程肯定不會教所有的東西,比如__attribute()什麼的。另外,Linux代碼高度依賴於GCC,會使用GCC的獨有擴展。第一次看操作系統是Dos,翻開書是反彙編後加註釋那種,心裡有一萬頭草泥馬奔過。
第一次看正經的操作系統源碼是 Linux kernel,感覺是 ## 真好使呀,以及在書上看源碼真不合適。《linux系統源代碼情景分析》序言上的話: 」廊腰縵回,檐牙高啄;各抱地勢,鉤心鬥角。盤盤焉,囷囷焉,蜂房水渦,矗不知乎幾千萬落。長橋卧波,未云何龍?復道行空,不霽何虹?高低冥迷,不知西東『』。Linus的話:read the fuck code!
我的話:WTK!
第一次看操作系統代碼的時候,不是Linux,而是FreeRTOS的代碼,所以比較簡單,而且使用的處理器也是我熟悉的,有一種感覺:原來這玩意是這麼實現的!!!!那個時候,我想起老師的一句話:這個世界上沒有黑魔法。
學完譚浩強的c,覺得學得還可以了,然後去看ucosii代碼,心裡草泥馬在奔騰,覺得自己什麼都不會。再去學c programming language ,結果什麼typedef,#include繞到你暈到不行。最後再去看linux的一堆庫文件,然後你會發現自己,你連c都沒學懂。我想說的是,看懂瞭然並卵,你還是不會編程。唯一的途徑就是多敲代碼,沒有任何捷徑
看μC/OS-II的時候覺得那些代碼都很順理成章,沒有太多疑問。某一天終於開始要編譯Linux內核了,想弄明白第一個命令:
make ARCH=arm CROSS_COMPILE=xxxxx XXX_defconfig
Linux內核源碼也是挺煩的,太多typedef要跳來跳去,找好久才能找到它最初的樣子,稍微看了一點就不想看了 (╯‵□′)╯︵┻━┻ 第一次看到安卓代碼,當時還是2.3時代,看的是cm的代碼,第一印象就是「大」,一個分支7個G(現在20多個G就不談了)。裡面也就二十來個文件夾,不知從何下手,也不知道每個都是幹啥的。
接觸過安卓的都知道它的架構分幾個層,層層依賴,可是在目錄結構里除了有個叫frameworks的跟framework名字挺像以外完全沒有體現啊,之後很長時間就是漫無目的地在各個文件夾中跳來跳去,只能根據用什麼語言寫的來大概判斷屬於哪一層,也沒啥進展。
真正讓我跨出第一步的是一篇博客,教大家怎麼從內核添加並實現一個驅動,然後在library層加入調用介面,再在framework層通過jni調用,並為應用層提供API,然後在應用層調用進行io操作。這是一個自底向上完全打通所有層次的例子。 看到這個例子我興奮不已,模仿他的方式想添加一個系統調用打通所有層次,用同樣的方式讓應用層去使用這個系統調用。花了很多天時間,終於……失敗了。。在library這一層斷掉了,怎麼也調不起來。至今兩年過去了,沒有再去動它,就讓這個失敗的作品靜靜地躺在硬碟的某個角落吧。。 不過這段經歷也讓我大致了解了這些代碼都是幹啥用的,也學會自己去看代碼了,想看哪一部分的代碼也能順藤摸瓜慢慢看了。也慢慢地發現安卓源碼里包含了大量的設計模式,framework里各種面向對象特性溜得飛起,堪稱包羅萬象的代碼範本。當然也發現了一些我覺得非常stupid的代碼(可能是我水平太渣還認識不到這麼做的意義。嗯,一定是這樣的。)還有各種吐槽式注釋,谷歌程序員也會賣萌。 最後想說一點,我一直不願意把安卓的kernel稱為linux kernel,因為差別真的很大……我在水平不夠的情況下去看Linux源碼。
發現一個函數沒有說明有什麼用,名字也看不出來有什麼用,然後我就跳進去看看實現源碼,但源碼中也有沒注釋的函數,我又跳進去看。就這麼跳了五六層,我已經忘了我是來幹嘛的了。看懂某個函數等到要改的時候,會發現,媽蛋,這函數什麼時候被誰調用的?!!立馬就無從下手了…基於機制與策略分離,我覺得與面向對象的介面和實現很像,很多文件就是實現了某些關鍵結構體里的函數指針。機制會在事件發生的時候通過函數指針調用具體函數(策略)。
第一次看的是ucsii,一看這是啥玩意,看完ppt在看,原來就這玩意。
看不懂的源碼,都是寫代碼的人的鍋,各種縮寫,目的就是為了讓你看不懂。好像看了五分鐘左右就關了
最近也在學習系統方面的知識,不過不是linux是ucos。可能是ucos比較簡單的原因,很多源碼也不是很費解。個人覺得從應用層面來講會調用介面,理解工作方式,可以針對硬體作適當裁剪即可。
如果難寫,就要難讀。不然那麼容易讓你逆了抄代碼啊。。。
第一次看ucosii,大二,覺得簡單易懂啊。之後看Linux內核代碼,呵呵噠,目前還沒入門
第一次看Windows wrk發現注釋寫的好有個鳥用,依舊看不懂
推薦閱讀:
※你有過什麼樣的被科技震撼的經歷?
※你QQ的第一個昵稱叫什麼?
※你拍過的最好看的證件照是哪張?
※有哪些外國樂隊名字幾乎無法翻譯為漢語,即使勉強翻譯過來也失去了原文中的含義?
※IT 男一般上些什麼網站?