填空選擇題
1、ARM指令和Thumb指令。(選擇題)
解答:在ARM的體系結構中,可以工作在三種不同的狀態,一是ARM狀態,二是Thumb狀態及Thumb-2狀態,三是調試狀態。而ARM狀態和Thumb狀態可以直接通過某些指令直接切換,都是在運行程序,只不過指令長度不一樣而已。
ARM狀態:arm處理器工作於32位指令的狀態,所有指令均為32位;
Thumb狀態:arm執行16位指令的狀態,即16位狀態;
thumb-2狀態:這個狀態是ARM7版本的ARM處理器所具有的新的狀態,新的thumb-2內核技術兼有16位及32位指令,實現了更高的性能,更有效的功耗及更少地占用內存。總的來說,感覺這個狀態除了兼有arm和thumb的優點外,還在這兩種狀態上有所提升,優化;
調試狀態:處理器停機時進入調試狀態。
也就是說:ARM狀態,此時處理器執行32位的字對齊的ARM指令;Thumb狀態,此時處理器執行16位的,半字對齊的THUMB指令。
ARM狀態和Thumb狀態切換程序:
從ARM到Thumb: LDR R0,=lable+1 BX R0(狀態將寄存器的最低位設置為1,BX指令、R0指令將進入thumb狀態);
從ARM到Thumb: LDR R0,=lable BX R0(寄存器最低位設置為0,BX指令、R0指令將進入arm狀態)。
當處理器進行異常處理時,則從異常向量地址開始執行,將自動進入ARM狀態。
關於這個知識點還有幾個注意點:
ARM處理器復位后開始執行代碼時總是只處於ARM狀態;
Cortex-M3只有Thumb-2狀態和調試狀態;
由於Thumb-2具有16位/32位指令功能,因此有了thumb-2就無需Thumb了。
另外,具有Thumb-2技術的ARM處理器也無需再ARM狀態和Thumb-2狀態間進行切換了,因為thumb-2具有32位指令功能。
參考文章:ARM處理器的工作狀態。
2、哪種總線方式是全雙工類型、哪種總線方式傳輸的距離最短?(選擇題)
解答:幾種總線接口的通信方式的總結如下圖所示:
總線接口 | 串/並 | 同步/異步 | 速率 | 工作方式 | 用線 | 總線拓撲結構 | 信距離 |
UART | 串 | 異步 | 慢 波特率設置 |
全雙工 | 2線 Rx、Tx |
RS485支持總線式、 星形、樹形 |
遠 最遠1200m |
I2C | 串 | 同步 | 慢 | 半雙工 | 2線 SDA、SCL |
總線型(特殊的樹形) | 近 |
SPI | 串 | 同步 |
快 | 全雙工 | 3線或4線 SCLK、SIMO、 SOMI、SS(片選) |
環形 |
遠 |
USB |
串 | 同步 | 快 | 半雙工 | 4線 Vbus(5V)、GND、 |
星形 | 近 |
3、TCP與UDP的區別。(選擇題)
解答:TCP和UDP的區別總結如下圖所示:
角度 | TCP | UDP |
是否連接 | 面向連接(發送數據前需要建立連接) | 無連接(發送數據無需連接) |
是否丟包重試 |
實現了數據傳輸時各種控制功能,可以進行丟包的重發控制, 還可以對次序亂掉的分包進行順序控制 |
不會進行丟包重試,也不會糾正到達的順序 |
模式 | 流模式(面向字節流) | 數據報模式(面向報文) |
對應關系 | 一對一 | 支持一對一,一對多,多對一和多對多的交互通信 |
頭部開銷 | 最小20字節 | 只有8字節 |
可靠性 | 全雙工非常可靠、無差錯、不丟失、不重復、且按序到達 | 不保證可靠交付,不保證順序到達 |
擁塞控制 | 有控制 更多詳情 | 有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低 (對實時應用很有用,如IP電話,實時視頻會議等) |
資源要求 | TCP程序結構較復雜,較多 | UDP程序結構簡單,少 |
4、Linux的用戶態與內核態的轉換方法。(選擇題)
解答:Linux下內核空間與用戶空間進行通信的方式主要有syscall(system call)、procfs、ioctl和netlink等。
syscall:一般情況下,用戶進程是不能訪問內核的。它既不能訪問內核所在的內存空間,也不能調用內核中的函數。Linux內核中設置了一組用於實現各種系統功能的子程序,用戶可以通過調用他們訪問linux內核的數據和函數,這些系統調用接口(SCI)稱為系統調用;
procfs:是一種特殊的偽文件系統 ,是Linux內核信息的抽象文件接口,大量內核中的信息以及可調參數都被作為常規文件映射到一個目錄樹中,這樣我們就可以簡單直接的通過echo或cat這樣的文件操作命令對系統信息進行查取;
netlink:用戶態應用使用標准的 socket API 就可以使用 netlink 提供的強大功能;
ioctl:函數是文件結構中的一個屬性分量,就是說如果你的驅動程序提供了對ioctl的支持,用戶就可以在用戶程序中使用ioctl函數控制設備的I/O通道。
5、linux目錄結構,選項是/usr、/tmp、/etc目錄的作用。(選擇題)
解答:linux目錄圖:
/usr:不是user的縮寫,其實usr是Unix Software Resource的縮寫, 也就是Unix操作系統軟件資源所放置的目錄,而不是用戶的數據啦。這點要注意。 FHS建議所有軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟件自己獨立的目錄;
/tmp:這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要資料不可放置在此目錄啊。 因為FHS甚至建議在開機時,應該要將/tmp下的資料都刪除;
/etc:系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務的啟始檔等等。 一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但是只有root有權力修改。 FHS建議不要放置可執行檔(binary)在這個目錄中。 比較重要的檔案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。
參考文章:Linux文件目錄結構詳解。
6、下面這段程序的運行結果?(選擇題)
int main(){ const int x=5; const int *ptr; ptr=&x; *ptr=10; printf("%d\n",x); return 0; }
解答:編譯出錯。
這道題主要是講解const與指針的問題:
const int a; int const a; const int *a; int * const a; const int * const a; int const * const a;
前兩個的作用是一樣,a是一個常整型數;
第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以);
第四個意思a是一個指向整型 數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的);
最后兩個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數 是不可修改的,同時指針也是不可修改的)。
也就是說:本題x是一個常量,不能改變;ptr是一個指向常整型數的指針。而當*ptr=10;的時候,直接違反了這一點。同時要記得一點,const是通過編譯器在編譯的時候執行檢查來確保實現的。
7、在32位系統中,有如下結構體,那么sizeof(fun)的數值是()
#pragma pack(1) struct fun{ int i; double d; char c; };
linux復現:
#include<stdio.h> #pragma pack(1) struct fun { int i; double d; char c; }; int main() { int ii=0; double dd=0; struct fun funy; printf("sizeof(int)=%d\n",sizeof(int)); printf("sizeof(double)=%d\n",sizeof(double)); printf("sizeof(char)=%d\n",sizeof(char)); printf("sizeof(fun)=%d\n",sizeof(funy)); }
最終結果:
13!
可能是一般的內存對齊做習慣了,如果本題采用內存對齊的話,結果就是24(int 4 double char 7)。但是#pragma pack(1)讓編譯器將結構體數據強制按1來對齊。
每個特定平台上的編譯器都有自己的默認“對齊系數”(32位機一般為4,64位機一般為8)。我們可以通過預編譯命令#pragma pack(k),k=1,2,4,8,16來改變這個系數,其中k就是需要指定的“對齊系數”。
只需牢記:
- 第一個數據成員放在offset為0的地方,對齊按照對齊系數和自身占用字節數中,二者比較小的那個進行對齊;
- 在數據成員完成各自對齊以后,struct或者union本身也要進行對齊,對齊將按照對齊系數和struct或者union中最大數據成員長度中比較小的那個進行;
- 參考文章:#pragma pack()的解讀。
8、Linux中的文件/目錄權限設置命令是什么?(選擇題)
解答:chmod