發表文章

撰寫Makefile教學

撰寫Makefile教學 這裡我們討論當你在Unix like的系統之中如何透過GNU tool幫你建立你整個專案,也許你的程式只有幾個檔案,慢慢用手編是簡單也沒問題,但是如果是大型的專案,超過幾十個檔案而且需要連結不少的函式庫,那你應該怎麼做呢?最方便的就是學習makefile和make指令,使用這個工具幫你做編譯和連結的動作。 ※ 使用make好處 * 透過你所設定的條件幫你編譯好 * 方便專案管理 * 會透過檔案比對,依照相依性來編譯,不會全都編浪費時間 * 可以同時編譯函式庫或是檔案 ※ make常用指令 * make -k: 會讓make在遇到錯誤的時候仍然運行,而不會停在第一個問題 * make -n: 只印出將會進行的工作,而不會真的去執行 * make -f makefile_name: 告訴make需要用那個makefile檔案。當你的make檔不是叫makefile的時候,需要自行透過-f加上你檔案名字,make才找的到你的makefile ※ make指令格式 make [option] [target] option就是上面的設定項目,而target等等會講到,就是我們將要產生出來的目標,可以接很多個目標,如果目標不寫的話預設是all。 Example: make -n all clean make install make make -f makefile2 install ※ 撰寫makefile檔案 makefile是由一堆「目標」和其「相依性檔案」還有「法則」所組成的,而法則在寫的時候前面不可以使用空格,只能使用Tab鍵,而且同一法則要換行的話需要使用'\'字元,而要加入註解的話要用'#'為開頭字元。 * [target] 目標 - 產生出來的東西或某個項目 * [dependency] 相依性項目 - 目標受相依檔案改變需要重新產生目標 * [rule] 法則 - 如何讓相依性項目編譯和連結來產生目標 Example: #這是makefile的格式(註解) [target]: [dependency] [dependency] [TAB][rule] [TAB][rule] [target]: [dependency]...

Start telnetd server

1 . linux kernel config check *File systems --> /dev/pts file system for Unix98 PTYs check *Character devices -> Unix98 PTY support 2 . busybox config check *General Configuration -> Support for devfs check *General Configuration -> Use the devpts filesystem for Unix98 PTYs 3 . check /dev/ptmx mknod -m 666 ptmx c 5 2 4 . add telnet for root logins add the following to the end of the file:0~7 表示可以有 8 個連線。 pts/0 pts/1 pts/2 pts/3 pts/4 pts/5 pts/6 pts/7 可以利用下面的 script 建立。 for i in 0 1 2 3 4 5 6 7 do # /bin/mknod /dev/ttyp$i c 3 $i # /bin/mknod /dev/ptyp$i c 2 $i /bin/mknod /dev/pts/$i c 136 $i done 5 . run telnetd /# telnetd PS: busybox config -> Login/Password Management Utilities -> Support for shadow passwords 不用選,還可以省點 size,並且把 /etc/shadow 移除,因為用不到。 另外在 passwd 及 shadow 的密碼都是要加密的,而非 passwd 內的密碼是明碼。 PS: cat /etc/passwd root::0:0:root:/bin:/bin/sh bin::1:1:bin:/bin:/bin/sh guest::6:6:guest:/bin:/bin/sh nobody::99:99:n...

Linux系統運行的各種參數解析

1、CPU 在文件”/proc/stat”裡面就包含了CPU的信息。每一個CPU的每一tick用在什麼地方都在這個文件裡面記著。 後面的數字含義分別是: user、nice、sys、idle、iowait。有些版本的kernel沒有iowait這一項。 這些數值表示從開機到現在,CPU的每tick用在哪里。例如: cpu0 256279030 0 11832528 1637168262 就是cpu0從開機到現在有 256279030 tick用在user消耗,11832528用在sys消耗。 所以如果想計算單位時間(例如1s)裡面CPU的負載,那只需要計算1秒前後數值的差除以每一秒的tick數量就可以了。 gkrellm就是這樣實現的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2 例如,第一次讀取/proc/stat,user的值是256279030;一秒以後再讀一次,值是256289030, 那麼CPU在這一秒的user消耗就是: ((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%。 2、RAM 文件”/proc/meminfo”裡面包含的就是RAM的信息,還包括了swap的信息。例如: $ cat /proc/meminfo total: used: free: shared: buffers: cached: Mem: 1057009664 851668992 205340672 0 67616768 367820800 Swap: 2146787328 164429824 1982357504 MemTotal: 1032236 kB MemFree: 200528 kB MemShared: 0 kB …… 不過從gkrellm的源代碼看,有些版本沒有前面那兩行統計的信息,只能夠根據下面的Key: Value這種各式的數據收集。 3、磁碟空間 從gkrellm的代碼看,這個是一個很復雜的數據。 磁碟分區的數據有可能分布在:/proc/mounts、/proc/diskstats、/proc/par...

Linux ARM memory layout

圖片
Linux ARM memory layout ./Documentation/arm/memory.txt ./arch/arm/mm/init.c high_memory = __va((max_low << PAGE_SHIFT) - 1) + 1; arch/arm/include/asm/pgtable.h #define VMALLOC_OFFSET (8*1024*1024) arch/arm/include/asm/pgtable.h #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) arch/arm/mach-ARCH/include/mach/vmalloc.h (platform dependent) #define VMALLOC_END (PAGE_OFFSET + 0x20000000) arch/arm/include/asm/memory.h #define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET) .config CONFIG_PAGE_OFFSET=0xC0000000 VMALLOC_START = high_memory + VMALLOC_OFFSET = CONFIG_PAGE_OFFSET+ram_size + VMALLOC_OFFSET VMALLOC_END = CONFIG_PAGE_OFFSET + 0x20000000 → available VMALLOC size = 0x20000000 - VMALLOC_OFFSET - ram_size = 512M -8M -ram_size Reference: http://mkl-note.blogspot.com/2010/02/linux-arm-memory-layout.html

每位程式設計師都必須知道的「麻煩事件處理原則」

圖片

Convert "Little-Endian" to "Big-Endian"

Convert "Little-Endian" to "Big-Endian" This tip outlines two simple methods that help you to convert a number from the "little-endian" format to the "big-endian" format. // 2-byte number int SHORT_little_endian_TO_big_endian(int i) { return ((i>>8)&0xff)+((i << 8)&0xff00); } // 4-byte number int INT_little_endian_TO_big_endian(int i) { return((i&0xff)<<24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff); }

CHOKE , inductor , Bead 這三種零件在電路上有什麼差別?

圖片
參考: http://www.haifeng.idv.tw/leo/cgi-bin/topic.cgi?forum=239&topic=485&changemode=1&show=0