驱动面试、笔试常见问题
以下內容源于網絡資料的整理學習。
參考博客
https://blog.csdn.net/Mingrenjiuwei/article/details/52878012(推薦)
https://blog.csdn.net/shxcodewarrior/article/details/20122321
https://blog.csdn.net/tainjau/article/details/79430905
https://blog.csdn.net/Cowena/article/details/48706297
?
?
1、linux中內核空間、用戶空間的區別?
Linux系統采取兩級保護機制,對應兩種不同的操作權限,內核空間權限高于用戶空間權限。
內核空間和用戶空間都有屬于自己的虛擬空間。在32位系統中,cpu最高有32位尋址范圍,即對應4G空間,內核空間被劃分在高1G虛擬空間,用戶空間在低3G。
普通應用程序運行在用戶空間,執行一些貼近用戶的低權限操作;系統內核程序、操作硬件的驅動程序等一些要求高級權限的程序運行在內核空間。
用戶空間程序不能直接訪問內核空間的數據,內核空間程序也一樣不能直接訪問屬于用戶進程空間的數據,用戶空間和內核空間之間的通信必須通過一些特定的方法。
2、用戶空間與內核通信方式
常用的也就這幾種:
(1)系統調用。用戶空間進程通過系統調用進入內核空間,訪問指定的內核空間數據。
(2)驅動程序。用戶空間進程可以使用封裝后的系統調用接口訪問驅動設備節點,以和運行在內核空間的驅動程序通信。
(3)proc文件系統。proc文件系統的主要功能是在內核空間提供一套機制為用戶空間方便的查詢,查看,設置內核信息,多用于查詢類操作。
(4)共享內存mmap。在代碼中調用接口,實現內核空間與用戶空間的地址映射,在實時性要求很高的項目中為首選,省去拷貝數據的時間等資源,但缺點是不好控制。
(5)copy_to_user()、copy_from_user(),是在驅動程序中調用接口,實現用戶空間與內核空間的數據拷貝操作,應用于實時性要求不高的項目中。
3、linux中內存劃分及如何使用?虛擬地址及物理地址的概念及彼此之間的轉化?高端內存概念?
(1)內存劃分
以32位機器為例,cpu最大尋址范圍為4G,Linux系統將4G虛擬地址空間劃分為高1G,低3G。
低3G虛擬空間屬于用戶空間,都是經過映射的線性地址,供用戶進程空間使用。
高1G并非都是像用戶空間一樣都是映射過的線性空間,Linux系統將高1G劃分為三部分:DMA區,常規區,高端內存,其中0-896都是映射過的線性空間,剩下的896-1024即高端內存,這段高端內存都是未經過映射的虛擬地址,Linux系統利用這些有限的虛擬地址,臨時動態的映射到大于896M的物理空間地址,實現了利用有限的虛擬地址訪問到物理內存的所有地址。
(2)內存申請函數的對比
malloc用于用戶空間進程申請內存空間,kmallc和vmalloc在內核空間使用。
kmalloc申請到的內存空間,是線性連續的,可以用于dma。
vmalloc申請的內存是邏輯連續的,但是物理地址不連續,常用與申請大的內存,請注意vmalloc可能會睡眠,在中斷、阻塞的環境下不能使用。
(3)內存映射方式
虛擬地址到物理地址的轉化,用戶空間和內和空間采用不同的映射機制。用戶空間的地址映射經過mmu(內存管理單元)管理。而內核空間的虛擬地址到物理地址的映射是一一對應的,例如虛擬空間地址0xc0000004,對應的物理地址空間地址為:0xc0000004 - 0xc0000000 = 0x04,以此類推。(待求證)。
4、inux中中斷的實現機制,tasklet與workqueue的區別及底層實現區別?為什么要區分上半部和下半部?
https://blog.csdn.net/oqqHuTu12345678/article/details/78860065
(1)Linux中斷分為硬件中斷和內部中斷(異常),調用過程:外部中斷產生->發送中斷信號到中斷控制器->通知處理器產生中斷的中斷號,讓其進一步處理。即處理器收到來自中斷控制器的中斷處理請求,保存中斷上下文,跳轉到中斷對應的處理處,(快速完成中斷中斷上半部,中斷上半部返回后執行中斷下半部),中斷處理函數返回時恢復現場。
(2)tasklet和workqueue,兩者都是中斷下半部的一種實現方法。區別在于tasklet屬于中斷上下文,支持smp、不可睡眠和阻塞;workqueue基于線程的封裝,屬于進程上下文,因此支持睡眠、阻塞。
(3)為了能夠在中斷處理過程中被新的中斷打斷,將中斷處理程序一分為二,上半部登記新的中斷,快速處理簡單的任務,剩余復雜耗時的處理留給下半部處理。下半部處理過程中可以被中斷,上半部處理時不可被中斷。
5、Linux的同步機制
常見的同步接口,包括進程同步,信號量,自旋鎖,互斥鎖,條件變量,讀寫鎖。
多進程并發一般考慮使用信號量機制,在線程并發時多采用互斥鎖,條件變量。
(1)條件變量在某些角度就是線程版的信號量實現,因為兩者都是在考慮持有鎖時間較長情況下使用。
(2)互斥鎖,自旋鎖一般都是用在持有鎖時間不會很長的情況下,在自旋鎖有使用意義的前提下,如果持鎖時間會非常短則自旋鎖效率高于互斥鎖(否則應該使用互斥鎖,因為互斥鎖會持續占有cpu資源,不宜過長,而互斥鎖會導致搶不到鎖的線程睡眠,進入等待隊列)。
(3)互斥鎖和自旋鎖都可以用在進程上下文,而在中斷上下文只能使用自旋鎖,因為互斥鎖會睡眠。
(4)使用自旋鎖的進程不能睡眠,使用信號量的進程可以睡眠。
7、/dev/下面的設備文件是怎么創建出來的?
有三種方式:devfs機制、udev機制、手動創建設備節點。
談談個人見解:
devfs機制,從來沒用過,應該是2.6以前的內核使用的;
udev機制,其實就是現在常用的device_create()、class_create()這一套接口,所謂udev是上層用戶空間程序,是基于驅動中創建使用了這兩個接口而起作用的,但是udev在日常開發中幾乎接觸不到,我們只需在驅動中調用創建節點的這兩個API就ok了,剩下的工作就交給udev去做。
mknod ,新手最常用的一種創建設備節點方法,但并非入門后就再沒有用途。在某些情境下,或許有人不想使用udev機制,于是把節點創建工作寫在腳本里,這樣也是無可厚非的。
8、原子操作該怎么理解?
原子操作,就是開始執行到執行結束期間不會被打斷的操作單元。
9、insmod一個驅動模塊,會執行模塊中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過卸載驅動出現異常沒?是什么問題引起的?
分別會執行module_init()、module_exit()指定的init函數和exit函數。
要注意的就是盡量使在init函數中出現的資源申請及使用有對應的釋放操作在exit中,init申請,eixt釋放。
卸載出現的異常?那很稀松平常了,大多數都是資源使用完沒釋放,但是模塊卻卸載了。
10、在驅動調試過程中遇到過oops沒?你是怎么處理的?
遇到過,這種類似的段錯誤其實最好處理,因為它有call trace,根據堆棧信息去代碼里面查看就行了。
如果代碼中看不到明顯低級錯誤,就需要printk聯機調試,然而這種很少。
11、ioctl和unlock_ioctl有什么區別?
ioctl是老的內核版本中的驅動API,unlock_ioctl是當下常用的驅動API。
區別在于ioctl調用前后,使用了大內核鎖,而unlock_ioctl顧名思義就是沒加大內核鎖的新接口,改變的只是驅動調的方法,用戶應用程序調用的接口不變。
大內核鎖是Linux hacker在應付多處理器初期提出的一種鎖,目的在于當一個處理核心在運行內核時,加上大內核鎖,不讓其他cpu核心同時運行內核程序,顯然這樣是有用的,然而這樣大大降低了多處理器的存在意義,于是跟隨時代更迭,大內核鎖被一步一步的剔除,ioctl接口的升級就是典范!我覺得這樣的問題太沒有意義了,對開發有多大用處?
12、驅動中操作物理絕對地址為什么要先ioremap?
ioremp是內核中用來將外設寄存器物理地址映射到主存上去的接口,即將io地址空間映射到虛擬地址空間上去,便于操作。為什么非要映射呢,因為保護模式下的cpu只認虛擬地址,不認物理地址,給它物理地址它并不幫你做事,所以你要操作外設上的寄存器必須先映射到虛擬內存空間,拿著虛擬地址去跟cpu對接,從而操作寄存器。
11、設備驅動模型三個重要成員是?platform總線的匹配規則是?在具體應用上要不要先注冊驅動再注冊設備?有先后順序沒?
(1)總線,設備,驅動。
(2)匹配規則:當有一個新的設備掛起時,總線被喚醒,match函數被調用,用device名字去跟本總線下的所有驅動名字去比較,相反就是用驅動的名字去device鏈表中和所有device的名字比較。如果匹配上,才會調用驅動中的probe函數,否則不調用。
(3)至于先后順序,鑒于個人理解,不會有影響,不管誰先誰后,bus都會完成匹配工作。
(4)談談對Linux設備驅動模型的認識:設備驅動模型的出現主要有三個好處
設備與驅動分離,驅動可移植性增強;
設備驅動抽象結構以總線結構表示,看起來更加清晰明,誰是屬于哪一條bus的;
最后,設備與驅動分離,很好的奠定了熱插拔機制。
12、linux中RCU原理?
rcu是2.6出現的一種讀寫鎖,可以說是老的讀寫鎖的升級版,主要用在鏈表這種數據結構上,經典使用場景是多讀者少寫者的情況,rcu允許多個讀者一個寫者共同操作數據而不必加鎖,這是經典用法,若出現多個寫者時,寫者與寫者之間就得自己手動同步。當要刪除一個節點時,刪除后并不會馬上釋放節點,而是會等待在刪除動作之前已經開始讀該節點的讀者都完成讀操作之后才會釋放此節點,這段時間被稱為寬限期。
13、談談Linux軟中斷?
Linux系統中的軟中斷,是專為一些不是特別要緊的耗時任務而產生的一種機制,多數用在中斷處理過程中,典型應用就是用于中斷下半部,tasklet機制就是基于軟中斷的典型下半部應用。
軟中斷就是結合任務調度、延遲處理等讓守護進程去處理一些不是特別緊急又耗時的任務。
14、linux系統實現原子操作有哪些方法?
答:提到原子操作,我首先想到的是針對整型的原子操作,atomic_t類型,這里面有一整套針對整型的原子操作API可以調用。既然整型能原子操作,那其他也應該可以吧,結合原子操作的定義,要想對其他類型結構實現原子操作,那就加鎖咯,將需要原子操作的部分放在臨界區。
15、linux中系統調用過程?
系統調用,比如open()函數,它并不是真正的系統調用實現函數,其實它只是一個c庫函數。
內部實現做了兩件事,先把系統調用號傳遞給內核,最后拉起一次軟中斷,自此cpu進入內核態運行。
內核在軟中斷向量表中找出對應的中斷類型,根據中斷類型找到對應的軟中斷執行函數,然后執行函數根據系統調用號,在系統調用號表里面找到對應的系統調用函數。
16、談談linux內核的啟動過程(源代碼級)?
首先,內核鏡像自解壓,解壓完之后從head.s開始運行,即引導內核,在內核引導期間將會設置內核參數。
隨后,跳轉到第一個c函數start_kernel(),進入內核啟動階段,在內核啟動過程中進行一些必要的硬件初始化工作。
在內核啟動最后,掛載文件系統,然后創建第一個用戶空間進程,init進程,進一步完成驅動掛載,用戶服務初始化工作。
17、談談Linux調度原理?
Linux將進程按權限分為兩大類,常規進程和實時進程
常規進程對應一種調度算法,實時進程有兩種對應著兩種不同的調度算法。
進程按照狀態又可以分為幾種,常見的狀態有:運行態、可中斷睡眠態、不可中斷睡眠態、停止態。處于運行態的進程根據調度算法接受調度在cpu上運行。
18、談談對Linux網絡子系統的認識?
網絡子系統可以概括描述為
應用程序—》系統調用接口(主要是指socket接口)—》協議無關接口(由socket實現,提供一套通用接口支持不同的協議)—》網絡協議(包括tcp、udp在內的網絡協議)—》設備無關接口(由net_device接口組織的一組通用接口,將網絡協議與各種網絡設備聯系起來)—》設備驅動(即各種網絡設備的驅動程序,負責管理具體的網絡設備)—》網絡設備(具體的網絡硬件設備)。
19、內核中申請內存有哪幾個函數?有什么區別?
常見的三個接口,kmalloc(),vmalloc(),__get_free_pages()。
kmalloc()操作的空間位于直接映射區(即4G空間中的896M區域),申請到空間物理地址多為連續地址,常用于操作頻繁的數據結構,連續地址利于提高訪問效率。
對于一些操作不頻繁的數據結構可以用vmalloc()申請內存,vmalloc()操作的空間優先選擇高端內存,這里申請出的內存物理地址往往不是連續的,所以訪問效率不會很高。
__get_free_pages()操作的區域跟kmalloc()相同,位于直接映射區,不同的是它申請的是物理頁的整倍數大小的內存。
20、談談內核函數mmap的實現機制?
(1)mmap函數,把一個文件映射到一個內存區域,從而我們可以像讀寫內存一樣讀寫文件,其比單純調用read/write要快上許多。在某些時候我們可以把內存的內容拷貝到一個文件中實現內存備份,當然也可以把文件的內容映射到內存來恢復某些服務。
(2)mmap實現共享內存也是其主要應用之一,mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。
21、中斷上半部、下半部的實現理解
(1)當中斷到來時,要完成的工作往往并不會是短小的,它可能要進行較大量的耗時處理。因此中斷處理程序中,不要求立即完成的,可以交由中斷下半部完成。
中斷上半部主要完成盡可能少的、比較緊急的功能,例如簡單地讀取寄存器中的中斷狀態并清除中斷標志后就進行“登記中斷”的工作。頂半部執行的速度就會很快,可以服務更多的中斷請求。
復雜的內容則交由中斷下半部來執行,而且中斷下半部可以被新的中斷打斷,這也是下半部和上半部的最大不同。
當然, 如果中斷比較簡單,就不用區分上下半部。
(2)Linux 系統實現下半部的機制主要有三種:tasklet,workqueue,軟中斷。??
22、tasklet與workqueue的區別及底層實現區別
(1)softirq和tasklet都屬于軟中斷,tasklet是softirq的特殊實現;workqueue是普通的工作隊列。 ?
(2)tasklet和workqueue,兩者都是中斷下半部的一種實現方法。區別在于tasklet屬于中斷上下文,支持smp、不可睡眠和阻塞;workqueue基于線程的封裝,屬于進程上下文,因此支持睡眠、阻塞。
23、軟中斷的理解(與硬件中斷的對比)
軟中斷過程:
(1)當某一軟中斷時間發生后,首先需要設置對應的中斷標記位,觸發中斷事務(raise_softirq()設置軟中斷狀態bitmap,觸發軟中斷事務)。
(2)然后喚醒守護線程去檢測中斷狀態寄存器(在Linux中 軟中斷daemon線程函數為do_softirq())。
(3)如果通過查詢發現某一軟中斷事務發生之后,那么通過軟中斷向量表調用軟中斷服務程序action()。
和硬件中斷的對比:
(1)一個軟中斷不會去搶占另一個軟中斷,只有硬件中斷才可以搶占軟中斷,所以軟中斷能夠保證對時間的嚴格要求。
(2)軟中斷與硬件中斷不同在于,從中斷標記到中斷服務程序的映射過程。
硬件中斷發生之后,CPU需要將硬件中斷請求通過向量表映射成具體的服務程序,這個過程是硬件自 動完成的。
但是軟中斷不是,其需要守護線程去實現這一過程,這也就是軟件模擬的中斷,故稱之為軟中斷。
24、請簡述自旋鎖、信號量兩個概念,及它們的區別。
(1)自旋鎖
自旋鎖是專門為防止多處理器并發而引入的一種鎖,在內核中大量應用于中斷處理等部分。(對于單處理器來說,防止中斷處理中的并發可簡單采用關閉中斷的方式,不需要自旋鎖)。
自旋鎖最多只能被一個內核任務持有,如果一個內核任務試圖請求一個已被爭用(已經被持有)的自旋鎖,那么這個任務就會一直進行忙循環——旋轉——等待鎖重新可用。要是鎖未被爭用,請求它的內核任務便能立刻得到它并且繼續進行。
自旋鎖可以在任何時刻防止多于一個的內核任務同時進入臨界區,因此這種鎖可有效地避免多處理器上并發運行的內核任務競爭共享資源。
自旋鎖的初衷,是在短期間內進行輕量級的鎖定。一個被爭用的自旋鎖使得請求它的線程在等待鎖重新可用的期間進行自旋(特別浪費處理器時間),所以自旋鎖不應該被持有時間過長。如果需要長時間鎖定的話, 最好使用信號量。
因為自旋鎖在同一時刻只能被最多一個內核任務持有,所以一個時刻只有一個線程允許存在于臨界區中。這點很好地滿足了對稱多處理機器需要的鎖定服務。在單處理器上,自旋鎖僅僅當作一個設置內核搶占的開關。如果內核搶占也不存在,那么自旋鎖會在編譯時被完全剔除出內核。
簡單的說,自旋鎖在內核中主要用來防止多處理器中并發訪問臨界區,防止內核搶占造成的競爭。另外自旋鎖不允許任務睡眠(持有自旋鎖的任務睡眠會造成自死鎖——因為睡眠有可能造成持有鎖的內核任務被重新調度,而再次申請自己已持有的鎖),它能夠在中斷上下文中使用。
死鎖:假設有一個或多個內核任務和一個或多個資源,每個內核都在等待其中的一個資源,但所有的資源都已經被占用了。這便會發生所有內核任務都在相互等待,但它們永遠不會釋放已經占有的資源,于是任何內核任務都無法獲得所需要的資源,無法繼續運行,這便意味著死鎖發生了。自死瑣是說自己占有了某個資源,然后自己又申請自己已占有的資源,顯然不可能再獲得該資源,因此就自縛手腳了。
自旋鎖的基本形式如下:
spin_lock(&mr_lock);
//臨界區
spin_unlock(&mr_lock);
(2)信號量
Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有信號量的進程將信號量釋放后,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個信號量。
信號量的睡眠特性,使得信號量適用于鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調度的;另外當代碼持有信號量時,不可以再持有自旋鎖。
信號量基本使用形式為:
static DECLARE_MUTEX(mr_sem);//聲明互斥信號量
if(down_interruptible(&mr_sem))
//可被中斷的睡眠,當信號來到,睡眠的任務被喚醒
//臨界區
up(&mr_sem);
(3)信號量和自旋鎖區別
1、如果代碼需要睡眠(往往發生在和用戶空間同步時),使用信號量是唯一的選擇。由于不受睡眠的限制,使用信號量通常來說更加簡單一些。
2、如果需要在自旋鎖和信號量中作選擇,應該取決于鎖被持有的時間長短。理想情況是所有的鎖都應該盡可能短的被持有,但是如果鎖的持有時間較長的話,使用信號量是更好的選擇。
3、信號量不同于自旋鎖,它不會關閉內核搶占,所以持有信號量的代碼可以被搶占。這意味者信號量不會對影響調度反應時間帶來負面影響。
26、什么是GPIO?
general purpose input/output ,即可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個傳感器上以獲得該傳感器的狀態,這給cpu提供了一個方便的控制周邊設備的途經。
27、在Linux C中,ls這個命令是怎么被執行的?
使用fork創建一個進程或exec函數族覆蓋原進程。
28、寫一段 C 代碼讓程序跳轉到地址是 0x8000 0000 的位置執行
(*(void(*)(void))0x100000)();或者((void(*)(void))0x100000)();
29、簡要敘述進程和線程這兩個概念。
進程是指一個程序在一個數據集合上的一次運行過程。
線程是進程中的一個實體,是被系統獨立調度和執行的基本單位。
進程是程序的一次執行。線程可以理解為進程中執行的一段程序片段。
30、在一個只有128M內存并且沒有交換分區的機器上,說說下面兩個程序的運行結果
1、
#define MEMSIZE 1024*1024
int count = 0;
void *p = NULL;
while(1) {
? p = (void *)malloc(MEMSIZE);
? if (!p) break;
? printf("Current allocation %d MB\n", ++count);
}
2、
while(1) {
? p = (void *)malloc(MEMSIZE);
? if (!p) break;
? memset(p, 1, MEMSIZE);
? printf("Current allocation %d MB\n", ++count);
}
第一道程序分配內存但沒有填充,編譯器可能會把內存分配優化掉,程序死循環。
第二道,程序分配內存并進行填充,系統會一直分配內存,直到內存不足,退出循環。
31、請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
如果可以用小于號的話,可以這么寫:#define compare(a,b) ((a-b)<0 ? -1 : ((a-b) == 0 ? 0 : 1))
這樣一來的話:
compare(a,b) == -1表示a<b
compare(a,b) == 0表示a==b
compare(a,b) == 1表示a>b
但是如今不能用小于號,那么我們怎樣不用小于號來判斷一個數字是否小于0呢?我們可以用:abs(t) != t ? 1 : -1來表示。
也即如果abs(t) != t那么t<0,否則t>=0。也即t<0等價于(abs(t) != t ? 1 : -1) == 1那么前面的宏寫成如下:
#define compare(a,b) ((abs(a-b) != (a-b) ? 1 : -1) == 1 ? -1 : ((a-b) == 0 ? 0 : 1))
代碼:
//利用宏比較大小
#include?<iostream>
#include?<cmath>
#define?compare(a,b)?((abs(a-b)?!=?(a-b)???1?:?-1)?==?1???-1?:?((a-b)?==?0???0?:?1))
int?main()
{
????int?a1?=?-1,?b1?=?2,?a2?=?3,?b2?=?3,?a3?=?4,?b3=?2;
????cout?<<?compare(a1,?b1)?<<?endl?<<?compare(a2,?b2)?<<?endl?<<?compare(a3,?b3)?<<?endl;
????
????return?0;
}
32、觸摸屏的硬件原理
http://www.51touch.com/Article/Maintain/Technology/175945932.htm
http://www.cublog.cn/u2/78837/showart_1186312.html
觸摸屏的主要三大種類是:電阻技術觸摸屏、 表面聲波技術觸摸屏、 電容技術觸摸屏。
電阻觸摸屏的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏, 這是一種多層的復合薄膜,它以一層玻璃或硬塑料平板作為基層,表面圖有一層透明氧化金屬 (ITO氧化銦,透明的導電電阻) 導電層,上面在蓋有一層外表面硬化處理、光滑防擦的塑料層 、它的內表面也涂有一層ITO涂層 、在他們之間有許多細小的(小于1/1000英寸)的透明隔離點把兩層導電層隔開絕緣 。當手指觸摸屏幕時,兩層導電層在觸摸點位置就有了接觸,控制器偵測到這一接觸并計算出(X,Y )的位置,再根據模擬鼠標的方式運作。這就是電阻技術觸摸屏的最基本的原理。
表面聲波技術是利用聲波在物體的表面進行傳輸,當有物體觸摸到表面時,阻礙聲波的傳輸,換能器偵測到這個變化,反映給計算機,進而進行鼠標的模擬。
電容技術觸摸屏利用人體的電流感應進行工作 。用戶觸摸屏幕時 ,由于人體電場,用戶和觸摸屏表面形成以一個耦合電容, 對于高頻電流來說,電容是直接導體,于是手指從接觸點吸走一個很小的電流。
33、筆試面試題
(一) 1.5n次比較,求出數組的最大值和最小值(數組亂序)
(二) 環形緩沖區,用數據結構實現?
(三) 鏈表的刪除,頭部插入,尾部插入實現?
(四) 求出一個字符串的最長重復串,如“ababc”,返回“ab”
(五) 求出一個周期字符串的最長周期,如“abcabc”,返回3
(六) 使用C/C++實現一個單向鏈表,鏈表需要支持如下接口:
(七) 網絡字節序轉換,大端小端。
(八) 打開一個設備,讀取文件,打印輸出。
(九) 給一個整數,轉換為十六進制字符輸出
(十) 給在 32 位處理器上,將任一整數轉換為二進制形式。
(一) 什么是線程池?
(二) 為什么要用線程池?
(三) 線程的工作流程
(四) 線程池設計
(一) HTTP:
(二) TFTP:
typedef struct {MAD_U32 smiBase,…} MAD_SYS_CONFIG; 這兩種寫法是一個意思嗎?
我相信如果能搞懂以上問題,面試什么的便沒有問題。
?
HR面試題
一、中科創達HR面
1. 自我介紹下。被打斷【她說不好意思注意回說謝謝,同時還要記得自己說到哪里】然后再次打斷她沒有讓你繼續自我介紹。到此自我介紹便結束。
2. 你家在哪,這些項目都是你做的嗎?有沒有讓自己感到很挫敗的事情?同學周圍的人對你是怎么評價的?你的缺點是什么?【老掉牙的問題】
3. 分配任務,你和另外一個人合作,主要都是你做的,但是上級不知道,把功勞主要分給了另個人,你會怎么想。我首先講了自己學習到的很多,并不會太在意!然后她追問:如果一直出現這個問題,你會怎么樣?!鞠溶浐笥病?br /> 4. 分配一個任務,由你和另外一個人完成,你只能借助他完成,因為其能力比你強,如果他和你格格不入,你會怎么辦?如果一直這樣你會怎么辦?【先自身后他人,結合團體公司利益闡述,最后可上升到公司層面】
5. 我們公司有兩種,一個是個人負責項目,成就感更好,一個是和同事一起做項目,你傾向于哪種?我說:可以和能力高于我的一起合作,并沒有特定要求個人自己做。追問:如果有人能力不行怎么辦?我說:沒有關系,可以帶。追問:不是托你后腿嗎。我說:教同事,能提高自己,給予會帶來回報,而且自己會的并不算真正會,把別人教會了才算?!咀⒁膺@里的陷阱,一定要選擇團隊項目】
二、中興HR面
1. 你是如何完成一個分配給你的任務的?
2. 在你做的這些項目中有沒有很難忘的困難或者經歷,那你有沒有想過,如果現在回想這個困難如何更好地去解決?【考察你的即時總結和部分記憶力的能力+真實性考察】
3. 這些項目都比較閑散,和真正工作的時候不一樣,不能這塊沒有做好放一段時間,那你怎么辦?【實戰和訓練的區別,可自由發揮】
三、關于公司選擇
http://mp.weixin.qq.com/s?__biz=MjM5NDYxMzk1Nw==&mid=2652260196&idx=3&sn=d44b136bfff82bc157db4c43b7477a17&chksm=bd67f8ce8a1071d8164fbb5a9ae5bc6e51d08286428fc86803c88ba7cf179e1716da1b017169&scene=4#wechat_redirect
總結
以上是生活随笔為你收集整理的驱动面试、笔试常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金蝶云星空表单插件开发常用事件、方法、函
- 下一篇: 在我一生中最猥琐的时候遇见你(1)