星期二, 4月 27, 2010

nmap

這裡看到一個很強的工具 -- nmap,可以掃描通訊埠,找出對應的應用程式名稱、版本、狀態,此外也看 OS 版本、DNS 反查等。

nmap -sP 192.168.1.0/24
nmap -sn 192.168.1.0/24

參考:
  1. 鳥哥的使用說明
  2. 掃port利器開外掛 輕鬆擴充nmap掃描能力

星期六, 4月 24, 2010

Linux Firefox 看公視免費 VOD

公視免費 VOD 播放時除了需要支援 Windows Media Player 格式外,也用到 ActiveX 控制項。在 Firefox 安裝擴充套件 MediaWrap,將 ActiveX 多媒體控制項轉換成 Firefox 可支援的形式 (這裏有介紹),雖然無法快轉,或中途看起 (可能在 Windows 下的 IE 也是如此),但至少可以順利播放了。

星期六, 4月 17, 2010

讀:Five top causes of nasty embedded software bugs

五個最常犯的嵌入式軟體錯誤 Five top causes of nasty embedded software bugs
  1. Race condition,這些變數最好取名以 g_ 開頭,寫程式時特別注意。
  2. Non-reentrant 函式需加 mutex 保護,包括有些標準 C 函式庫,應該使用 "newlib" (寡聞了)
  3. 有些變數需要 volatile,不然有可能被編譯器最佳化掉,包括 task 或 ISR 間共用的全域變數、Memory-mapped Register、delay count
  4. 嵌入式系統比桌上型電腦更容易 Stack overflow,原因有記憶體較少、沒有 virtual memory、RTOS 將每個 task 的 stack 獨立、而 ISR 也會去用這些 stack。可在 stack 裡加 high water mark,定期去檢查 (例如在 watchdog 裡),被改變則紀錄下來並適當因應,例如 reboot。
  5. 動態記憶體 allocation 長時間後會造成 Heap fragment,該改用多種固定大小的 memory pool

星期四, 4月 15, 2010

圖檔

網路上使用圖檔,檔案越小越有利於資料傳輸,複雜的照片建議採用 JPG,動畫採用 GIF,其它則用 PNG。

星期日, 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

星期六, 4月 10, 2010

Linux hotplug

Linux 核心設定 HOTPLUG

自動執行 /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 的序號
block device 有環境變數 MEDIA_CHANGE,move 動作有環境變數 DEVPATH_OLD。

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
參考:
  1. linux-kernel:hotplug
  2. docs/mdev.txt
延伸閱讀
  • devfs:舊方式
  • udevd, udevtrigger
  • hotplug2:tiny 版,用 udevtrigger 作 coldplug,有用到 fork()

星期五, 4月 09, 2010

expr

expr 除了可以作數值運算外,也可作字串處理,例如:

算字串長度
expr length "字串"
取字串的第 3 字起 5 個字
expr substr "字串" 3 5

其它詳情可 man expr

星期四, 4月 08, 2010

目錄檔案字串替換

將目前目錄及子目錄中所有檔案中的 stringA 替換成 stringB

$ for i in `grep -rl stringA *`;do sed 's/stringA/stringB/g' $i > tmp; mv tmp $i; done

星期日, 4月 04, 2010

電腦漢字體

目前漢字印刷的四種主要字體 (font) 為宋體黑體仿宋體楷體
  • 楷體
  • 宋體 或稱明體,為宋朝因應印刷特性所需而發展的字體,到明朝逐漸流行。 筆畫一般是橫細豎粗,末端有裝飾部分(即「字腳」或「襯線」),點、撇、捺、鉤等筆畫有尖端。
  • 仿宋體 大部分仿製宋體而來,但擁有楷體的筆型,較像手書體,各筆劃等粗,字體較為瘦長。
  • 黑體類似西文無襯線字 (sans-serif),筆劃粗壯有力,撇捺等筆畫不尖,沒有過多的點綴,使人易於閱讀,減少視覺疲勞,特別是顯示在銀幕上。
襯線字 (serif)
  • 新細明體 (PMingLiU)
    • C:\WINDOWS\Fonts\minliu.ttc
    • 前身為細明體 (MingLiU),內含的英文字母為比例字體
    • 非常依賴 Hinting 技術,如沒有開啟 Hinting 功能,字體在放大時會有散開的。
  • 標楷體 (KaiU)
  • 教育部標準字體,有隸書、楷書及宋體。
    • 字型網址 或 連到「教育部」→ 找「單位介紹」→ 找「國語推行委員會」→ 「成果展示」→ 找「國字標準字體字形檔」,或連到「教育部」→ 選「資料下載」→ 搜尋「標準字」
    • 瀏覽器和列印可用這個字型,但是寫程式比較不適合,因為:1、i、l、I、j、9、q、g、o、0、O、8、B、6、b 等大部分的字型對這幾個字都辨視不易。
無襯線字 (sans-serif):開源的繁體字型似乎沒什麼好的選擇,很多都偏簡體風格,如常用的『誤』就不同 (參考:再談兩岸字形上的差異)。
  • 文泉驛正黑體 (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 儷黑、黑體繁
其它

星期六, 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 嗎?
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 FrameInterframe gap
7 octets 1 octet64-1518 octets12 octets

Ethernet Frame
64-1518 octets
Destination MAC Address Source MAC Address Ethertype /LengthPayloadCRC32
6 octets6 octets2 octets46-1500 octets4 octets
802.3LengthLLCPayloadPAD
23
NovelLengthPayload (0xFF 開頭)
2Length

0x0800IP datagram

246-1500

0x0806ARP request/replyPAD

22818

0x0835RARP request/replyPAD

22818

0x8863PPPoE
header
PPPoE Payload

2640-1494


0x8864
PPPoE
header
PPP
protocol
ID
PPP Payload

26238-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)
最後更新 20210209