2009年6月19日 星期五

Linux Interrupt

在嵌入式課時也做到了關於OS上課時常講到的關於中斷的實驗。
在這裡也介紹一下實作的部份給
大家!


linux下,系統初始的時候,會呼叫init_IRQ()IDT設置完畢,即把中斷向量做好配置,然而裡面對應的中斷服務仍然是空的,直到硬體呼叫request_irq(), 才正式向系統登記中斷處理程式。

這次實驗目的是要觀察中斷初始的動作,以及觀察向系統登記的中斷處理程式,並練習修改中斷處理程式的內容。


系統的初始: Target的原始碼的init/main.c start_kernel函式中加入一個printk指令。(Linux Host/usr/src/creator/pxa270/linux/init/main.c)


/*Modify*/
printk(“Initialize IRQ”);
/*Modify*/
init_IRQ();

也在將要觀察的驅動程式的request_irq之前,加入一個printk,這裡觀察的是位在creator-pxa270-lcd.c的函式_7segment_timer_operation中。(Linux Host的/usr/src/creator/pxa270/linux/drivers/char/creator-pxa270-lcd.c)

/*Modify*/
printk(“request IRQ: %d\n”, INT_NO);
/*Modify*/
result = request_irq(INT_NO, _7segment_timer_irq, SA_INTERRUPT, g_7_segment_timer_id, NULL);
加入驅動程式,編譯核心後可以看到結果如下:








中斷事件處理函式
: request_irq的呼叫,可以看到登記的handler_7segment_timer_irq,當登記的IRQ被觸發的時候,系統會找到這個handler做對應的動作。這個handler也是寫在driver裡面,

,對照版子提供的資訊,發現IRG0是對應七段顯示器顯示的暫存器,再看細部handler的內容,應該是在每次事件觸發的時候,來顯示不同的七段顯示器,讓它從肉眼看起來像同時顯示。


中斷處理所登記的
IRQ和硬體有關,所以要新增一個中斷必須要有硬體和軟體的支援。現在利用剛才註冊的中斷,抽換掉處理的函式,藉此觀察中斷處理函式該如何寫。

新增一個中斷處理函式,如下
static irqreturn_t
timer_led_irq ( int iqr, void *dev_id, struct pt_regs *regs)
{
scan_led++;
IO_REG2 = scan_led | 0xfe;
return (IRQ_HANDLED);
}

並修改剛才看到的request_irq,如下
result = request_irq(INT_NO, timer_led_irq, SA_INTERRUPT, g_7_segment_timer_id, NULL);

重新編譯核心,然後將kernel下載到板子上,可以看到改為由LED跳動,而不是七段顯示器。



這學期正好修了嵌入式,感覺映證了滿多OS上課內容。或許以後上課可以朝這方向來實施。


參考文獻:
Creator PreSOCes Development Kit
Interrupt and Exception slice by NTHU EOS lab
Linux for creator-XSacle-PXA270 User Guide
RT-952-033-14_Creator_LCD_Device_Driver.pdf
Linux Interrupt

2009年6月18日 星期四

給老師的OS學期末心得

大家都說這學期OSII更難了,其實我是連上學期的OS都覺得它很難的人。

給老師敎了兩個學期了,而且也正好是我導師。所以我是真誠的想描述一下我對OS這兩學期的心得。

老師年輕,也很好溝通,願意花時間從講台上走到教室最末端,再走回講台上的人,而且一堂課裡,這行為可能至少兩次以上。這行為代表著老師希望大家都能弄懂,沒有要敷衍了事的上課。


不過在上學期面臨第一次期中考時,我最最最擔心的科目就是OS。


雖然好像每個segment我都有弄懂最後發生了什麼事情,可是整個合起來我就不知道這些,那些到底屬於哪一部份。我發現我以為我課堂上就吸收的東西,其實是殘破的。我只能描述這裡老師最最強調的部份,可是我不知道這是屬於哪裏,從哪裡來之後又到哪裡去。

可能OS基本上就是個抽象的東西,可是第一次期中考就在我自己詳讀課本後,還是得到了不錯的成績。 可是這沒代表任何東西,我覺得自己依舊不懂OS。

OSII時更嚴重了,老實說每次小考我都不知道要讀哪裡,就單憑上課記憶去考。寫出來的答案也是"卡位",這種寫的出來,可是我卻不太了解的答案。讀期末考時我翻開我上課筆記,零零落落的隻字片語,那些我曾經以為我已經了解的東西我卻全部串不起來。




