Scenario 1
dispatch level > APC level > passive level
看到藍幕時,歡迎使用 bug check codes 看看發生什麼事。
!analyze -v
mov edi,edi 原來是每個函式進入點都有的東西,原因「微軟常常有安全更新,所以這邊可以改成 jmp ...」
一定要會的指令: "!analyze -v", dv, dt, r, db, eb, "?? 變數=值", ub, uf, u, k, kp, kP, bl, bc, bp, bu, bm (/1, /t, /p), x, .logopen, .logclose, .reload
vertarget, !process 0 0, lm, !drvobj, !devobj, !devstack, !devnode 0 1, !irpfind, !vm 1, !memusage, .chain, .trap, .cxr, .tss
!vm, !pool, !poolused, !poolvar, !memusage, !poolfind, !pte
Scenario 2
dt nt!_IRP addr
dt nt!_DEVICE_OBJECT addr
dt nt!_EPROCESS addr
!process 0 0
!process -1 0x1E
!thread -1 0xF
!thread ← 推卸責任的好工具 (誤)
.bugcheck
!verifier 3 SIoctl.sys
Scenario 3
kn
.frame 0
dv /V 可以看到 rsp+xx 的偏移量
ub 再 u 看上下文
啊,找到常見的 ptr = 0; *ptr = 1234; 這種錯。
f3cf6bbc f8b9a878 83a3ec00 00000000 00000420 nt!memset+0x41
!verifier 1
!pool 83a3ec00
上面是 memset(0x83a3ec00, 0x00000420);
從 !verifier 1 可以看到分配的 pool 有多大 (0x400)
然後發現給的太少要的太多 (笑)
Scenario 4
kd> !object \Driver
kd> !drvobj usbhub
Driver object (82931a00) is for:
\Driver\usbhub
Driver Extension List: (id , addr)
Device Object list:
82976918 82900c98
kd> !devstack 82976918
!DevObj !DrvObj !DevExt ObjectName
> 82976918 \Driver\usbhub 829769d0 00000063
8282e618 \Driver\usbuhci 8282e6d0 USBPDO-1
!DevNode 82926648 :
DeviceInst is "USB\ROOT_HUB\4&231024c6&0"
ServiceName is "usbhub"
kd> !devnode 82926648
DevNode 0x82926648 for PDO 0x8282e618
Parent 0x82a7aa68 Sibling 0000000000 Child 0000000000
InstancePath is "USB\ROOT_HUB\4&231024c6&0"
ServiceName is "usbhub"
State = DeviceNodeStarted (0x308)
Previous State = DeviceNodeEnumerateCompletion (0x30d)
StateHistory[09] = DeviceNodeEnumerateCompletion (0x30d)
StateHistory[08] = DeviceNodeStarted (0x308)
StateHistory[07] = DeviceNodeEnumerateCompletion (0x30d)
StateHistory[06] = DeviceNodeStarted (0x308)
StateHistory[05] = DeviceNodeStartPostWork (0x307)
StateHistory[04] = DeviceNodeStartCompletion (0x306)
StateHistory[03] = DeviceNodeResourcesAssigned (0x304)
StateHistory[02] = DeviceNodeDriversAdded (0x303)
StateHistory[01] = DeviceNodeInitialized (0x302)
StateHistory[00] = DeviceNodeUninitialized (0x301)
StateHistory[19] = Unknown State (0x0)
StateHistory[18] = Unknown State (0x0)
StateHistory[17] = Unknown State (0x0)
StateHistory[16] = Unknown State (0x0)
StateHistory[15] = Unknown State (0x0)
StateHistory[14] = Unknown State (0x0)
StateHistory[13] = Unknown State (0x0)
StateHistory[12] = Unknown State (0x0)
StateHistory[11] = Unknown State (0x0)
StateHistory[10] = Unknown State (0x0)
Flags (0x00000130) DNF_ENUMERATED, DNF_IDS_QUERIED,
DNF_NO_RESOURCE_REQUIRED
CapabilityFlags (0x00001602) DeviceD2, SurpriseRemovalOK,
WakeFromD0, WakeFromD2
kd> !devnode 82926648 1
DevNode 0x82926648 for PDO 0x8282e618
InstancePath is "USB\ROOT_HUB\4&231024c6&0"
ServiceName is "usbhub"
State = DeviceNodeStarted (0x308)
Previous State = DeviceNodeEnumerateCompletion (0x30d)
2011-01-26
2010-08-29
古蘭經 plugin
2010-08-18
詞頻列表
昨天寫信給張裕宏老師請安,今天就被 assign 作業了 ... 要生出台灣和大陸的詞頻列表,各22000個詞咧! (撞牆)
趕快來筆記一下:
中研院語言所 現代漢語語料庫詞頻統計
《八十七年口語問卷詞頻資料庫》 ... 區分國小國中高中大學。DBF 格式 (dBase III) 配上倚天中文造字檔! 真懷念。決定不用。
教育部國語詞典簡編本 詞頻表
國語詞典簡編本的統計樣本不知道有哪些。最常用的前十個詞列出來給大家看看: 我們、「台灣」、可以、自己、他們、沒有、因為、可能、如果、問題。
台灣的詞頻排第二名!!! 這個樣本可能完全是報紙、特別是第一疊嚴肅新聞版的! (那「我們」為什麼會在報紙出現呢?)
中研院語言所的沒分單音節詞和多音節... 前十個是: 的、是、一、在、有、個、我、不、了、這。
前12個多音節詞是: 我們、自己、他們、因為、什麼、問題、所以、沒有、台灣、學生、公司、表示、如果 ..
中研院的語料確實以書面為主,所以口語最常用的「因為、所以、沒有、如果、可是、但是」沒排在最前面。
但是「台灣」排第九,還是很令人驚訝! 書面文章裡這麼常提到台灣嗎?
47m 個漢字的 SUBTLEX-CH:中文字頻/詞頻/標注詞頻(PoS)
基于网页的词频统计 基本上是不堪用的。
Lukhnos 提供的 Lancaster Corpus of Mandarin Chinese 詞頻
最重要的: 人民日報的一直找不到!!!
趕快來筆記一下:
中研院語言所 現代漢語語料庫詞頻統計
《八十七年口語問卷詞頻資料庫》 ... 區分國小國中高中大學。DBF 格式 (dBase III) 配上倚天中文造字檔! 真懷念。決定不用。
教育部國語詞典簡編本 詞頻表
國語詞典簡編本的統計樣本不知道有哪些。最常用的前十個詞列出來給大家看看: 我們、「台灣」、可以、自己、他們、沒有、因為、可能、如果、問題。
台灣的詞頻排第二名!!! 這個樣本可能完全是報紙、特別是第一疊嚴肅新聞版的! (那「我們」為什麼會在報紙出現呢?)
中研院語言所的沒分單音節詞和多音節... 前十個是: 的、是、一、在、有、個、我、不、了、這。
前12個多音節詞是: 我們、自己、他們、因為、什麼、問題、所以、沒有、台灣、學生、公司、表示、如果 ..
中研院的語料確實以書面為主,所以口語最常用的「因為、所以、沒有、如果、可是、但是」沒排在最前面。
但是「台灣」排第九,還是很令人驚訝! 書面文章裡這麼常提到台灣嗎?
47m 個漢字的 SUBTLEX-CH:中文字頻/詞頻/標注詞頻(PoS)
基于网页的词频统计 基本上是不堪用的。
Lukhnos 提供的 Lancaster Corpus of Mandarin Chinese 詞頻
最重要的: 人民日報的一直找不到!!!
2010-07-23
2010-04-30
PHC-WIN + WinBinder 的小技巧
最近因為需要在 Windows 下寫一點小工具,於是想起了久久沒用的 RoadSend PHP compiler 。
RoadSend 不錯用,不過最近的版本好像 GTK 支援壞掉了,而且要使用者裝 GTK library, 好像不太友善,於是轉而尋求其他方案...
WinBinder 是套 PHP 的 Win32 API Binder,很好用,速度蠻快的,寫起程式也很直觀,反正都在 Win32 下了,就別想什麼可攜性吧 (笑) ,用用 Win32 API 和 COM 快速解決問題就好。
除了 RoadSend 之外,我找到了 Bambalam Compiler 和 PHC-WIN。
bamcompile (Bambalam Compiler) 一般情況下很好用,對 WinBinder 的支援很好,產生出來的 EXE 檔不大,只支援 PHP4。實際使用時,發現它處理太大的資料時 (我要把一個幾千行的 excel 檔讀進來,排序,輸出) ,會直接當掉。
PHC-WIN 0.3.1 是可用的選擇,優點是支援 PHP5,處理很大的 excel 也很穩定,但缺點是需要把以下檔案連同 EXE 檔包成一塊...
一下子目錄就多了 5MB, 感覺蠻差的,但至少可以把事情做好...
有個小技巧可以節省空間:抓 Alec Gorge 包好的 DLL 檔,可以省到 3MB,檔案也只要4個:
記得 php-embed.ini 裡要把其他 DLL 檔拿掉,改成這樣:
此外,由於 PHC-WIN 還在開發初期,有一些小技巧可以讓開發更順利... 我可是被它的小 bug 卡住整整一個工作天呢!
技巧1: 砍掉備份檔,只留 .php -- 如 vim 的 *.php~
技巧2: 砍掉 .phb 檔 -- 重編譯不一定會覆蓋! 砍掉比較保險
技巧3: 發佈前先 copy 到別台電腦測試 -- 少掉很多「明明在我這裡跑得動」的對話
技巧4: 移除 PHP 安裝 -- 不要再用 installer 了,免得載入哪一版 DLL 傻傻分不清。
技巧5: 主檔案叫 myprog.phpw 然後把 WinBinder 裝好,節省開發時間。記得用 c:\winbinder\binary\php4\php.exe myprog.phpw 來測試,不然很多錯誤訊息看不到...
技巧6: 和 bamcompile 一樣,但不知道為什麼 PHC-WIN 的手冊沒寫得很清楚。以下是 WinBinder + Excel Reader 的引入檔...
祝大家開發順利啦!
RoadSend 不錯用,不過最近的版本好像 GTK 支援壞掉了,而且要使用者裝 GTK library, 好像不太友善,於是轉而尋求其他方案...
WinBinder 是套 PHP 的 Win32 API Binder,很好用,速度蠻快的,寫起程式也很直觀,反正都在 Win32 下了,就別想什麼可攜性吧 (笑) ,用用 Win32 API 和 COM 快速解決問題就好。
除了 RoadSend 之外,我找到了 Bambalam Compiler 和 PHC-WIN。
bamcompile (Bambalam Compiler) 一般情況下很好用,對 WinBinder 的支援很好,產生出來的 EXE 檔不大,只支援 PHP4。實際使用時,發現它處理太大的資料時 (我要把一個幾千行的 excel 檔讀進來,排序,輸出) ,會直接當掉。
PHC-WIN 0.3.1 是可用的選擇,優點是支援 PHP5,處理很大的 excel 也很穩定,但缺點是需要把以下檔案連同 EXE 檔包成一塊...
php5ts.dll
php_bcompiler.dll
php_win32std.dll
php_winbinder.dll
php-embed.ini
一下子目錄就多了 5MB, 感覺蠻差的,但至少可以把事情做好...
有個小技巧可以節省空間:抓 Alec Gorge 包好的 DLL 檔,可以省到 3MB,檔案也只要4個:
myprogram.exe
php-embed.ini ← 記得要修改
php5ts.dll ← 這是 Alec Gorge 的
php_bcompiler.dll
記得 php-embed.ini 裡要把其他 DLL 檔拿掉,改成這樣:
[PHP]
extension_dir='./'
extension=php_bcompiler.dll
此外,由於 PHC-WIN 還在開發初期,有一些小技巧可以讓開發更順利... 我可是被它的小 bug 卡住整整一個工作天呢!
技巧1: 砍掉備份檔,只留 .php -- 如 vim 的 *.php~
技巧2: 砍掉 .phb 檔 -- 重編譯不一定會覆蓋! 砍掉比較保險
技巧3: 發佈前先 copy 到別台電腦測試 -- 少掉很多「明明在我這裡跑得動」的對話
技巧4: 移除 PHP 安裝 -- 不要再用 installer 了,免得載入哪一版 DLL 傻傻分不清。
技巧5: 主檔案叫 myprog.phpw 然後把 WinBinder 裝好,節省開發時間。記得用 c:\winbinder\binary\php4\php.exe myprog.phpw 來測試,不然很多錯誤訊息看不到...
技巧6: 和 bamcompile 一樣,但不知道為什麼 PHC-WIN 的手冊沒寫得很清楚。以下是 WinBinder + Excel Reader 的引入檔...
function exe_resource($file)
{
return defined('EMBEDED') ? 'res:///PHP/'.strtoupper(md5($file)) : (getcwd()."/$file");
}
include_once(exe_resource('./wb_windows.inc.php'));
include_once(exe_resource('./wb_generic.inc.php'));
include_once(exe_resource('./wb_resources.inc.php'));
include_once(exe_resource('./oleread.inc.php'));
include_once(exe_resource('./reader.php'));
祝大家開發順利啦!
2010-03-30
不可靠的 compiler
最近連續好幾個被 compiler 陷害的 bug ... 公司內有 MRC Code 用 Visual Studio 2003 的 VC++ compile 出來的東西,加一行減一行就看不到 bug 的問題; CPLD code 重新 compile 後 bug 就不見的問題,我自己做的玩具也被 8051 用的 SDCC 害到。公司的不便多說,先講講 SDCC 害人的情況。
主要是,程式寫好後用模擬器 (S51DEMO) 怎麼跑都OK,但一燒上 AT89S51 就不會動,hang 在 serial_init() 的位置。動用 /* 註解 */ 大法,終於找到問題出在一行 char str[] = {} 宣告:
重點在 __code。如果不加的話,SDCC 會把它 compile 成 __DATA 很詭異地賦予初值,然後 AT89S51 就當在這了:
加了之後,就會是和其他字串常數一樣正常的 assembly code:
主要是,程式寫好後用模擬器 (S51DEMO) 怎麼跑都OK,但一燒上 AT89S51 就不會動,hang 在 serial_init() 的位置。動用 /* 註解 */ 大法,終於找到問題出在一行 char str[] = {} 宣告:
__code unsigned char str[] = {
0x12, 0x33, 0xf0, 0x33, 0xf0, 0x12, // H
0x24, 0xf0, 0x24, // e
// ...
0x00 } ;
重點在 __code。如果不加的話,SDCC 會把它 compile 成 __DATA 很詭異地賦予初值,然後 AT89S51 就當在這了:
; kbd.c:168: unsigned char str[] = {
mov _main_str_1_1,#0x12
mov (_main_str_1_1 + 0x0001),#0x33
mov (_main_str_1_1 + 0x0002),#0xF0
mov (_main_str_1_1 + 0x0003),#0x33
mov (_main_str_1_1 + 0x0004),#0xF0
; ...
mov (_main_str_1_1 + 0x0024),#0x00
; 誰能告訴我為什麼 8051 執行過這邊就當掉 =.=
加了之後,就會是和其他字串常數一樣正常的 assembly code:
_main_str_1_1:
.db #0x12 ; 18
.db #0x33 ; 51
.db #0xF0 ; 240 ?
.db #0x33 ; 51
.db #0xF0 ; 240 ?
.db #0x12 ; 18
; ...
.db #0x00 ; 0
2008-09-11
[好站]用各種語言實現演算法
Gentoo : Intel® Pentium® 4 Computer Language Benchmarks Game
很有趣,OCaml 其實還蠻快的,Python/PHP/Ruby 自然慢得不得了,Scheme 竟然很慢(怪!) 但 LISP SBCL 非常快!
有兩個語言出乎意料:
Isaac
Smart Eiffel
該找時間研究一下...
很有趣,OCaml 其實還蠻快的,Python/PHP/Ruby 自然慢得不得了,Scheme 竟然很慢(怪!) 但 LISP SBCL 非常快!
有兩個語言出乎意料:
Isaac
Smart Eiffel
該找時間研究一下...
2008-09-06
DOS下使用flat mode的好工具 -- Watcom C
部門的專案要在 DOS 下存取 ACPI Table。依據 ACPI Specification 3.0b,ACPI Table 首先是在 F000:0000-FFFF 段中放一段 RSDP,由 "RSD PTR " 標示 RSDP 進入點,從那找到 XSDT (32位元位址,通常在 0x7Fxx_xxxx) 後,再查到 FADT 及 DSDT 。由於 XSDT, FADT, DSDT 都在32位元位址,偷懶的我自然想找些 DOS Extender 來處理,不想自己切進保護模式。
我首先想到的是 djgpp 。一直以來 djgpp 用得十分順手,像這樣:
可是,不知道為什麼,只要存取到 0x7F 位址,SIGSEGV 馬上就跑出來,查了 ds selector 的範圍,一切都 OK ,但程式就是動不了。
爬文爬了很久,有人用 Borland C++ 編出來的程式能動,但我不想裝 Borland C++. 靈機一動,想起 DOS4GW ,上網一找果然 Watcom C 已經釋出成為免費軟體了,改名叫 Open Watcom。
照著範例寫一寫,32-bit flat mode 真的很棒,像這樣:
這樣就可以存取了耶,讚!因為這樣我就可以
了,簡捷易懂,而且以 Watcom C 的強大最佳化能力,應該不會和 djgpp 的 movedate() 差多少。
Watcom 的編譯是另一個問題。DOS 下編譯器的開關百百種,Makefile 也是各家不同。Turbo C 和 GNU Make 很不同,Watcom 也有自己的 wmake 格式。此外,32-bit flat mode 可以選的 DOS extender 非常多種,但同樣的 ACPI 程式,用 CauseWay 一樣會 SIGSEGV,但用 DOS4GW 和 PMODE/W 卻非常 OK。幸好,Open Watcom 附上了一個 IDE, 可以幫忙設定幾個旗標,再配上 sample 目錄下的 makefile, 很快就可以做出自己想要的效果了。
Watcom 的 makefile 長這樣:
天啊! 什麼鬼... 還好有 sample 可以參考。把 LNKOPT 的 pmodew 換成 dos4g, 就可以做成用 DOS4GW 的執行檔了。
選用哪個 extender 也得比較比較。djgpp 預設使用 CSDPMI,沒事帶著幾個 DPMI run-time 挺煩人的。DOS4GW 一叢大大 200 多 K, 一樣讓人心情不佳。DOS/32A 很棒,但 PMODE/W 更棒更小,整個程式做完只要 30K ,不需外掛 run-time. 使用 extender 省下的切進切出保護模式的時間,也實在是讓人夠開心了。
最後講一些 djgpp 和 Watcom 的差異。這困擾了我幾個小時...
makefile 不同是小事,反正我都寫些小工具,大不了寫批次檔。差異都是些討厭的地方,像..
djgpp:
Watcom:
這點比較起來,Watcom 的似乎比較 ANSI 一點呢! 可是啊,我真是太~~愛 djgpp 的 AT&T 式組語了。真好用。這下要切回 MASM 相容模式,還需要一點點適應的時間...
我首先想到的是 djgpp 。一直以來 djgpp 用得十分順手,像這樣:
char x = _farpeekb(_dos_ds, 0xFFFFFFE4); 或是
movedata(_dos_ds, base, _my_ds(), (unsigned)buf, len);
可是,不知道為什麼,只要存取到 0x7F 位址,SIGSEGV 馬上就跑出來,查了 ds selector 的範圍,一切都 OK ,但程式就是動不了。
爬文爬了很久,有人用 Borland C++ 編出來的程式能動,但我不想裝 Borland C++. 靈機一動,想起 DOS4GW ,上網一找果然 Watcom C 已經釋出成為免費軟體了,改名叫 Open Watcom。
照著範例寫一寫,32-bit flat mode 真的很棒,像這樣:
char *ptr = (char *)0x000FFFEA;
char x = ptr[0];
這樣就可以存取了耶,讚!因為這樣我就可以
for(i = 0; i < len; i++) buf[i] = ptr[i];
了,簡捷易懂,而且以 Watcom C 的強大最佳化能力,應該不會和 djgpp 的 movedate() 差多少。
Watcom 的編譯是另一個問題。DOS 下編譯器的開關百百種,Makefile 也是各家不同。Turbo C 和 GNU Make 很不同,Watcom 也有自己的 wmake 格式。此外,32-bit flat mode 可以選的 DOS extender 非常多種,但同樣的 ACPI 程式,用 CauseWay 一樣會 SIGSEGV,但用 DOS4GW 和 PMODE/W 卻非常 OK。幸好,Open Watcom 附上了一個 IDE, 可以幫忙設定幾個旗標,再配上 sample 目錄下的 makefile, 很快就可以做出自己想要的效果了。
Watcom 的 makefile 長這樣:
LNKOPT = option quiet system pmodew
exes = oemid.exe pmbase.exe
all : $(exes) .SYMBOLIC
@%null
oemid.exe : oemid.obj
wlink $(LNKOPT) name oemid file oemid
.c.obj :
$(CC) $^& $(CFLAGS)
天啊! 什麼鬼... 還好有 sample 可以參考。把 LNKOPT 的 pmodew 換成 dos4g, 就可以做成用 DOS4GW 的執行檔了。
選用哪個 extender 也得比較比較。djgpp 預設使用 CSDPMI,沒事帶著幾個 DPMI run-time 挺煩人的。DOS4GW 一叢大大 200 多 K, 一樣讓人心情不佳。DOS/32A 很棒,但 PMODE/W 更棒更小,整個程式做完只要 30K ,不需外掛 run-time. 使用 extender 省下的切進切出保護模式的時間,也實在是讓人夠開心了。
最後講一些 djgpp 和 Watcom 的差異。這困擾了我幾個小時...
makefile 不同是小事,反正我都寫些小工具,大不了寫批次檔。差異都是些討厭的地方,像..
djgpp:
asm { "cli" }
outportl(0xcf8, i & ~3);
x = inportl(0xcfc);
asm { "sti" }
movedata(_dos_ds, RSDP+24, _my_ds(), XSDT, 4); /* 32位元位置 = 4 bytes */
Watcom:
__asm { "cli" }
outpd(0xcf8, i & ~3);
x = inpd(0xcfc);
__asm { "sti" }
#define PTRPTR(x) (char *) *(char **)(x)
XSDT = PTRPTR(RSDP+24); /* 存取指標的指標 */
這點比較起來,Watcom 的似乎比較 ANSI 一點呢! 可是啊,我真是太~~愛 djgpp 的 AT&T 式組語了。真好用。這下要切回 MASM 相容模式,還需要一點點適應的時間...
2008-08-22
DOS 下使用 NetBIOS
有經過 DOS 時代的人應該不陌生,所以只是寫在這裡留個紀錄。程式不知道還受不受版權保護,所以先不放上來...
config.sys:
DEVICEHIGH=\NET\PROTMAN.DOS /i:\NET
DEVICEHIGH=\NET\B57.dos
DEVICEHIGH=\NET\NTSTS.DOS
DEVICEHIGH=\NET\DLSHELP.SYS
DEVICEHIGH=\NET\DIS_PKT.DOS
autoexec.bat:
NETBIND.COM
SET TCPHELP=A:\NET
SET ETCDIR=A:\NET
set wattcp=a:\net\wattcp.cfg
\NET\NET START /YES /COMPUTERNAME:*
\NET\NET.EXE USE X: \\server\dir
config.sys:
DEVICEHIGH=\NET\PROTMAN.DOS /i:\NET
DEVICEHIGH=\NET\B57.dos
DEVICEHIGH=\NET\NTSTS.DOS
DEVICEHIGH=\NET\DLSHELP.SYS
DEVICEHIGH=\NET\DIS_PKT.DOS
autoexec.bat:
NETBIND.COM
SET TCPHELP=A:\NET
SET ETCDIR=A:\NET
set wattcp=a:\net\wattcp.cfg
\NET\NET START /YES /COMPUTERNAME:*
\NET\NET.EXE USE X: \\server\dir
2008-08-14
在 Aspire One Linux 安裝 VirtualBox
即使 Linux 桌面已經很好用了,還是難免有需要用到 IE 、網路銀行、電子下單等等功能的時候,所以安裝一套 VirtualBox 再裝個 Windows XP 或 2000 應該是再好不過的選擇了。恰好,宏碁今天早上釋出了 Aspire One Linux 用的 2.6.23.9lw 的 kernel source ,我們正好拿來試試。
先說個題外話。他們剛釋出原始碼不久,我就接到宏碁請託本公司某部門的人來電關切,說大家可以認識認識,有什麼需求當面比較容易談清楚。不過既然原始碼都放出來,也就不用見面了,廠商客戶雙贏,挺好的。
安裝有一些要點: (1)需要 vboxdrv.ko (2)要把 user 加進 vboxusers 群組 (3)之前關掉 swap 的人記得先暫時加回去。以下分項說明。
先去下載VirtualBox,選擇 Fedora 8 (i386) 版,進 terminal 中 rpm -ivh VirtualBox-1.6.4_33808_fedora8-1.rpm 。這時候一定會看到無法編譯 kernel module 的訊息。沒關係,我們下一步就要處理。
編譯 vboxdrv.ko
先講正規的做法。首先,去 Aspire One 的FTP站下載核心原始碼。建議下載到裝在桌機的 Linux 再編譯...
由於他們使用 zip 壓縮,symbole link 被還原了,所以其中有一個目錄得先砍掉,否則不能編譯。假設你下載到另一台 Linux 上的 /usr/src ,解開來,然後輸入以下命令:
編譯完後,把整個目錄 tar 起來 copy 到 Aspire One 上面,或是 rsync 一下... 然後,為了編譯 vboxdrv 需要再安裝一些套件:
最後執行
我知道這些步驟對一般 user 來說不容易,所以準備好編譯完的檔案,請下載後,輸入
修改執行環境
打開編輯器,修改 /etc/group ,找到下面這行,然後加上 user:
vboxusers:x:502:user
需要重新開機。
安裝 Guest OS
安裝前,記得進 terminal ,掛進剛剛做好的 module 。如果你按照前幾篇關掉了 swap,這時候最好先加回來... 建議! 如果你在桌機上裝好再 copy vdi 檔過來,就不用加 swap 了。
然後在桌面上按右鍵選「系統→Sun xVM VirtualBox」,用 user 的權限開進去。
建議先在桌機上安裝,安裝好後再把 .vdi copy 進來。安裝需要一點時間...
有圖有真相:

切 Virtual Disk 的時候記得指定 /media/disk/xp.vdi ,不然它還是會寫進 SSD 裡。

快照資料夾順便改一下:

要從網路芳鄰 share CD-ROM 再安裝雖然可以,但還是比較建議先在桌機裝好再說:

如果出現這個畫面,表示你忘了 /etc/init.d/vboxdrv start:

裝吧裝吧~~

繼續努力~~

開起來了! 耶~

補充說明
如果要外掛 USB 硬碟,或許你需要 ntfs 驅動程式... 試試
如果你在桌機安裝,建議先把 Storage Expansion 裡的 SD 卡拿到桌機再 copy vdi 檔,不然你會覺得 Aspire One 好像當掉一樣,但事實上... 我也不確定當了沒。在桌機 copy 一整個 4GB 的 vdi 檔到 SD 卡,約需要 13 分鐘。
先說個題外話。他們剛釋出原始碼不久,我就接到宏碁請託本公司某部門的人來電關切,說大家可以認識認識,有什麼需求當面比較容易談清楚。不過既然原始碼都放出來,也就不用見面了,廠商客戶雙贏,挺好的。
安裝有一些要點: (1)需要 vboxdrv.ko (2)要把 user 加進 vboxusers 群組 (3)之前關掉 swap 的人記得先暫時加回去。以下分項說明。
先去下載VirtualBox,選擇 Fedora 8 (i386) 版,進 terminal 中 rpm -ivh VirtualBox-1.6.4_33808_fedora8-1.rpm 。這時候一定會看到無法編譯 kernel module 的訊息。沒關係,我們下一步就要處理。
編譯 vboxdrv.ko
先講正規的做法。首先,去 Aspire One 的FTP站下載核心原始碼。建議下載到裝在桌機的 Linux 再編譯...
由於他們使用 zip 壓縮,symbole link 被還原了,所以其中有一個目錄得先砍掉,否則不能編譯。假設你下載到另一台 Linux 上的 /usr/src ,解開來,然後輸入以下命令:
# unzip ~/Aspire_One_Linpus_Linux/Aspire_One_Source/linux-2.6.23.9lw.zip
# cd linux-2.6.23.9/
# cp ../config_080627 .config
# cd include
# rm -fr asm
# cd ..
# make oldconfig
# make bzImage modules
編譯完後,把整個目錄 tar 起來 copy 到 Aspire One 上面,或是 rsync 一下... 然後,為了編譯 vboxdrv 需要再安裝一些套件:
yum install make gcc
最後執行
/etc/init.d/vboxdrv setup就解決了。
我知道這些步驟對一般 user 來說不容易,所以準備好編譯完的檔案,請下載後,輸入
tar zfx vboxdrv.tgz -C /就裝好 vboxdrv.ko 了。
修改執行環境
打開編輯器,修改 /etc/group ,找到下面這行,然後加上 user:
vboxusers:x:502:user
需要重新開機。
安裝 Guest OS
安裝前,記得進 terminal ,掛進剛剛做好的 module 。如果你按照前幾篇關掉了 swap,這時候最好先加回來... 建議! 如果你在桌機上裝好再 copy vdi 檔過來,就不用加 swap 了。
su -
/etc/init.d/vboxdrv start
/etc/init.d/vboxnet start
# 要加 swap 的話請打下面 4 行. 這樣才不會傷害脆弱的 SSD? (誤)
cd /media/disk
dd if=/dev/zero of=swap.1 bs=1k count=1024k
mkswap swap.1
swapon swap.1
然後在桌面上按右鍵選「系統→Sun xVM VirtualBox」,用 user 的權限開進去。
建議先在桌機上安裝,安裝好後再把 .vdi copy 進來。安裝需要一點時間...
有圖有真相:

切 Virtual Disk 的時候記得指定 /media/disk/xp.vdi ,不然它還是會寫進 SSD 裡。

快照資料夾順便改一下:

要從網路芳鄰 share CD-ROM 再安裝雖然可以,但還是比較建議先在桌機裝好再說:

如果出現這個畫面,表示你忘了 /etc/init.d/vboxdrv start:

裝吧裝吧~~

繼續努力~~

開起來了! 耶~

補充說明
如果要外掛 USB 硬碟,或許你需要 ntfs 驅動程式... 試試
yum install ntfs-3g
如果你在桌機安裝,建議先把 Storage Expansion 裡的 SD 卡拿到桌機再 copy vdi 檔,不然你會覺得 Aspire One 好像當掉一樣,但事實上... 我也不確定當了沒。在桌機 copy 一整個 4GB 的 vdi 檔到 SD 卡,約需要 13 分鐘。
賀! 宏碁釋出 kernel 原始碼
需要的人請到 ftp://Guest@csdftp.acer.com.tw/ 下載。
晚一點來把它 compile 起來... 然後把 VirtualBox 包一包吧~~:D
晚一點來把它 compile 起來... 然後把 VirtualBox 包一包吧~~:D
2008-08-08
調校你的 Aspire One (Linux) #8 - 雙螢幕顯示
因為有 xrandr 的關係,雙螢幕顯示再容易不過了。Aspire One 上的雙螢幕顯示出處在此,我只是翻譯整理一下。
以下設定要改動 /etc/X11/xorg.conf ,請小心使用,以免開不了機。真的改壞了,用任何一張 Linux LiveCD 開起來再改回來就好。
接投影機一般是 1024x768, 接 19" 液晶螢幕一般是 1280x1024, 把掃瞄頻率定在 60Hz. 修改 xorg.conf, 把倒數第 3 行的 Virtual 1024 600 改成 Virtual 2304 1024。
上面幾行有一個 Modeline "1024x600", 在那下面加上
Modeline "1024x768" 64.11 1024 1080 1184 1344 768 769 772 795 -HSync +Vsync
Modeline "1280x1024" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
如果覺得麻煩,請到這裡下載我的 xorg.conf
雖然 Aspire One 手上冊說外接螢幕前必須重開機,可是實驗發現,可以不用重新開機,直接使用下列命令:
xrandr --output VGA --right-of LVDS --mode 1280x1024
把 1280x1024 改成 1024x768 就適用於投影機了。
VGA 指的是外接螢幕,LVDS 指的就是筆電上的 LCD。如果要回到原來的單螢幕,只要下:
xrandr --output VGA --off
更多 xrandr 的使用方法請看這裡。
這兩行 Modeline 的產生方法是從這裡看來的,使用以下命令:
gtf 1024 768 60 # 60Hz
Aspire One 不支援 --rorate 命令,算是美中不足之處。
以下設定要改動 /etc/X11/xorg.conf ,請小心使用,以免開不了機。真的改壞了,用任何一張 Linux LiveCD 開起來再改回來就好。
接投影機一般是 1024x768, 接 19" 液晶螢幕一般是 1280x1024, 把掃瞄頻率定在 60Hz. 修改 xorg.conf, 把倒數第 3 行的 Virtual 1024 600 改成 Virtual 2304 1024。
上面幾行有一個 Modeline "1024x600", 在那下面加上
Modeline "1024x768" 64.11 1024 1080 1184 1344 768 769 772 795 -HSync +Vsync
Modeline "1280x1024" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
如果覺得麻煩,請到這裡下載我的 xorg.conf
雖然 Aspire One 手上冊說外接螢幕前必須重開機,可是實驗發現,可以不用重新開機,直接使用下列命令:
xrandr --output VGA --right-of LVDS --mode 1280x1024
把 1280x1024 改成 1024x768 就適用於投影機了。
VGA 指的是外接螢幕,LVDS 指的就是筆電上的 LCD。如果要回到原來的單螢幕,只要下:
xrandr --output VGA --off
更多 xrandr 的使用方法請看這裡。
這兩行 Modeline 的產生方法是從這裡看來的,使用以下命令:
gtf 1024 768 60 # 60Hz
Aspire One 不支援 --rorate 命令,算是美中不足之處。
調校你的 Aspire One (Linux) #7 - MSN
官方的 IM 在失效後 3 天終於放出更新了! 不過,我們可以改用其他同樣是開放原始碼的 IM ,才不用等待官方修正的時間。
建議安裝 emesene: 在桌面按右鍵,選「新增/移除軟體」,點「搜尋」並輸入 "emesene",打個勾,就安裝好了。
M$ 在 7/20 左右更改了 MSN protocol (這也是宏碁的IM之前失效的原因吧?),所以我們要修改一下:
想要修改桌面上的捷徑嗎?用編輯器打開 /usr/share/applications/acerim.desktop ,找到 Exec=UIM 改成 Exec=emesene 就可以了。記得重新開機 reload 桌面哦!
建議安裝 emesene: 在桌面按右鍵,選「新增/移除軟體」,點「搜尋」並輸入 "emesene",打個勾,就安裝好了。
M$ 在 7/20 左右更改了 MSN protocol (這也是宏碁的IM之前失效的原因吧?),所以我們要修改一下:
sudo sed -i.bak 's/09607671-1C32-421F-A6A6-CBFAA51AB5F4/CFE80F9D-180F-4399-82AB-413F33A1FA11/g' /usr/share/emesene/emesenelib/XmlTemplates.py
想要修改桌面上的捷徑嗎?用編輯器打開 /usr/share/applications/acerim.desktop ,找到 Exec=UIM 改成 Exec=emesene 就可以了。記得重新開機 reload 桌面哦!
調校你的 Aspire One (Linux) #6 - Firefox 3
安裝 Firefox 3 的方法,原出處在 Acer Aspire One User Forum。
簡言之,到官網下載 Firefox 3.0.1 (或更新版本),然後 alt-f2 進 terminal 後打指令:
就搞定了。Firefox 的 Cache 會存在 ~/.mozilla/firefox/... 裡面,這樣有幾個問題 1.可能比較慢 2.沒裝 Storage Expansion (左手邊插的SD卡) 的話,會操到 SSD 。如果你很在意這個問題,並且沒那麼在意浪費一點網路頻寬,那可以做下面的修改...
剩下調校效能的設定,像 turbo 或 pipeline 請參考來自火星maggie的秘密花園。
Firefox 的 plugin ,建議安裝 Adblock Plus 和 Flashblock ,否則一開起來就很吃資源。
Firefox 操作介面的字型大小,在 ~/.mozilla/firefox/*-default/chrome 裡可以修改,可是我有點改不動... 有心得再貼上來。
簡言之,到官網下載 Firefox 3.0.1 (或更新版本),然後 alt-f2 進 terminal 後打指令:
tar jfx firefox-3.0.1.tar.gz -C /opt
cd /usr/bin
mv firefox ff2
ln -s /opt/firefox/firefox
# 不安裝 plugins 的話不用打下面這兩行
cd /opt/firefox/plugins
ln /usr/lib/mozilla/plugins/* .
就搞定了。Firefox 的 Cache 會存在 ~/.mozilla/firefox/... 裡面,這樣有幾個問題 1.可能比較慢 2.沒裝 Storage Expansion (左手邊插的SD卡) 的話,會操到 SSD 。如果你很在意這個問題,並且沒那麼在意浪費一點網路頻寬,那可以做下面的修改...
- 打開 Firefox
- 在網址列打 about:config, 在空白的地方按右鍵新增機碼。
新增「字串」 browser.cache.disk.parent_directory 填入 /tmp
新增「真假」 config.trim_on_minimize 填入 true
剩下調校效能的設定,像 turbo 或 pipeline 請參考來自火星maggie的秘密花園。
Firefox 的 plugin ,建議安裝 Adblock Plus 和 Flashblock ,否則一開起來就很吃資源。
Firefox 操作介面的字型大小,在 ~/.mozilla/firefox/*-default/chrome 裡可以修改,可是我有點改不動... 有心得再貼上來。
調校你的 Aspire One (Linux) #5 - GNU parted
注意! 請插上 AC 電源後再操作。
我們把 swap 關掉後,空出來的 1GB 可以不理它,也可以另外切成 partition 掛在某個目錄下。如果你一定想要把原來的 /dev/sda1 擴大到整顆 SSD 的話,就需要使用 GNU parted 。帝國反抗君寫了一篇很實用的文章,照著他的步驟操作,格式化一顆 32MB 的隨身碟,放進 GNU parted,裝上 syslinux ,放到 Aspire One 上開機... 就可以直接擴大分割區了。
擴大約需 30 分鐘(很傷 MLC SSD, 嗚~~) 擴大後,我目前的分割區如下:
我們把 swap 關掉後,空出來的 1GB 可以不理它,也可以另外切成 partition 掛在某個目錄下。如果你一定想要把原來的 /dev/sda1 擴大到整顆 SSD 的話,就需要使用 GNU parted 。帝國反抗君寫了一篇很實用的文章,照著他的步驟操作,格式化一顆 32MB 的隨身碟,放進 GNU parted,裝上 syslinux ,放到 Aspire One 上開機... 就可以直接擴大分割區了。
擴大約需 30 分鐘(很傷 MLC SSD, 嗚~~) 擴大後,我目前的分割區如下:
[user@localhost ~]$ df -h
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sda1 7.4G 2.7G 4.5G 37% /
none 755M 0 755M 0% /dev/shm
none 755M 184K 755M 1% /var/tmp
none 755M 48K 755M 1% /var/log
none 7.4G 2.7G 4.5G 37% /mnt/home
/dev/mmcblk0p1 7.6G 221M 7.4G 3% /media/disk
posix-overlay(/media/disk)
7.6G 221M 7.4G 3% /tmp/posixdir
2008-08-07
調校你的 Aspire One (Linux) #4 - tmpfs, swap
如果你的 Aspire One 安裝超過 1GB (建議 1.5GB) 的記憶體,才要使用本節的內容。
首先,把一些常用的快取目錄掛上 tmpfs ,tmpfs 相當於 ramdisk ,存取速度很快、又可以保護脆弱的 MLC SSD。
試了很久,可行的做法如下:進 terminal 後 sudo 成 root, 修改 /etc/fstab 檔
並在 swap 所在的那行前面打 # 如 # /dev/sda2 swap ...
(註: /var/tmp 不打 mode=1777 也可以,事實上 /etc/rc.d/rc.last 裡每次開機都會重新設定權限。)
如果你看了 Ubuntu 的討論串,就會像我一樣很想把 tmpfs 也掛上 /tmp. 可惜我試了幾次,都沒成功... 直接把 none /tmp tmpfs defaults 0 0 放進 /etc/fstab 是不行的,在 vim /etc/rc.d/rc.last,加上 mount none /tmp -t tmpfs -o mode=1777 ,乍看之下很 OK,可是重開機後卻只能進 X ,看不到桌面啟動。
經過一番 trace, 似乎是因為沒有 /tmp/.x11-unix/X0 的關係,所以桌面沒有啟動 (/home/user/.bash_profile) ,但我們看到在 rc.S 裡,/tmp 早就 mount 成 tmpfs 了,只是我們打 mount 時看不出來而已。測試一下這個說法:
很好,這證明了/tmp 本來就是 tmpfs ... 我們不用再辛苦一次
首先,把一些常用的快取目錄掛上 tmpfs ,tmpfs 相當於 ramdisk ,存取速度很快、又可以保護脆弱的 MLC SSD。
試了很久,可行的做法如下:進 terminal 後 sudo 成 root, 修改 /etc/fstab 檔
none /var/tmp tmpfs defaults,mode=1777 0 0
none /var/log tmpfs defaults 0 0
並在 swap 所在的那行前面打 # 如 # /dev/sda2 swap ...
(註: /var/tmp 不打 mode=1777 也可以,事實上 /etc/rc.d/rc.last 裡每次開機都會重新設定權限。)
如果你看了 Ubuntu 的討論串,就會像我一樣很想把 tmpfs 也掛上 /tmp. 可惜我試了幾次,都沒成功... 直接把 none /tmp tmpfs defaults 0 0 放進 /etc/fstab 是不行的,在 vim /etc/rc.d/rc.last,加上 mount none /tmp -t tmpfs -o mode=1777 ,乍看之下很 OK,可是重開機後卻只能進 X ,看不到桌面啟動。
經過一番 trace, 似乎是因為沒有 /tmp/.x11-unix/X0 的關係,所以桌面沒有啟動 (/home/user/.bash_profile) ,但我們看到在 rc.S 裡,/tmp 早就 mount 成 tmpfs 了,只是我們打 mount 時看不出來而已。測試一下這個說法:
free
dd if=/dev/zero of=/tmp/test bs=1k count=20k
free
很好,這證明了/tmp 本來就是 tmpfs ... 我們不用再辛苦一次
調校你的 Aspire One (Linux) #3 - 右鍵選單、輸入法、livna
建議先使用宏碁提供的還原光碟,將 Aspire One 還原到出廠值。外接 USB 光碟約需20分30秒。
還原後,開機,在桌面上按 alt-f2 打 xfce-setting-show 。桌面→行為→按下右鍵時顯示桌面清單,打勾。這樣以後就可以在桌面上按右鍵直接使用 XFCE 的選單。
做兩次「即時更新」(需重開機兩次),但自從 7/20 MSN 又改 protocol 後,他們的 IM 應該已經不能登入 MSN 了。建議按右鍵→系統→新增移除程式,找到 emesene ,按裝起來後再按 alt-f2 打 terminal ,並剪下貼上這段字:
嘸蝦米輸入法的使用者,請想辦法製作出 liu.bin (或是... 網路上找找做好的?XD) 為了節省資源,請修改 SCIM 的偏好設定,把不要的泛用輸入法表格拿掉。這樣做其實只會移除 /home/user/.scim 裡的備份,所以別擔心,隨時可以再加回去。
我裝的 liu.bin 是按 starjou 的方法,把 uni*.tab 都放了去進。雖然 SCIM 不支援 ,,j ,,c ,,ct 但仍然可以直接打。請參考這篇。
Livna 是一個額外的套件包,會讓一些不適合包進 Fedora、不夠自由的軟體也能透過 yum 安裝。下載 livna
裝好後,新增/移除程式就會多一些可選套件了。
還原後,開機,在桌面上按 alt-f2 打 xfce-setting-show 。桌面→行為→按下右鍵時顯示桌面清單,打勾。這樣以後就可以在桌面上按右鍵直接使用 XFCE 的選單。
做兩次「即時更新」(需重開機兩次),但自從 7/20 MSN 又改 protocol 後,他們的 IM 應該已經不能登入 MSN 了。建議按右鍵→系統→新增移除程式,找到 emesene ,按裝起來後再按 alt-f2 打 terminal ,並剪下貼上這段字:
sudo sed -i.bak 's/09607671-1C32-421F-A6A6-CBFAA51AB5F4/CFE80F9D-180F-4399-82AB-413F33A1FA11/g' /usr/share/emesene/emesenelib/XmlTemplates.py
嘸蝦米輸入法的使用者,請想辦法製作出 liu.bin (或是... 網路上找找做好的?XD) 為了節省資源,請修改 SCIM 的偏好設定,把不要的泛用輸入法表格拿掉。這樣做其實只會移除 /home/user/.scim 裡的備份,所以別擔心,隨時可以再加回去。
我裝的 liu.bin 是按 starjou 的方法,把 uni*.tab 都放了去進。雖然 SCIM 不支援 ,,j ,,c ,,ct 但仍然可以直接打。請參考這篇。
Livna 是一個額外的套件包,會讓一些不適合包進 Fedora、不夠自由的軟體也能透過 yum 安裝。下載 livna
wget http://rpm.livna.org/livna-release-8.rpm
rpm -ivh livna-release-8.rpm
裝好後,新增/移除程式就會多一些可選套件了。
調校你的 Aspire One (Linux) #2 - 更新 BIOS
注意! 更新 BIOS 可能造成電腦無法開機,需要送回原廠修理。雖然燒壞 BIOS 應該在保固範圍內,但世事難料,小心比較好。
1. 使用 USB 隨身碟或 USB 軟碟,格式化成開機片。USB 隨身碟可以用 HPUSBFW (使用請參考這篇) 格式化。
2. 做好後,去抓 BIOS 0.3114,解壓縮到隨身碟
3. 打開 Aspire One,按 F12 從 USB 開機,就可以順利更新了。
1. 使用 USB 隨身碟或 USB 軟碟,格式化成開機片。USB 隨身碟可以用 HPUSBFW (使用請參考這篇) 格式化。
2. 做好後,去抓 BIOS 0.3114,解壓縮到隨身碟
3. 打開 Aspire One,按 F12 從 USB 開機,就可以順利更新了。
調校你的 Aspire One (Linux) #1
隨手寫一寫,做做記錄。宏碁採用 Linpus 我認為是個錯誤,但仍然有些優點,讓我在灌完 Ubuntu 後又重新灌回 Linpus Linux Lite 的桌面。
- Linpus 桌面開機只要 20 秒,全部 load 完約 40 秒,很快。對我這種一定要關機、每週充放電一次的愛護電池的人來說,快點開機關機很重要。Ubuntu 預設安裝開機要超過一分鐘,全部開完至少 90 秒。看著硬碟燈拼命亮,就一種 MLC 漸漸死掉的感覺...
- Linpus 預先調校過省電問題,雖然 Ubuntu 也可以調,但是要改不少地方。既然都要大改特改,那我直接從 Linpus 下手比較快,也順便了解一下它快速的理由
給宏碁鼓鼓掌! Kernel 仍未釋出
本來以為爭取原始碼的動作需要更長的努力,結果才 4 天,宏碁就放出原始碼了。我正在下載,晚一點會驗證,並 build 一些 AspireOne 用的套件放上網路。宏碁願意遵守 GPL ,給他們鼓掌!
Acer MSN (acerim) 還是不能登入,沒關係,裝 emesene 就好...
Kernel Source 還是沒放出來! 得持續要求宏碁才行。
P.S.為了他們沒放原始碼的事情,我試著寫信聯絡中研院的開放原始碼論壇 (OpenFoundry), 結果 contact 信箱竟然退信...
您好:
有關Aspire one AOA110 Linpus linux source code,可至以下ftp site 下載
ftp://Guest@csdftp.acer.com.tw/
若您有任何問題或建議,歡迎聯絡我們,我們將竭誠為您服務.
宏碁客服中心 敬上
Acer MSN (acerim) 還是不能登入,沒關係,裝 emesene 就好...
Kernel Source 還是沒放出來! 得持續要求宏碁才行。
P.S.為了他們沒放原始碼的事情,我試著寫信聯絡中研院的開放原始碼論壇 (OpenFoundry), 結果 contact 信箱竟然退信...
訂閱:
文章 (Atom)