24,IRQ和FIQ有什麼差別,在CPU裡面是是怎麼做的?
答:快速中斷請求(Fast Interrupt Request,FIQ)
中斷控制器去中斷ARM核心,可以選擇fiq和irq兩種方式:
irq發生時,ARM處于irq模式。在irq模式期間,不可以再次被irq中斷打斷,也就是不能嵌套;但是可以被fiq打斷;
fiq發生時,ARM處于fiq模式,在fiq模式期間,不可以再次被fiq中斷打斷,更不可能被irq模式打斷。
在ARM11及以前版本中,一個中斷控制器中隻有一個中斷能被設為fiq ;
綜上所述,兩個差別:
fiq的優先更高一些(跟irq相比);
fiq 的r8 r9 r10 r11 r12寄存器實體上是獨立,進入fiq保護現場時,少保護這幾個寄存器(我拷,這能節約多少時間?)
另外,linux直接沒有用到ARM的fiq.
25,中斷的上半部分和下半部分的問題:講下分成上半部分和下半部分的原因,為何要分?講下如何實作?
答:上半部分執行與硬體相關的處理要求快, 而有些驅動在中斷處理程式中又需要完成大量工作,這構成沖突,是以Linux有所謂的bottom half機制,中斷處理程式中所有不要求立即完成的,在開中斷的環境下,由底半程式随後完成.
Linux的底半處理實際上是建立在核心的軟中斷機制上的.
Linux 的底半 機制主要有Tasklet 和 work queue 以及 softirq ( 2.4核心則有BH , Task queue , softirq , tasklet 沒有work queue),其實底半可以了解成一種工作的延遲。是以實際使用時跟timer機制基本上一個意思。
26,核心函數mmap的實作原理,機制?
答:mmap函數實作把一個檔案映射到一個記憶體區域,進而我們可以像讀寫記憶體一樣讀寫檔案,他比單純調用read/write也要快上許多。在某些時候我們可以把記憶體的内容拷貝到一個檔案中實作記憶體備份,當然,也可以把檔案的内容映射到記憶體來恢複某些服務。另外,mmap實作共享記憶體也是其主要應用之一,mmap系統調用使得程序之間通過映射同一個普通檔案實作共享記憶體。
27,驅動裡面為什麼要有并發、互斥的控制?如何實作?講個例子?
答:并發(concurrency)指的是多個執行單元同時、并行被執行,而并發的執行單元對 共 享資源(硬體資源和軟體上的全局變量、靜态變量等)的通路則很容易導緻競态(race conditions) 。 解決競态問題的途徑是保證對共享資源的互斥通路, 所謂互斥通路就是指一個執行單 元 在通路共享資源的時候,其他的執行單元都被禁止通路。 通路共享資源的代碼區域被稱為臨界區, 臨界區需要以某種互斥機 制加以保護, 中斷屏蔽, 原子操作,自旋鎖,和信号量都是 linux 裝置驅動中可采用的互斥途徑。
28,spinlock自旋鎖是如何實作的?
答:自旋鎖在同一時刻隻能被最多一個核心任務持有,是以一個時刻隻有一個線程允許存在于臨界區中。這點可以應用在多處理機器、或運作在單處理器上的搶占式核心中需要的鎖定服務。
這裡也介紹下信号量的概念,因為它的用法和自旋鎖有相似的地方。linux中的信号量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信号量時,信号量會将其推入等待隊列,然後讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有信号量的程序将信号量釋放後,在等待隊列中的一個任務将被喚醒,進而便可以獲得這個信号量。
29,任務排程的機制?
答:linux程序的排程時機大緻分為兩種情況:
一種是程序自願排程;
另一種是發生強制性排程。
首先,自願的排程随時都可以進行。在核心空間中,程序可以通過schedule()啟動一次排程;在使用者空間中,可以通過系統調用pause()達到同樣的目的。如果要為自願的暫停行為加上時間限制,在核心中使用schedule_time(),而在使用者空間則使用nanosleep()系統調用。
參考:http://www.360doc.com/content/14/1216/10/14855936_433298555.shtml
30,嵌入式linux和wince作業系統的特點和特性?
答:支援多種硬體平台,wince差一點;
占有較少的硬體資源,wince對資源的要求更高;
高可定制性,wince做不到;
具有實時處理能力;
具備強大的網絡功能,wince沒有;
高安全性和高可靠性;
具有完善的嵌入式GUI和嵌入式浏覽器;
實作嵌入式日志檔案系統,具備斷電保護能力;
能夠提供完善的開發工具集;
能夠快速啟動。
參考:http://www.elecfans.com/emb/xitong/20111114244549.html
31,嵌入式linux中tty裝置驅動的體系結構?
答:tty這個名稱源于電傳打位元組的簡稱。在linux表示各種終端。終端通常都跟硬體相對應。比如對應于輸入裝置鍵盤滑鼠。輸出裝置顯示器的控制 終端和序列槽終端.也有對應于不存在裝置的pty驅動。在如此衆多的終端模型之中,linux是怎麼将它們統一模組化的呢?這就是我們今天要讨論的問題。
Linux核心中tty的層次結構包含tty核心、tty線路規程和tty驅動;
tty裝置發送資料的流程為:tty核心從一個使用者擷取将要發送給一個tty裝置的資料,tty核心将資料傳遞給tty線路規程驅動,接着資料被傳遞到tty驅動,tty驅動将資料轉換為可以發送給硬體的格式。
接收資料的流程為: 從tty硬體接收到的資料向上交給tty驅動,進入tty線路規程驅動,再進入 tty 核心,在這裡它被一個使用者擷取。盡管大多數時候tty核心和tty之間的資料傳輸會經曆tty線路規程的轉換,但是tty驅動與tty核心之間也可以直接傳輸資料。
參考:http://www.uml.org.cn/embeded/201209071.asp
32,嵌入式裝置,為加快啟動速度,可以做哪些方面的優化?
答:linux預設的安裝核心相當龐大,為了保證系統的相容性和靈活性,支援熱插拔操作,核心啟動時要進行大量的硬體檢測和初始化工作,而嵌入式的硬體都是固定的,隻需要選擇需要的硬體驅動就可以,不需要全部的硬體驅動都檢測;是以可以進行适當的裁剪核心達到縮小啟動linux系統的目的;同時可以統計驅動子產品的耗時時間,對耗時較長的子產品驅動加以分析,優化。
33,USB裝置的枚舉過程?
答:(1) Get Device Descriptor。主機的第一個指令要求得到裝置描述符,此SETUP 包為8 個位元組資料(80,06,00,01,00,00,40,00),發向位址0,端口0。“40”表示傳回資料長度最大為40H 個位元組。實際上,隻傳回一個包,即數組DEV_DESC[ ]中的前8 個位元組,用于說明裝置的描述符的真實長度和裝置的類型。
(2) Set Address。接着是設定裝置位址處理事件,主機發送一個含有指定位址的資料包(00,05,02,00,00,00,00,00),在主機隻有一個USB 裝置的時候,這個位址一般會是2,最大位址127,USB 協定中可以連接配接127 個裝置。設定位址事件處理結束後,裝置進入位址狀态,主機以後會在新的指定位址處通路裝置。
(3) Get Device Descriptor。主機再次發送請求得到裝置描述符的資料包(80,06,00,01,00,00,12,00),與上次不同的是,要求的資料的長度是實際的資料長度,同時是發送到Set Address指令所設定的位址。
(4) 讀取全部Configuration Descriptor。接着主機要求得到裝置全部的配置描述符、接口描述符和節點描述符(80,06,00,02,00,00,40,00),由于主機不知道裝置描述符的真實長度,是以它要求得到64個位元組。
(5) Set Interface,主機發送資料包(01,0B,00,00,00,00,00,00),設定接口值為0。
(6) Set Conifguration,确定USB裝置工作在哪一個配置下。對于U盤裝置來說,一般隻有1個配置值,其值為01。主機發送資料包(00,09,01,00,00,00,00,00)。
(7) 如果以上步驟都正确,主機将找到新裝置,并且配置成功,該裝置可以正常使用,可以進行後續的U盤枚舉過程了。
(8) 用busHound觀察計算機對于U盤的枚舉過程,發現上述步驟後還有一個GetMaxLun的操作,但是實際上對于U盤來說忽略該步驟也沒有問題。
34,PSRAM、SDRAM、DDR、DDR2的時序特性?
答:PSRAM,全稱Pseudo static random access memory。指的是僞靜态随機存儲器。