我陷入了慌張而拿出了考古題,這代表著我輸了。




看到這裡老師也別太喪氣了,老師的教學經歷還算剛起步而已,一定是還有很大的空間去作到更好。



本來都不想說些什麼,因為我有時候還是覺得一個用功的學生該想說老師當然不可能敎給你全部,要自行研讀。不過我相信老師也希望上課可以達到最好的效果,大家都會覺得上了課就能立刻吸收,上課花的時間是值得的。

所以以下是我的建議:

(i) 我滿希望老師可以調整好自己的投影片的,老師的投影片是融合了很多老師的教學內容,或許這樣是更廣泛沒錯,可是我覺得教學的時候,投影片其實是很重要的,就像我們Demonstration時一樣,內容要敘述的確都是相同的東西,但是必須要以適合自己口述的方法來撰寫投影片。不然總覺得投影片跟上課內容沒有做成一個有效的搭配。在自行複習時也更困難了。
還有我希望投影片可以將老師上課習慣跳過覺得不重要的東西刪除。上課時老師常常說這頁畫X,如果這部份可以避免掉的話,上課講義整體才會變成一個完整好閱讀的東西。
我希望老師可以花工夫自行撰寫整理適合自己教學的投影片,工欲善其事,必先利其器。

(ii)老師也知道我算比較常發問問題的,其實我問問題跟讀書也都是掌握幾個重點。正好等於英文的疑問句,4W1H,也就是where when what why 以及how。

where介紹一下他的來龍去脈,或是它在作業系統裡是屬於那一部門,
when是屬於什麼時候科技下的新產物,
what它是什麼,
why目的(這點我覺得最重要的),
how怎麼做到。

其實我上課常聽到的都是how,以及what。可是我總是不知道why,where,when
我想知道那是屬於多古老的東西,現在還適用嗎?它在作業系統掌控著哪些,屬於什麼樣的地位。
why!為什麼要敎這個,為什麼我要學這個,我要用在哪裡,未來我會遇到什麼問題是需要這個嘗試去作到的。這些都是我更想從OS這堂課中學到的。

(iii)實習課的作業應該都要檢討。檢討會出現怎樣的問題,或許我出現過我解決了,可是他沒出現過,所以他不知道怎麼解決,有什麼更好的辦法,或是這次作業的目的是什麼,在OS裡它能幫助我們什麼。為什麼我們要好好寫這份作業。


where:OSblog,屬於OS作業的一部份。
when:一點十七分。
what:作業應該要有的其中一篇文章。
why: 為什麼我要寫這一篇文章呢?因為我每寫一篇文章就在想為什麼要出這份OSblog作業,在打了九篇文章後,我就發現我一直都寫錯了。老師想看的不過只是我這一篇"散文"。真正的散文。
how:認真的回想每一次上課,還有我所遇到的困難,透過文字告訴老師。

2009年6月9日 星期二

介紹Easyvmx

本學期OS作業幾乎都是用虛擬器作的,所以介紹一個免費的虛擬工具給大家使用。

vmware player這是vmware 出的一個免費虛擬工具。簡單來說就是在你的電腦內虛擬出另一部電腦出來。

easyvmx
vmware player 需要一個vmx 檔去建立一個虛擬機器,但vmplayer 本身沒有這個建立vmx 檔的功能。所以我們用一個免費的網上工具去建立一個vmx 檔。

官網:
http://www.easyvmx.com/easyvmx.shtml

2009年6月8日 星期一

make menuconfig


之前在做OS實驗跟嵌入式時,為了編譯核心有用到make menuconfig。
雖然大家都照著投影片做,不過我認為編譯核心應該要懂得一些技巧。
所以就找了些資料分享給大家!



















「 [ ] 」(excludes)表示該選項沒有被選取,編譯後的 kernel 將不會有此功能。

「 < > 」(module capable)
表示該選項沒有被選取,而且是可以被當做是 module,可以
在開機之後另外載入的。

「 [*] 」(built-in)表示該選項有被選取,編譯後的 kernel 包含此功能,而且該功
能會被編入 kernel image 中,這意味著在 kernel 被載入時該功能就已經存在,有些功
能是一定要在 kernel 被載入時就存在的,例如讀取 filesystem,因為 kernel 無法從
它認不出的 filesystem 裡讀取檔案。雖然將各能選成內建可以將整個 kernel 的功能包
成一個 kernel image 檔,但它也會造成執行時一些不必要的記憶體以及初始化時間的浪
費。

