標籤:嵌入式 linux
Linux問題集
1 linux環境變數設定及儲存地點
1. 顯示環境變數HOME
$ echo $HOME
/home/terry
2. 設定一個新的環境變數WELCOME
$ exportWELCOME="Hello!"
$ echo$WELCOME
Hello!
3. 使用env命令顯示所有的環境變數
$ env
HOSTNAME=terry.mykms.org
PVM_RSH=/usr/bin/rsh
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
...
4. 使用set命令顯示所有本地定義的Shell變數
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION=‘2.05b.0(1)-release‘
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
5. 使用unset命令來清除環境變數
set可以設定某個環境變數的值。清除環境變數的值用unset命令。如果未指定值,則該變數值將被設為NULL。樣本如下:
$ exportTEST="Test..." #增加一個環境變數TEST
$ env|grepTEST #此命令有輸入,證明環境變數TEST已經存在了
TEST=Test...
$ unset $TEST#刪除環境變數TEST
$ env|grepTEST #此命令沒有輸出,證明環境變數TEST已經存在了
6. 使用readonly命令設定唯讀變數
如果使用了readonly命令的話,變數就不可以被修改或清除了。樣本如下:
$ exportTEST="Test..." #增加一個環境變數TEST
$ readonlyTEST #將環境變數TEST設為唯讀
$ unset TEST#會發現此變數不能被刪除
-bash: unset:TEST: cannot unset: readonly variable
$TEST="New" #會發現此也變數不能被修改
-bash: TEST:readonly variable
環境變數的全域設定位於/etc/profile檔案,如果需要增加新的環境變數可以添加下屬行
exportPATH=$PATH:/path1:/path2:/pahtN
2 ubuntu下安裝刪除命令
apt表示是advancedpacakge Tool.
apt-cachesearch package 搜尋包
apt-cacheshow packagename 擷取包的資訊如版本和大小。
apt-getinstall packagename 安裝包。
apt-getinstall pacekage --reinstall 重新安裝
apt-get -finstall packagename 強行安裝
apt-getremove packagename 刪除某個程式
apt-getremove packagename --pure 乾淨的卸掉
apt-getautoremove 自動刪除不要的包
apt-getupdate
apt-getupgrade 更新已經安裝的包
apt-getdist-upgrade 升級系統,沒用過
apt-cachedepends pacakgename 瞭解使用的依賴,很少用
apt-cacherdepends packagename 瞭解具體的依賴。
apt-getbuild-dep packagename 安裝相關的編譯環境。這個有時需要用。
apt-getsource package 下載安裝該包的源碼,編程時有時需要看
apt-get clean
apt-getautoclean 清理下載檔案存檔。
apt-getcheck 檢查是否有損壞的依賴,很少用。
可以通過man apt獲得更為詳細的解釋。
3如何讓linux在啟動時自動載入指令碼
1 先編寫指令碼,比如名字為a.sh
2 儲存路徑為:/etc/rc.d/a.sh
3 修改/etc/rc.d/rc.local
在該檔案末尾加入a.sh指令碼的存放路徑:/etc/rc.d/a.sh
儲存,退出 ,就OK了。
4 mount和 umount 命令
mount文法:
mount [選項]<-t 類型> [-o 掛載選項] <裝置> <掛載點>
-t 選項用於指定分區上檔案系統的類型。您最常遇到的檔案系統應該是ext2FS(GNU/Linux 檔案系統)或 ext3FS(改進了日誌效能的 ext2FS),VFAT(適用於所有 DOS/Windows? 分區:FAT12, 16 or 32)以及 ISO9660(CD-ROM 檔案系統)。如果您不指定任何類型,mount 將會試著讀取分區中的超塊來猜測檔案系統。
-o 選項用於指定一個或多個掛載選項。可供選擇的選項視檔案系統類型不同而有所不同。請參看 mount(8) 手冊頁中的細節。通常將分區掛載在 /mnt 或其它掛載點(掛載點必須已經存在)。
舉例:
$ mount -text3 /dev/hdb1 /mnt
要卸下分區,可使用umount 命令,文法:
umount <掛載點|裝置>
舉例:
$ umount /mnt 或者:
$ umount/dev/hdb1
提示:有些時候,可能某些裝置(通常是 CD-ROM)正忙或無法響應。此時,大多數使用者的解決辦法是重新啟動電腦。我們大可不必這麼做。例如,如果umount /dev/hdc 失敗的話,您可以試試“lazy” umount。文法十分簡單:
umount -l<掛載點|裝置>
此命令將會斷開裝置並關閉開啟該裝置的全部控制代碼。通常,您可以使用 eject <掛載點|裝置>命令彈出碟片。所以,如果eject 命令失效而您又不想重新啟動,請使用 lazy umount。
如果我們想讓系統在啟動的時候自動掛載某些分區,則應該編輯/etc/fstab 檔案。該檔案的每一行對應一組掛載關係,包括檔案系統、掛載點以及其它選項。這裡是該檔案的一個例子:
/dev/hda1 / ext2 defaults 1 1
/dev/hda5 /home ext2 defaults 1 2
/dev/hda6 swap swap defaults 0 0
none /mnt/cdrom supermount dev=/dev/scd0,fs=udf:iso9660,ro,--0 0
none /mnt/floppy supermountdev=/dev/fd0,fs=ext2:vfat,--,sync,umask=0 0 0
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
每行都由以下內容組成:
檔案系統所在的裝置;
掛載點;
檔案系統類型;
掛載選項;
dump 工具備份標誌;
fsck(檔案系統檢查(FileSystem ChecK))的檢查順序。
總是有一行說明了根檔案系統。swap 分區是一種特殊的分區,因為您無法在樹形結構中找到其對應位置,而且這些分區的掛載點域唯寫著swap 關鍵字。至於 /proc 檔案系統,我們會在第 10 章 /proc 檔案系統中有更詳細的描述。另外一種特殊的檔案系統是/dev/pts。
舉例個例子,如果想把/dev/hdb1自動掛載到/usr ,就得在 /etc/fstab 檔案中添加下面一行:
/dev/hdb1 /usr ext2 defaults 1 2
這樣,分區將會在每次啟動時自動掛載,並且必要時檢查錯誤。
現在我們來介紹兩個特殊選項:noauto 和 user。noauto 選項指定了檔案系統不應該在啟動時掛載,而只應該在您想要掛載的時候才掛載。而user 選項指定了任何使用者都可以掛載或卸下檔案系統。這兩個選項通常用於 CD-ROM 和軟碟機。有關 /etc/fstab 中其它選項的詳情,請您查看 fstab(5) 手冊頁。
使用 /etc/fstab 的好處在於,它將極大簡化 mount 命令的文法。要掛載檔案中描述的檔案系統,您只需要引用掛載點或裝置。要掛載磁碟片,您可以只輸入:
$ mount/mnt/floppy
或:
$ mount/dev/fd0
5 檔案的加鎖問題
問:用fcntl給檔案加鎖,在一個進程中加給一個檔案多次加同一類型的鎖,不會報錯嗎?
答:如果一個進程對一個檔案區間已經有一把鎖,後來該進程又企圖在同一檔案區間再加一把鎖,那麼新鎖將替換老鎖。
6 framebuffer簡介
FrameBuffer 是出現在 2.2.xx 核心當中的一種驅動程式介面。這種介面將顯示裝置抽象為框架緩衝區。使用者可以將它看成是顯示記憶體的一個映像,將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在螢幕上。該驅動程式的裝置檔案一般是/dev/fb0、/dev/fb1 等等。比如,假設現在的顯示模式是 1024x768-8 位色,則可以通過如下的命令清空螢幕:
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
在應用程式中,一般通過將 FrameBuffer 裝置映射到進程地址空間的方式使用,比如下面的程式就開啟 /dev/fb0 裝置,並通過mmap 系統調用進行地址映射,隨後用 memset 將螢幕清空(這裡假設顯示模式是 1024x768-8 位色模式,線性記憶體模式):
int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0",O_RDWR);
fb_mem = mmap (NULL, 1024*768,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768);
FrameBuffer 裝置還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示裝置的一些固定資訊(比如顯示記憶體大小)、與顯示模式相關的可變資訊(比如解析度、象素結構、每掃描線的位元組寬度),以及偽彩色模式下的調色盤資訊等等。
通過 FrameBuffer 裝置,還可以獲得當前核心所支援的加速顯示卡的類型(通過固定資訊得到),這種類型通常是和特定顯示晶片相關的。比如目前最新的核心(2.4.9)中,就包含有對S3、Matrox、nVidia、3Dfx 等等流行顯示晶片的加速支援。在獲得了加速晶片類型之後,應用程式就可以將 PCI 裝置的記憶體I/O(memio)映射到進程的地址空間。這些memio 一般是用來控制顯示卡的寄存器,通過對這些寄存器的操作,應用程式就可以控制特定顯卡的加速功能。
PCI 裝置可以將自己的控制寄存器映射到實體記憶體空間,而後,對這些控制寄存器的訪問,給變成了對實體記憶體的訪問。因此,這些寄存器又被稱為"memio"。一旦被映射到實體記憶體,Linux的普通進程就可以通過 mmap 將這些記憶體 I/O 映射到進程地址空間,這樣就可以直接存取這些寄存器了。
當然,因為不同的顯示晶片具有不同的加速能力,對memio 的使用和定義也各自不同,這時,就需要針對加速晶片的不同類型來編寫實現不同的加速功能。比如大多數晶片都提供了對矩形填充的硬體加速支援,但不同的晶片實現方式不同,這時,就需要針對不同的晶片類型編寫不同的用來完成填充矩形的函數。
說到這裡,讀者可能已經意識到 FrameBuffer 只是一個提供顯示記憶體和顯示晶片寄存器從實體記憶體映射到進程地址空間中的裝置。所以,對於應用程式而言,如果希望在FrameBuffer 之上進行圖形編程,還需要完成其他許多工作。舉個例子來講,FrameBuffer 就像一張畫布,使用什麼樣子的畫筆,如何畫畫,還需要你自己動手完成。
7 strings命令的作用
一些二進位格式的檔案。你想知道裡面有哪些常量字串。就非常有用。比如你產生這樣一個程式,a.c:
int main(void)
{
return printf ("hello world\n");
}
#cc -o a.outa.c
#strings./a.out
/lib64/ld-linux-x86-64.so.2
_Jv_RegisterClasses_
_gmon_start_
_
libc.so.6
printf
__libc_start_main
GLIBC_2.2.5
hello world
8 什麼是tty?
終端裝置是一種字元型裝置,它有多種類型,通常使用tty來統稱。tty是Teletype的縮寫。Teletype是最早出現的一種終端裝置,很象電傳打字機(或者說就是?),是由Teletype公司生產的。在Linux系統的裝置特殊檔案目錄/dev/下,終端裝置檔案一般有以下幾種:
1.串端終端(/dev/ttySn)
序列埠終端(Serial Port Terminal)是使用電腦序列埠串連的終端裝置。電腦把每個序列埠都看作是一個字元裝置。有段時間這些序列埠裝置通常被稱為終端裝置,因為那時它的最大用途就是用來串連終端。這些序列埠所對應的裝置名稱是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev/ttyS1)等,裝置號分別是(4,0)、(4,1)等,分別對應於DOS系統下的COM1、COM2等。若要向一個連接埠發送資料,可以在命令列上把標準輸出重新導向到這些特殊檔案名稱上即可。例如,在命令列提示符下鍵入:echotest > /dev/ttyS1會把單詞”test”發送到串連在ttyS1(COM2)連接埠的裝置上。
2.偽終端(/dev/pty/)
偽終端(Pseudo Terminal)是成對的邏輯終端裝置,例如/dev/ptyp3和/dev/ttyp3(或著在裝置檔案系統中分別是/dev/pty/m3和/dev/pty/s3)。它們與實際物理裝置並不直接相關。如果一個程式把ttyp3看作是一個序列埠裝置,則它對該連接埠的讀/寫操作會反映在該邏輯終端裝置對的另一個上面(ptyp3)。而ptyp3則是另一個程式用於讀寫操作的邏輯裝置。這樣,兩個程式就可以通過這種邏輯裝置進行互相交流,而其中一個使用ttyp3的程式則認為自己正在與一個序列埠進行通訊。這很象是邏輯裝置對之間的管道操作。
對於ttyp3(s3),任何設計成使用一個序列埠裝置的程式都可以使用該邏輯裝置。但對於使用ptyp3的程式,則需要專門設計來使用ptyp3(m3)邏輯裝置。
例如,如果某人在網上使用telnet程式串連到你的電腦上,則telnet程式就可能會開始串連到裝置ptyp2(m2)上(一個偽終端連接埠上)。此時一個getty程式就應該運行在對應的ttyp2(s2)連接埠上。當telnet從遠端擷取了一個字元時,該字元就會通過m2、s2傳遞給getty程式,而getty程式就會通過s2、m2和telnet程式往網路上返回”login:”字串資訊。這樣,登入程式與telnet程式就通過“偽終端”進行通訊。通過使用適當的軟體,就可以把兩個甚至多個偽終端裝置串連到同一個物理序列埠上。
在使用裝置檔案系統(device filesystem)之前,為了得到大量的偽終端裝置特殊檔案,使用了比較複雜的檔案名稱命名方式。因為只存在16個ttyp(ttyp0—ttypf)的裝置檔案,為了得到更多的邏輯裝置對,就使用了象q、r、s等字元來代替p。例如,ttys8和ptys8就是一個偽終端裝置對。不過這種命名方式目前仍然在於RedHat等Linux系統中使用著。
但Linux系統上的Unix98並不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的對應端則會被自動地建立成/dev/pts/3。這樣就可以在需要時提供一個pty偽終端。目錄/dev/pts是一個類型為devpts的檔案系統,並且可以在被負載檔案系統列表中看到。雖然“檔案”/dev/pts/3看上去是裝置檔案系統中的一項,但其實它完全是一種不同的檔案系統。
3.控制終端(/dev/tty)
如果當前進程有控制終端(Controlling Terminal)的話,那麼/dev/tty就是當前進程式控制制終端的裝置特殊檔案。可以使用命令”ps–ax”來查看進程與哪個控制終端相連。對於你登入的shell,/dev/tty就是你使用的終端,裝置號是(5,0)。使用命令”tty”可以查看它具體對應哪個實際終端裝置。/dev/tty有些類似於到實際所使用終端裝置的一個聯結或別名。
4.控制台(/dev/ttyn,/dev/console)
在Linux系統中,電腦顯示器通常被稱為控制台終端或控制台(Console)。它模擬了類型為Linux的一種終端(TERM=Linux),並且有一些裝置特殊檔案與之相關聯:tty0、tty1、tty2等。當你在控制台上登入時,使用的是tty1。使用Alt+[F1—F6]按鍵組合時,我們就可以切換到tty2、tty3等上面去。tty1–tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,Linux系統所產生的資訊都會發送到該終端上。因此不管當前我們正在使用哪個虛擬終端,系統資訊都會發送到我們的螢幕上。C}$k]\
你可以登入到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話存在。但只有系統或超級使用者root可以向/dev/tty0進行寫操作,而且有時/dev/console會串連至/dev/tty0或/dev/tty1上。
5.其它類型
Linux系統中還針對很多不同的字元裝置建有很多其它種類的終端裝置特殊檔案。例如針對ISDN裝置的/dev/ttyIn終端裝置等,這裡不再贅述。
9 nm 命令和strip 命令
nm 命令顯示對象檔案、可執行檔以及對象檔案庫裡的符號資訊。
strip 命令減少XCOFF 對象檔案的大小。strip 命令從 XCOFF 對象檔案中有選擇地除去行號資訊、重定位資訊、調試段、typchk 段、注釋段、檔案頭以及所有或部分符號表。一旦您使用該命令,則很難調試檔案的符號;因此,通常應該只在已經調試和測試過的產生模組上使用 strip 命令。使用 strip 命令減少對象檔案所需的儲存量開銷。
嵌入式Linux中常見的問題