2011年9月16日 星期五
自製免費軟體:超軟中文直式閱瀏器sviewer 0.27.1001更新
主要修正 2.7.1001
* 解決無BOM標頭UTF8檔案,顯示亂碼問題。
* 狀態列顯示檔案類型UTF8, BOM UTF8, ASCII等等
* 工具字型大小選擇: 字型加大為大24, 中20, 小16
檔案下載
由此下載sviewer-027-1001.zip檔案
a073cfa82d621593c49fc26b6972e7bf *sviewer-027-1001.zip
2011年9月14日 星期三
Go 程式語言再探
從官網中範例程式找到一段Go程式碼WebServer,加入我的編譯腳本檔如下:
GOCC=6g GOLD=6l PROJECT=webserver all: $(PROJECT) $(PROJECT).6: $(PROJECT).go $(GOCC) $(CFLAGS) $^ $(PROJECT): $(PROJECT).6 $(GOLD) -o $@ $^ run: $(PROJECT) ./$^ clean: rm -f $(PROJECT).6 $(PROJECT) |
如上圖,筆者輸入本站網址,點按[Show QR],輕輕鬆鬆產生本站QRCode圖像。
結語
短短50行程式碼,其中包含20行網頁腳本,使用掛載flag, http, io, log, template等等套件大幅提高程式生產力。
若要學習Go,不容錯過Effective Go一文。
2011年9月7日 星期三
Go 程式語言初探
from http://golang.org
最近寫多篇與OS開發相關超硬的文章,來學習Go 語言換換口味輕鬆一下吧!參考英文說明,寫了以下心得:
使用平台為Mac OS X 10.6.8 + Xcode 4.2
前言
Go 程式語言是一個開放源碼的專案,以BSD-style授權發佈。
它以通用語言作為系統設計基礎想法。在強調於型別、垃圾回收及明確定義支持Concurrent程式設計的語言功能等等。並提供大量套件 ,提高寫程式效率。目前支援x86及ARM處理器,一個64位元及32位元x86的編譯套件(6g和8g),及支援ARM的編譯套件(5g)。
開發環境設定
安裝 Mercurial (hg)
sudo easy_install mercurial(註:easy_install 是python所內附一個好用安裝第三方工具的python腳本)
Mercurial versions 1.7.x 需要設定檔來指定憑證授權 Certification Authorities (CAs). 在筆者機器遇到下列警示訊息:
warning: go.googlecode.com certificate with fingerprint 28:92:... not verified (check hostfingerprints or web.cacerts config setting)
這表示你所使用的Mercurial沒有正確設定CAs. 參考configure the CAs一文,進行設定。
以下是OSX 10.6以上版本的設定
openssl req -new -x509 -extensions v3_ca -keyout /dev/null -out dummycert.pem -days 3650
使用openssl命令建立替代憑證(設定內容隨意打)
接著使用下列指令將dummycert.pem複製到/etc
sudo cp dummycert.pem /etc/hg-dummy-cert.pem
最後在~/.hgrc 或go/.hg/hgrc內容加入下列兩行。
[web] cacerts = /etc/hg-dummy-cert.pem
下載Go 正式發佈版本源碼
hg clone -u release https://go.googlecode.com/hg/ go
編譯Go
你將需要安裝Xcode,其中包含GCC, C libraries ...
$ cd go/src $ ./all.bash
如果沒任何錯誤發生,訊息如下:
ALL TESTS PASSED --- Installed Go for darwin/amd64 in /Users/you/go. Installed commands in /Users/you/Go/bin. *** You need to add /Users/you/Go/bin to your $PATH. *** The compiler is 6g.
最後幾行顯示你的系統資訊,硬體架構,和所安裝的目錄,你需要將此目錄加到搜尋路徑中。詳請參閱英文文章環境變數environment variables.
使用Go來編譯Hello範例
$ make 6g hello.go hello.go:2: can't find import: fmt |
錯誤發生原因沒有指定環境變數。
筆者指定下列環境變數後,總算編譯成功。
export PATH=~/Go/bin:$PATH
export GOROOT=$HOME/Go
export GOARCH=386
export GOOS=darwin
export GOBIN=$HOME/Go/bin
執行結果
hello 範例可由此下載。
歡迎留言分享心得。
筆者指定下列環境變數後,總算編譯成功。
export PATH=~/Go/bin:$PATH
export GOROOT=$HOME/Go
export GOARCH=386
export GOOS=darwin
export GOBIN=$HOME/Go/bin
$ make 6g hello.go 6l -o hello hello.6 |
執行結果
$ make run ./hello hello, world |
hello 範例可由此下載。
歡迎留言分享心得。
標籤:
多平台開發,
General Programming,
Go
2011年9月5日 星期一
啟用e100 (i82559er)網路卡在自製Bos
續上篇自製BenOS支援lspci 命令,參考MIT OSE Lab6: Network Driver 及其中各項文件,且參照相關Linux網路驅動程式設計,目前已整合實作82559er網路卡驅動至BOS v0.21中。
新增及修改下列檔案:
teset/Makefile 已修改以i82559er為參數,啟動qemu :
執行後結果,如文頭畫面。
啟用e100
其中pci.c,如何啟用e100 82559er 簡略原始碼如下:
net_e100.c
啟用後,這時便用使用到 io region 1: 0xc040,長度為64位元組,參考Intel 82559,來進行下列操作。
需要將e100 做軟體重置(可參e100_reset函式),因使用DMA Rings,
所以接著要掛上傳送的緩衝區Control Block List(CBL)及接收用的緩衝區Receive Frame Area(RFA),可參考cbl_init()及rfa_init()。
net 命令
在起動Bos v0.21後,輸入net 指令,可看到下列結果:
其中黃色標記三項資訊,在對網路卡設備進行操作時,會使用到。
結語
原使用e100設備序號,並不生效;後來研究OSE資料後,發現必須在qemu參數中設定,之後再使用設備序號1209來啟用e100(i82559er),如此才能正確執行在qemu環境。
MIT OSE Lab6十分具有挑戰性,筆者經幾天的努力才把這網路卡驅動部分實作完成;但大約只完成Lab6的三分之二,其餘部分,待9/6社群活動後,再來討論後面部分旳細節。本次程式碼可由此下載。
新增及修改下列檔案:
pcireg.h | PCI相關參數標頭檔,引用自NetBSD,源自MIT OSE LAB |
pci.c | 移植Lab6 kern/pci.c |
net_e100.h | 參考Lab6相關實作資料 |
net_e100.c | 參考Lab6相關實作資料 |
qemu -fda "../bos.img" -net user -net nic,model=i82559er |
啟用e100
其中pci.c,如何啟用e100 82559er 簡略原始碼如下:
pci_func_enable(pci_pdata_t f) { pci_conf_write(f, PCI_COMMAND_STATUS_REG, PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE | PCI_COMMAND_MASTER_ENABLE); for (bar = PCI_MAPREG_START; bar < PCI_MAPREG_END; bar += bar_width) { uint32_t oldv = pci_conf_read(f, bar); bar_width = 4; pci_conf_write(f, bar, 0xffffffff); uint32_t rv = pci_conf_read(f, bar); if (rv == 0) continue; int regnum = PCI_MAPREG_NUM(bar); if (PCI_MAPREG_TYPE(rv) == PCI_MAPREG_TYPE_MEM) { if (PCI_MAPREG_MEM_TYPE(rv) == PCI_MAPREG_MEM_TYPE_64BIT) bar_width = 8; size = PCI_MAPREG_MEM_SIZE(rv); base = PCI_MAPREG_MEM_ADDR(oldv); } else { size = PCI_MAPREG_IO_SIZE(rv); base = PCI_MAPREG_IO_ADDR(oldv); } pci_conf_write(f, bar, oldv); f->addr_base[regnum] = base; f->addr_size[regnum] = size; } |
net_e100.c
啟用後,這時便用使用到 io region 1: 0xc040,長度為64位元組,參考Intel 82559,來進行下列操作。
需要將e100 做軟體重置(可參e100_reset函式),因使用DMA Rings,
所以接著要掛上傳送的緩衝區Control Block List(CBL)及接收用的緩衝區Receive Frame Area(RFA),可參考cbl_init()及rfa_init()。
net 命令
在起動Bos v0.21後,輸入net 指令,可看到下列結果:
bos$ net PCI function 00:18.0 (8086:1209) enabled mem region 0: 4096 bytes at 0xf2020000 io region 1: 64 bytes at 0xc040 cbl avail = 9, wait = 1, slot = 0x420000, irq=11 rfa avail = 10, wait = 0, slot = 0x420050 |
結語
原使用e100設備序號,並不生效;後來研究OSE資料後,發現必須在qemu參數中設定,之後再使用設備序號1209來啟用e100(i82559er),如此才能正確執行在qemu環境。
MIT OSE Lab6十分具有挑戰性,筆者經幾天的努力才把這網路卡驅動部分實作完成;但大約只完成Lab6的三分之二,其餘部分,待9/6社群活動後,再來討論後面部分旳細節。本次程式碼可由此下載。
訂閱:
文章 (Atom)