<M> 」(module)
表示該選項有被選取,而且是被編譯成 module 的形式,它會存放 在 filesystem中,並在 kernel 被載入後才動態地載入。編譯成 module 的優點是減少 kernel image 的空間、加快開機時間,以及方便開發 kernel 功能,因為 module 是在 開機後才被載入,每次修改該功能時只需要重新編譯並載入 module ,而不需要重新編譯 整個 kernel 並且重新開機。

知道這些技巧後,我們在編譯核心時就不會浪費多餘的資源了!

2009年6月7日 星期日

Linux Timer實驗



計時器的中斷處理處理程式會呼叫,更新系統時間還有計算平均負載,也根據時間的推移,更新目前
執行程序的剩餘時間,以及對系統內部設定的軟體計時器更新,還有統計關於系統的數據工作。

然而計時器中斷本身屬於高優先權以及高頻率的中斷,不可能放任中斷做完這所有的工作才會重新啟用中斷,所以計時器的中斷分成兩部分,
top half和bottom half。
top half會完成計時數據的更新,而剩下相關工作就交給bottom half,使用softirq的機制來處理。

為了驗證top half和bottom half的分段,我做了一個小實驗.在下載的linux source code裡有一個
init/main.c裡面有一個start_kernel函式中,先寫一個printk的指令如下




現在,為了驗證top halfbottom half的分段,在/linux/kernel/timer.c宣告兩個新變數。




th_vs_bh,是用來計算bottom half發生的時間相對於top half經歷了多少次。 hehe是用來當作flag,避免系統不停地印出訊息,因為就算是bottom half,也因為是計時器的關係會頻率很高。為了在top half都會被計數到,在do_timer的函式加入


接下來為了在bottom half可以做比較,在run_timer_softirq加入




這樣每次執行top halfth_vs_bh會被遞增,然後執行到bottom half會重新計算,剛好可以計算經歷過多少top half,這個bottom half才會被執行

編譯完核心執行結果如下







這樣就可以真正的看到top-half與bottom-half的處理頻率。

2009年4月6日 星期一

這就是撐腰!!

老師上次上課問我撐腰是什麼阿?

就是這個啦!!下次有機會就敎你阿~~~

而且是撐腰不是靠背!!!要記住喔!


2009年3月25日 星期三

美國電話電報公司(AT&T Corporation)

講到作業系統的演變史時,總是聽到AT&T。
我想這個也算是指標性的一個術語,所以就上網查一查!


AT&T其實就是與作業系統淵源甚深的一家公司。

UNIX 作業系統最早在 1969 年由 AT&T 貝爾實驗室發展出來,.................(to be continued)

如果想知道UNIX接著下來的發展淵源
可以參考
網路農夫

2009年3月9日 星期一

GDB

教授都說成是功力是其次,但是身為工程師一定要有好的debug能力!
所以OS也敎了GDB,雖然現在還不習慣可是藉著每次作業的強迫演練,希望自己能快點熟練這個
設計良好的debugger。

何謂
GDB?
GNU Debugger,它是GNU軟體系統中的標準偵錯器,具有移攜性的偵錯器。
http://en.wikipedia.org/wiki/Gdb

如果你想深入研究可以參見
GDB官網

你想熟悉指令的話可以常查閱使用
http://www.oreilly.com.tw/sample_chap/a011_06.pdf

CMake

OS上課時常常講到什麼什麼什麼能不能跨平台。
對跨平台感到有點抽象的我,也找到一點資料分享給大家!!


何謂CMake?
為一個跨平台的自動化建構系統。
http://zh.wikipedia.org/wiki/CMake

你可以先了解何謂跨平台


CMake官網 提供下載

參考資料: 貓也會的CMake
http://jserv.sayya.org/cmake/cmake-overview.pdf

2009年3月6日 星期五

Netbeans與javaCC套件的plugin

何謂Netbeans?
Netbeans為一個可擴展的開發平台,支援Java,C/C++等語言。
http://zh.wikipedia.org/wiki/NetBeans
何謂JavaCC?
Java Compiler Compiler為一個解析器生成器工具。
http://en.wikipedia.org/wiki/Javacc

是否能在Netbeans上使用javaCC套件?
可以,參照下連結教學
http://appsrv.cse.cuhk.edu.hk/~csc3120/tutorial/t2-JavaCC-notes.pdf