在這裡看到一個很強的工具 -- nmap,可以掃描通訊埠,找出對應的應用程式名稱、版本、狀態,此外也看 OS 版本、DNS 反查等。
nmap -sP 192.168.1.0/24
nmap -sn 192.168.1.0/24
參考:
星期六, 4月 24, 2010
星期六, 4月 17, 2010
讀:Five top causes of nasty embedded software bugs
五個最常犯的嵌入式軟體錯誤 Five top causes of nasty embedded software bugs
- Race condition,這些變數最好取名以 g_ 開頭,寫程式時特別注意。
- Non-reentrant 函式需加 mutex 保護,包括有些標準 C 函式庫,應該使用 "newlib" (寡聞了)
- 有些變數需要 volatile,不然有可能被編譯器最佳化掉,包括 task 或 ISR 間共用的全域變數、Memory-mapped Register、delay count
- 嵌入式系統比桌上型電腦更容易 Stack overflow,原因有記憶體較少、沒有 virtual memory、RTOS 將每個 task 的 stack 獨立、而 ISR 也會去用這些 stack。可在 stack 裡加 high water mark,定期去檢查 (例如在 watchdog 裡),被改變則紀錄下來並適當因應,例如 reboot。
- 動態記憶體 allocation 長時間後會造成 Heap fragment,該改用多種固定大小的 memory pool
星期四, 4月 15, 2010
星期日, 4月 11, 2010
git 產生 patch 檔
想拿 git 當 quilt 用,git apply 採用 patch 檔,那如何產生 patch 檔?
未 commit 前:
git diff > ABC.patch
commit 後:
git format-patch HEAD^
git diff HEAD^ > ABC.patch
延伸閱讀:guilt
未 commit 前:
git diff > ABC.patch
commit 後:
git format-patch HEAD^
git diff HEAD^ > ABC.patch
延伸閱讀:guilt
星期六, 4月 10, 2010
Linux hotplug
Linux 核心設定 HOTPLUG
自動執行 /proc/sys/kernel/hotplug 連結的程式,預設是 /sbin/hotplug,參數是 subsystem (block, usb 等),並提供如下基本環境變數:
USB subsystem is invocated by the kernel hub daemon thread [khrbd] 或 else as part of root hub initialization (init, modpobe, kapmd 等),有額外環境變數:
可讓 hotplug 執行 `env >> /filename` 得知有哪些環境變數。
FW_LOADER depends on HOTPLUG:支援 Userspace firmware loading
自動執行 /proc/sys/kernel/hotplug 連結的程式,預設是 /sbin/hotplug,參數是 subsystem (block, usb 等),並提供如下基本環境變數:
- HOME=/
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- ACTION 有 add, remove, change, offline, online, move
- DEVPATH:/sys 下的路徑
- SUBSYSTEM:同參數 subsystem
- SEQNUM:uevent 的序號
USB subsystem is invocated by the kernel hub daemon thread [khrbd] 或 else as part of root hub initialization (init, modpobe, kapmd 等),有額外環境變數:
- DEVICE=/proc/bus/usb/{busnum}/{devnum}:如果有 usbfs (CONFIG_USB_DEVICEFS) 時。
- PRODUCT={idVendor}/{idProduct}/{bcdDevice} (hex)
- TYPE={bDeviceClass}/{bDeviceSubClass}/{bDeviceProtocol} (decimal)
- BUSNUM={busnum} (bus event)
- DEVNUM={devnum} (bus event)
- INTERFACE={bInterfaceClass}/{bInterfaceSubClass}/{bInterfaceProtocol}... interface 0 class codes (interface evnet, decimal)
- MODALIAS=usb:v{idVendor}p{idProduct}d{bcdDevice}dc{bDeviceClass}dsc{bDeviceSubClass}dp{bDeviceProtocol}ic{bIntrefaceClass}isc{bInterfaceSubClass}ip{bIntrefaceProtocol} (interface event)
可讓 hotplug 執行 `env >> /filename` 得知有哪些環境變數。
FW_LOADER depends on HOTPLUG:支援 Userspace firmware loading
mdev
- busybox 裡的簡化版 udev,系統啟動或熱插拔時,產生驅動程式所需要的節點檔案及執行特定指令。
- 執行時機有兩個,一是系統啟動時執行 mdev -s,會去尋找 /sys/block 和 /sys/class 下所有含有 dev 的目錄,在 /dev 下建立對應的節點檔案 (device node)。(dev 內容為 major:minor)。另一是熱插拔時自動執行連結到 /proc/sys/kernel/hotplug 的 /sbin/mdev, 依據環境變數 ACTION 及 DEVPATH 來建立或移除節點檔案。
- 編譯
- kernel 部份
- CONFIG_PROC_FS
- CONFIG_SYSFS
- CONFIG_HOTPLUG
- busybox mdev 部份
- CONFIG_USER_BUSYBOX_MDEV: mdev 程式,提供建立或移除節點檔案功能。
- CONFIG_USER_BUSYBOX_FEATURE_MDEV_CONF: 建立節點檔案時,會依 /etc/mdev.conf 設定的 uid:gid, mode, subdir 建立。
- CONFIG_USER_BUSYBOX_FEATURE_MDEV_EXEC: 節點新增後或移除前,執行 /etc/mdev.conf 設定的指令
- 系統設定
mount -t sysfs sysfs /sys (/etc/inittab sysinit)
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug (/etc/inittab sysinit)
mdev -s (/etc/inittab sysinit) - mdev.conf 設定
- 格式:<regex> <uid>:<gid> <permissions> [<path>] [@|$|*<command>]
例如:.* 0:0 0660 / * echo $DEVPATH >> /tmp/hotplug
延伸閱讀
- devfs:舊方式
- udevd, udevtrigger
- hotplug2:tiny 版,用 udevtrigger 作 coldplug,有用到 fork()
星期五, 4月 09, 2010
星期四, 4月 08, 2010
星期日, 4月 04, 2010
電腦漢字體
目前漢字印刷的四種主要字體 (font) 為宋體、黑體、仿宋體和楷體。
- 楷體
- 宋體 或稱明體,為宋朝因應印刷特性所需而發展的字體,到明朝逐漸流行。 筆畫一般是橫細豎粗,末端有裝飾部分(即「字腳」或「襯線」),點、撇、捺、鉤等筆畫有尖端。
- 仿宋體 大部分仿製宋體而來,但擁有楷體的筆型,較像手書體,各筆劃等粗,字體較為瘦長。
- 黑體類似西文無襯線字 (sans-serif),筆劃粗壯有力,撇捺等筆畫不尖,沒有過多的點綴,使人易於閱讀,減少視覺疲勞,特別是顯示在銀幕上。
- 新細明體 (PMingLiU)
- C:\WINDOWS\Fonts\minliu.ttc
- 前身為細明體 (MingLiU),內含的英文字母為比例字體。
- 非常依賴 Hinting 技術,如沒有開啟 Hinting 功能,字體在放大時會有散開的。
- 標楷體 (KaiU)
- 教育部標準字體,有隸書、楷書及宋體。
- 文泉驛正黑體 (ttf-wqy-zenhei, xfonts-wqy):Ubuntu 預設的漢字字體,偏簡體風格,例如「誤」。
- 微軟正黑體 (JhengHei)
- 支援 ClearType® 技術的 TrueType 無襯線字體;同時也符合中華民國教育部的國字標準字體的標準。
- 隨著 Windows Vista 及 Office 2007 一起發布,也是 Windows Vista 預設的字體,在使用的 ClearType 功能的液晶顯示器中,微軟正黑體比以前預設的新細明體更加的清晰易讀。
- 另外包括「微軟正黑體 Bold」(粗體),檔名為 MSJHBD.TTF。不是單純的將字元加粗,而是在具體筆畫上分別進行處理,因此是獨立的一個字體。
- Windows/Fonts/msjh*.ttf
- 官方下載 for XP
- 參考:Microsoft ClearType fonts for Windows XP
- 華康中黑體
- 王漢宗細黑體繁/王漢宗特黑體繁:只有 Big5 字碼。
- 令人矚目的新字型:Droid
- Apple 儷黑、黑體繁
- CLE 檔案伺服器 -- 字型區
- 教育部免費的楷書字型
- 等待新漢碼-漢字的數位化與中華文化的衝擊
- 你知道嗎?漢字是組出來的(上)/(下)
星期六, 4月 03, 2010
Linux Kernel: mdelay(), udelay(), ndelay()
@include/linux/delay.h
@include/asm/delay.h --> include/asm-???/delay.h
這三個函數分別以 1 ms、1 µs、及 1 ns 為單位作延遲,都是採用 busy waiting 的方式。mdelay() 跟 ndelay() 都是用 udelay() 去做的,除非針對處理器架構特別另外實作。udelay() 雖然是 Linux Kernel 共通的函數,但其實作是處理器架構特定的,例如用指令週期去作延遲,有個基本的延遲迴圈函數,每 µs 延遲 loops_per_jiffy * HZ / 1000000 個指令週期。
mdelay() 是將時間乘以 1000 呼叫 udelay(),但避免乘以 loops_per_jiffy * HZ / 1000 溢出,大於 MAX_UDELAY_MS 會呼叫多次 udelay() 取代。
ndelay() 也是用 udelay() 去作,但最小延遲單位為 1 µs,所以 1~1000 ns 實際上都是延遲 1 µs。
以上 MAX_UDELAY_MS,mdelay, ndelay 都可以針對處理器架構定義 asm-???/dealy.h
如果要延遲小於 1 µs 呢?實際會出現在 IO 嗎?
@include/asm/delay.h --> include/asm-???/delay.h
這三個函數分別以 1 ms、1 µs、及 1 ns 為單位作延遲,都是採用 busy waiting 的方式。mdelay() 跟 ndelay() 都是用 udelay() 去做的,除非針對處理器架構特別另外實作。udelay() 雖然是 Linux Kernel 共通的函數,但其實作是處理器架構特定的,例如用指令週期去作延遲,有個基本的延遲迴圈函數,每 µs 延遲 loops_per_jiffy * HZ / 1000000 個指令週期。
mdelay() 是將時間乘以 1000 呼叫 udelay(),但避免乘以 loops_per_jiffy * HZ / 1000 溢出,大於 MAX_UDELAY_MS 會呼叫多次 udelay() 取代。
ndelay() 也是用 udelay() 去作,但最小延遲單位為 1 µs,所以 1~1000 ns 實際上都是延遲 1 µs。
以上 MAX_UDELAY_MS,mdelay, ndelay 都可以針對處理器架構定義 asm-???/dealy.h
如果要延遲小於 1 µs 呢?實際會出現在 IO 嗎?
- HZ (Linux 編譯設定)
- tick 頻率,由編譯參數 CONFIG_HZ 決定。
- jiffy
- tick 週期
- jiffies (Linux Kernel 系統變數)
- 從 Linux 開機開始算的 tick 計數。jiffy 意思是「瞬間」。
- loops_per_jiffy (Linux Kernel 系統變數,簡稱 lpj)
- 一個 jiffy 相當於多少 loop delay 的計數。在 Linux 開機時,calibrate_delay() @ init/calibrate.c 決定 loops_per_jiffy 值,開機參數 lpj= 可預設。
- BogoMIPS
- 每秒有多少百萬指令週期,相當於 loops_per_jiffy * HZ * 2 / 1000000,可用來預估處理器速度。Bogo 來自 Bogus,BogoMIPS 意指為「偽 MIPS」。
- Machine cycles (機械指令週期)
- CPU 執行週期,也就是 CPU 時脈的倒數,比 jiffy 更短。有些 CPU 會計數其時脈 (例如 Blackfin),並提供指令讀取。
星期四, 4月 01, 2010
Ethernet 封包格式與長度
← | 84-1538 octets | → | |
← | 72-1526 octets | → | |
Preamble 10101010 | Start-of-Frame-Delimiter 10101011 | Ethernet Frame | Interframe gap |
7 octets | 1 octet | 64-1518 octets | 12 octets |
Ethernet Frame
← | 64-1518 octets | → | ||||||
Destination MAC Address | Source MAC Address | Ethertype /Length | Payload | CRC32 | ||||
6 octets | 6 octets | 2 octets | 46-1500 octets | 4 octets | ||||
802.3 | Length | LLC | Payload | PAD | ||||
2 | 3 | |||||||
Novel | Length | Payload (0xFF 開頭) | ||||||
2 | Length | |||||||
0x0800 | IP datagram | |||||||
2 | 46-1500 | |||||||
0x0806 | ARP request/reply | PAD | ||||||
2 | 28 | 18 | ||||||
0x0835 | RARP request/reply | PAD | ||||||
2 | 28 | 18 | ||||||
0x8863 | PPPoE header | PPPoE Payload | ||||||
2 | 6 | 40-1494 | ||||||
0x8864 | PPPoE header | PPP protocol ID | PPP Payload | |||||
2 | 6 | 2 | 38-1492 |
- 最長封包為 1518 octets,但 VLAN Tagged 封包要多加 4 octets,Double Tagged 則要多加 8 octets。(可超過最長限制?)
- 最短封包 64 octets,低於此長度的封包稱為 runt frame。(最短限制原因?)
- 估計頻寬時,Ethernet 的 overhead 有 7 + 1 + 6 + 6 + 2 + 4 + 12 = 38 octets,另計 VLAN Tagging 部份。
- 常見的 Ethernet 封包格式是 Ethernet II,或稱為 DIX (DEC, Intel, and Xerox) frame, EtherType 會大等於 0×0600。802.3/Novel 範圍會在 0~1500 (0x05DC) ,代表是 Length。
- 802.3 格式開頭是 LLC,包含 DSAP、SSAP、Control 三個欄位:
- DSAP (Destination Service Access Point)
- LSB 為 0 表示個別位址,1 表示 group 位址。
- 剩下 7-bit 為 LSAP
- SSAP (Source Service Access Point)
- LSB 為 0 表示 command,1 表示 response。
- 剩下 7-bit 為 LSAP
- LSAP (Link Service Point)
- 2:LLC sublayer
- 6:IP
- 42:spanning tree protocol
- 152:ARP
- (0xAA):SNAP
- Control 有 U-format、I-format、S-format。 – 3 = UI, Un-numbered Information,用在 connectionless 應用。
- DSAP 和 SSAP 的 LSAP 是 SNAP (0xAA) 時,表示採用 SNAP 擴充,Payload 開頭會有 5-byte SNAP,包含 3-byte OUI 和 2-byte ProtocolId。OUI 是 00-00-00 時,PrototolId 是 EtherType。其它 OUI,自己定義 PrototolId。通常用在 connectionless 應用使用 UI,此時 Control 是 3,所以 LLC 常常是 AA-AA-03。
- Novel 格式的 Payload 開頭是 0xFF,一般不會出現在 DSAP。
- 參考:Ethernet (Wikipedia)
訂閱:
文章 (Atom)