顯示具有 電腦相關 標籤的文章。 顯示所有文章
顯示具有 電腦相關 標籤的文章。 顯示所有文章

2024年6月8日 星期六

qemu 模擬 dos + sb16 (Sound Blaster 16)

the 1st edition: 20240513
一般我都是用 dosbox 玩 dos games, 忽然想到若是要用 qemu 的話, 應該要怎麼辦, 很難辦, 比 dosbox 難上不少, 之前我用 qemu 玩 dos games 時, 都是沒有聲音的, 這次想試試看怎麼把聲音搞定。

QEMU emulator version 8.2.2, 有些網路資料的參數是舊版的, 在 8.2.2 是不能用的。 設定好 sb16 之後, 在 software Creative Soundblaster 16 MSDOS driver 下載 sb16 dos driver, 安裝之後會在 config.sys, autoexec.bat 安插對應的指令。

其實 dos 遊戲都是直接驅動 sb16, 我不確是不是需要安裝 sb16 驅動程式。

如果沒有正確設定 qemu sb16, 在載入相關驅動程式, 會看到錯誤訊息, 所以我信心滿滿, 應該可以讓遊戲正常發出音樂才是, 結果還是一樣無任何聲音。

後來找到以下設定參數:

qemu-system-i386 -m 128 -hda c.img  -fda d.img -boot a -audiodev alsa,id=snd0,out.dev=default -device sb16,irq=7 -audio alsa
這是我找過最複雜, 最長的 sb16 設定參數, 一堆看不懂的參數, 我信心滿滿, 本來以為可以搞定, 結果遊戲還是沒有音樂。

後來在「How I boot FreeDOS using QEMU 」找到

qemu-system-i386 -m 128 -hda c.img -fda d.img -boot a -device sb16 -device adlib


這樣就可以讓美少女夢工廠2發出正常音樂, 聽到音樂時, 我差點哭出來, 終於有音樂了。這麼難搞。看起來應該是用 adlib 發出音樂, sb6 負責音效。不過在 Metal & Lace 上, 語音只發出一次, 就沒了, 音樂則是正常播放。

2024年5月24日 星期五

美少女夢工場2 cdrom 精緻版, 使用 wine 來安裝/執行, 安裝到 steam deck 上

the 1st edition: 20230818 (只說明 winecfg 中文測試)
the 2nd edition: 20240524 (加入 wine 執行美少女夢工場2 cdrom 豪華版)
the 3rd edition: 20240526 (在 steam deck 上執行美少女夢工場2 cdrom 豪華版)
winecfg 是 wine 的設定程式, 若是需要 windows 中文環境, 可以先測試 winecfg 能不能正常顯示中文。

本文在 debian 下測試:
dpkg-reconfigure locales
需要加上 zh_TW.UTF-8

locale LANG 設定為 zh_TW.UTF-8, 指令: export LANG=zh_TW.UTF-8, 這樣 winecfg 就會用中文顯示。
locale
LANG=zh_TW.UTF-8
LANGUAGE=
LC_CTYPE="zh_TW.UTF-8"
LC_NUMERIC="zh_TW.UTF-8"
LC_TIME="zh_TW.UTF-8"
LC_COLLATE="zh_TW.UTF-8"
LC_MONETARY="zh_TW.UTF-8"
LC_MESSAGES="zh_TW.UTF-8"
LC_PAPER="zh_TW.UTF-8"
LC_NAME="zh_TW.UTF-8"
LC_ADDRESS="zh_TW.UTF-8"
LC_TELEPHONE="zh_TW.UTF-8"
LC_MEASUREMENT="zh_TW.UTF-8"
LC_IDENTIFICATION="zh_TW.UTF-8"
LC_ALL=




如果 winecfg 「顯示」那頁的中文會有亂碼, 需要中文字形, cp mingliu.ttc $HOME/.wine/drive_c/windows/Fonts 就正常了。

mingliu.ttc 是 windows (c:\windows\fonts) 提供的中文字型。

有遇過這樣還是中文亂碼, 那就用 winetricks cjkfonts 安裝中文字型, winetricks 還會寫入 reg 登錄檔。

再來用 wine 安裝「美少女夢工場2」精緻版, 這是 cdrom 版本, cdrom 有點發霉, 還好依然可以轉成 iso, 用 linux mount 起這個 iso, mount 到 /media/9, 再用 winecfg, 把 d: 設定為 /media/9, 然後 wine /media/9 Setup.exe, 就會啟動遊戲安裝程式。

安裝後可以看到 list 1 的檔案。
list 1
1 descent@deb64:~$ cat /home/descent/.wine/drive_c/users/descent/Desktop/美少女夢工場2.desktop
2 [Desktop Entry]
3 Name=美少女夢工場2
4 Exec=env WINEPREFIX="/home/descent/.wine" wine-stable D:\\\\pm2win.exe
5 Type=Application
6 StartupNotify=true
7 Comment=執行美少女夢工場2
8 Icon=22B9_pm2win.0
9 StartupWMClass=pm2win.exe

安裝目錄結構如 list 2。

list 2
descent@u64:/home/descent/.wine/drive_c$ ls
 pm2win   ProgramData  'Program Files'  'Program Files (x86)'   users   windows
descent@u64:drive_c$ tree pm2win/
pm2win/
├── Data
└── uninst.exe

下次要再執行, wine-stable D:\\\\pm2win.exe 就可以, 太神了。實際上當然不是什麼魔法, 是這個 wine 環境已經把 d: 對應到 /media/9 這個已經把 PM2WIN_v3.iso 掛上的目錄, 所以 D:\\\\pm2win.exe 實際上就是 wine /media/9/pm2win.exe。

steam/proton 可以跑 windows 遊戲, 所以 wine 可以執行 pm2win.exe 也不算太令人訝異, 麻煩的是以前的遊戲會需要讀取光碟, 需要把光碟放在光碟機上, 這點就很困擾, 要是有音軌或是光碟保護的就會很麻煩。

linux 上大都沒有 alcohol 52% 這種可以 mount 多種 cdrom 格式的工具, 使用 wine 本身就是一個門檻, 又要模擬有保護的光碟或是有音軌的光碟, 再把門檻往上疊加, 我只是要玩個遊戲, 沒必要這麼苦吧!

如果還要 3D, 那又得再加上一個門檻。

所以就先試試看這種單純只有資料的 cdrom iso, 如我所想, 門檻較低, 比較容易成功。

pm2win.exe 執行的時候需要把 iso 檔案 mount 起來, 避免無法執行, 所以安裝時, 選最小安裝即可。





在成功使用 wine 之後, 希望也可以在 steam deck 上執行, 這個比裝磁片版難 100 倍, 磁片版只要把 dosbox 搞定就好, 在 steam 要安裝非 steam game, 並且自己搞定 proton 環境, 不是單純用 wine。

【討論】解決 steam deck 掌機 第三方遊戲亂碼,不顯示中文,不能打出中文字 」介紹怎麼處理中文亂碼問題, 和單純使用 wine 原理類似, 操作 steam deck/arch linux 的指令和 debian 有點不同, 原理大概是解除唯讀, 把 zh_TW locale 加入。





再來把 iso mount 起來, 需要使用 root, 把光碟的 Setup.exe 加入 steam, 安裝好遊戲, 再來就是麻煩的部份, 要怎麼把 d: 設定為 /home/deck/cdrom, 然後指定為 cdrom 裝置, proton 要怎麼執行 winecfg?

另外又要怎麼執行安裝後的遊戲執行檔, 畢竟是加入 Setup.EXE, 這些難題讓我花了不少時間。

安裝 Protontricks 即可, 安裝完之後, 可以選擇要設定的 steam game, proton 環境指定在在 WINEPREFIX "/home/deck/.var/app/com.github.Matoking.protontricks/data/wineprefixes/pm2win"





選好要設定的遊戲之後, 會有一堆選項可以用, 這邊需要知道 wine/proton 的基本設定概念, 可以參考以下文章。
再來要怎麼執行安裝好的遊戲, 將原本的 Setup.EXE 改為 /home/deck/cdrom/Pm2win.exe 就可以執行安裝好的遊戲, wine 也是這樣; 遊戲選最小安裝的話, 執行檔其實還是在 cdrom 上, 不會安裝在 WINEPREFIX "/home/deck/.var/app/com.github.Matoking.protontricks/data/wineprefixes/pm2win", 這邊只有一個 uninst.exe 而已。





我的 steam deck 有 3 個版本的 美少女夢工場2
  1. 磁片版
  2. cdrom 精緻版
  3. steam 版本
只有 steam 版有全程語音, cdrom 精緻版只有和女兒對話有語音, 1, 2 都有國王的新衣。

2023年11月5日 星期日

windows 10 的視窗沒有 border

如果你的視窗沒有 border, 可以參考 How do I get the border to show on the Windows File Explorer when active?, 就可以設定一條很細的 border。

另外也有一些程式沒有 menu bar, title bar, 這些真的蠻困擾我, 用 linux/X 的好處, 是可以一直習慣自己用的 GUI, 不過 chrome 還是沒 border, How to fix ugly Chrome window borders on Linux 說明可以在 linux 設定有 title bar, border 的 chrome, 當然, windows 10 是沒辦法設定的。

設定完之後, 感覺好多了。

ref:
My Window Borders are missing under Windows 10

2022年1月6日 星期四

從網路上複製/貼上文字要小心

從網路上複製/貼上命令列要小心遭駭」介紹這個攻擊手法, 可以從 https://www.wizer-training.com/blog/copy-paste 測試, 的確, 會有該文提到的問題, 不過在 linux/X 下, 如果不要使用 C-C/C-V 的複製/貼上方式, 使用 X 滑鼠中鍵的貼上方式, 就不會複製到不預期的字串。

2021年12月12日 星期日

windows 10 系統更新後 21h1 後, 中文輸入法無法自訂鍵盤

windows 10 系統更新後 21h1 後, 中文輸入法無法自訂鍵盤, 無法使用自己定義的注音鍵盤排列, 後來參考 ref 1 這篇, 知道要開啟相容模式。不過 win 10 設定真的很難找, 反覆嘗試很久, 才找到這個設定。

ref:
  1. 系統更新後win10 20h2 後 無法自訂鍵盤
設定畫面:

2018年2月2日 星期五

Fujitsu LifeBook S2210 windows xp 驅動程式下載/鍵盤錯亂問題

Fujitsu LifeBook S2210, 2007 的產品

手邊這台 notebook 是 Fujitsu LifeBook S2210, 2007 的機器, 距離現在的 20180125 已經有 10 年了, 仍然是我主力在使用的電腦, 因為它一直不壞, 我也沒機會買其他機器, made in japan 果然威。

而我也還在使用 windows xp, 其 windows xp driver 我放在 https://drive.google.com/open?id=1J_lCnX2Cn_lr47snnLNqNSGLMdUA2DRB

官方網站提供的 windows xp driver:
LIFEBOOK S2210 Notebook PC windows xp driver

Fujitsu LifeBook S2210 Specifications

Fujitsu LifeBook S2210



Fujitsu LifeBook S2210 (Turion 64 X2 1.6GHz, 512MB RAM, 40GB HDD, Vista Home Basic)

Part Number: FPCM43044  Released: March 6, 2007

GENERAL

  • Packaged Quantity
    1
  • Embedded Security
    Trusted Platform Module (TPM 1.2) Security Chip
  • Notebook type
    Ultraportable (Under 4 lbs.)
  • Manufacturer
    Fujitsu

PROCESSOR / CHIPSET

  • CPU
    AMD Turion 64 X2 mobile technology TL-52 / 1.6 GHz
  • Number of Cores
    Dual-Core
  • Cache
    L2 - 1 MB
  • 64-bit Computing
    Yes

CACHE MEMORY

  • Type
    L2 cache
  • Installed Size
    1 MB

MEMORY

  • Max Supported Size
    4 GB
  • Technology
    DDR2 SDRAM
  • Speed
    667 MHz / PC2-5300 - 667 MHz
  • Slots Qty
    2
  • Empty Slots
    1

STORAGE

  • Interface
    Serial ATA-150
  • Optical Drive
    CD-RW / DVD-ROM combo removable
  • Type
    none
  • Type
    portable

RAM

  • Memory Speed
    667 MHz
  • Memory Specification Compliance
    PC2-5300
  • Configuration Features
    1 x 512 MB
  • Technology
    DDR2 SDRAM
  • Installed Size
    512 MB
  • Rated Memory Speed
    667 MHz

ENVIRONMENTAL PARAMETERS

  • Environmental standards
    EPA Energy Star
  • Humidity Range Operating
    20 - 85%

DISPLAY

  • Resolution
    1024 x 768 (XGA)
  • Widescreen Display
    No
  • Color Support
    24-bit (16.7 million colors)
  • Monitor Features
    Crystal View
  • Diagonal Size (metric)
    33.8 cm
  • Display Resolution Abbreviation
    XGA

AUDIO & VIDEO

  • Graphics Processor
    ATI Radeon Xpress 1150
  • Memory Allocation Technology
    shared video memory (UMA)
  • Sound
    Microphone
  • Audio Codec
    Realtek ALC262

HARD DRIVE

  • Spindle Speed
    5400 rpm
  • Type
    HDD
  • Capacity
    40 GB

INPUT

  • Type
    keyboard, scroll button, touchpad
  • Localization & Layout
    US

COMMUNICATIONS

  • Wireless Protocol
    802.11 Super AG, 802.11a/b/g
  • Wired Protocol
    Gigabit Ethernet

OPTICAL STORAGE

  • Drive Type
    CD-RW / DVD
  • Type
    CD-RW / DVD-ROM combo
  • Form Factor
    removable

PROCESSOR

  • CPU Type
    Turion 64 X2 mobile technology
  • Processor Number
    TL-52
  • Manufacturer
    AMD
  • Clock Speed
    1.6 GHz

FLOPPY DRIVE

  • Type
    none

CARD READER

  • Type
    card reader
  • Supported Flash Memory
    Memory Stick, Memory Stick PRO, SD Memory Card

BATTERY

  • Capacity
    5200 mAh
  • Cells
    6-cell
  • Technology
    lithium ion
  • Run Time (Up To)
    2.5 sec

AC ADAPTER

  • Input
    AC 120/230 V

CONNECTIONS & EXPANSION

  • Slots
    2 x memory (1 free)
    1 x CardBus (1 free)
  • Interfaces
    3 x USB 2.0 4 pin USB Type A
    1 x display / video - S-video output
    1 x display / video - VGA - 15 pin HD D-Sub (HD-15)
    1 x modem - phone line - RJ-11
    1 x network - Ethernet 10Base-T/100Base-TX/1000Base-T - RJ-45
    1 x IEEE 1394 (FireWire) 4 pin FireWire
    1 x audio - line-in/microphone - mini-phone 3.5 mm
    1 x audio - line-out/headphones - mini-phone stereo 3.5 mm
  • Memory Card Reader
    Yes (SD Card, Memory Stick, Memory Stick PRO)

HEADER

  • Brand
    Fujitsu
  • Product Line
    Fujitsu LIFEBOOK
  • Model
    S2210
  • Packaged Quantity
    1
  • Compatibility
    PC

MISCELLANEOUS

  • Security
    Trusted Platform Module (TPM 1.2) Security Chip
  • Features
    administrator password, hard drive password, security lock slot (cable lock sold separately), system password
  • Compliant Standards
    FCC Part 15 B, FCC Part 15 C, FCC Part 68, IC CS-03, ICES-003 Class B, RSS-210, UL, cUL

NETWORKING

  • Max Transfer Rate
    56 Kbps
  • Data Link Protocol
    802.11 Super AG, Ethernet, Fast Ethernet, Gigabit Ethernet, IEEE 802.11a, IEEE 802.11b, IEEE 802.11g
  • Compliant Standards
    IrDA 1.1, Wi-Fi CERTIFIED
  • Wireless LAN Supported
    Yes

SYSTEM

  • Notebook Type
    notebook
  • Platform
    Windows
  • Hard Drive Capacity
    40 GB
  • Embedded Security
    Trusted Platform Module (TPM 1.2) Security Chip

MONITOR

  • Diagonal Size
    13.3 in
  • Color Support
    24-bit (16.7 million colors)

DIMENSIONS & WEIGHT

  • Width
    11.5 in
  • Depth
    9.4 in
  • Height
    1.3 in

MANUFACTURER WARRANTY

  • Type
    3 years warranty

ENVIRONMENTAL STANDARDS

  • ENERGY STAR Certified
    Yes

PHYSICAL CHARACTERISTICS

  • Weight
    3.53 lbs

POWER

  • Min Operating Temperature
    41 °F
  • Max Operating Temperature
    95 °F

OPERATING SYSTEM / SOFTWARE

  • OS Provided: Type
    Microsoft Windows Vista
  • Type
    Adobe Reader, Cyberlink PowerDVD, Microsoft Works 8.5, Norton Internet Security 2007 (90 days subscription), Roxio Easy Media Creator, Drivers & Utilities, EverNote Plus 1.1, Fujitsu Driver Update Utility, Fujitsu HotKey Utility, Fujitsu Security Application Panel, Fujitsu Shock Sensor Utility, Journal Viewer, Microsoft Internet Explorer

VIDEO OUTPUT

  • Graphics Processor
    ATI Radeon Xpress 1150
  • Graphics Processor Series
    ATI Radeon

VIDEO MEMORY

  • Memory Allocation Technology
    shared video memory (UMA)

SERVICE & SUPPORT

  • Type
    3 years warranty

SERVICE & SUPPORT DETAILS

  • Type
    limited warranty
  • Full Contract Period
    3 years

GENERAL

  • Manufacturer
    Fujitsu



[notebook 鍵盤按鍵突然錯亂]

http://newforum.17inda.com/home.php?mod=space&uid=146&do=blog&id=5
鍵盤輸入錯誤
答:

您是用筆記型的電腦嗎?

如果鍵盤輸入有錯亂的問題,那是因為筆電鍵盤有特殊的切換方式,這在各個筆電說明書都有寫

1.如果是IBM的notebook:

拔掉USB鍵盤後,按Shift與NumLock就可以切換回正常

2.如果是富士通的notebook:

按NumLock與其他任意鍵就可以

3.如果是ASUS的notebook:

按NumLock與FN再加其他任意鍵後就正常了

不在上述的筆電,請見原說明書

[20171218 更換 Fujitsu F500 128GB 2.5吋 ssd sata3]

由於硬碟是 sata 1 代的版本, 我很擔心無法換上 sata 3 的 ssd, 目前找得到的都是 sata 3, 我也找不到 sata 1 的 ssd。

最後在 pchome 線上購物購買了 Fujitsu F500 128GB 2.5吋 SATAIII SSD固態硬碟, 20171214 收到, 1199nt, 當白老鼠試試。



拆開筆電的硬碟, 換上 ssd。



安裝 gnu linux/debian, bios 和 linux 都抓得到這顆 ssd。



安裝 debian 後, 重新開機, 速度飛快, 大概 10 秒就可以開到 X 登錄畫面, 老筆電重生, 看能不能再戰十年。

2017年3月11日 星期六

ttyd - 從瀏覽器以 ssh 登入 linux 主機

一個 daemon, 可以從瀏覽器用 ssh 登入主機。

編譯與執行
https://github.com/tsl0922/ttyd

apt-get install libwebsockets-dev
apt-get install libjson-c-dev
cmake .

192.168.1.9 是我的 eth0 ip, 預設 port 是 7681, 紅色是執行的指令
run
descent@u64:ttyd$ ./ttyd ssh descent@192.168.1.9
[1474856081:4555] NOTICE: Initial logging level 7
[1474856081:4556] NOTICE: Libwebsockets version: 1.7.1 unknown-build-hash
[1474856081:4556] NOTICE: IPV6 not compiled in
[1474856081:4557] NOTICE: libev support compiled in but disabled
[1474856081:4560] NOTICE:  Threads: 1 each 1024 fds
[1474856081:4560] NOTICE:  mem: platform fd map:  8192 bytes
[1474856081:4561] NOTICE:  mem: per-conn:          808 bytes + protocol rx buf
[1474856081:4561] NOTICE:  canonical_hostname = u64
[1474856081:4562] NOTICE:  Compiled with OpenSSL support
[1474856081:4562] NOTICE:  Using non-SSL mode
[1474856081:4847] NOTICE:  SSL ECDH curve 'prime256v1'
[1474856081:4848] NOTICE:  Listening on port 7681
[1474856081:4848] NOTICE: TTY configuration:
[1474856081:4848] NOTICE:   start command: ssh descent@192.168.1.9
[1474856081:4848] NOTICE:   reconnect timeout: 10s
[1474856081:4848] NOTICE:   close signal: SIGHUP (1)
[1474856105:2092] NOTICE: HTTP connect from 192.168.1.9 (192.168.1.9), path: /
[1474856105:2781] NOTICE: HTTP connect from 192.168.1.9 (192.168.1.9), path: /auth_token.js
[1474856105:3081] NOTICE: client connected from 192.168.1.9 (192.168.1.9), total: 1
[1474856105:3085] NOTICE: started process, pid: 19400
[1474856218:7906] NOTICE: HTTP connect from 192.168.1.9 (192.168.1.9), path: /
[1474856218:8341] NOTICE: HTTP connect from 192.168.1.9 (192.168.1.9), path: /auth_token.js
[1474856218:9817] NOTICE: client connected from 192.168.1.9 (192.168.1.9), total: 2
[1474856218:9820] NOTICE: started process, pid: 19546

從瀏覽器輸入 http://192.168.1.9:7681/ 就會出現 ssh 登入畫面。

從瀏覽器登入

ref:
ttyd 1.0.0 发布,C 语言编写的命令行程序

2017年2月25日 星期六

[嘴炮] 寫 os kernel 這件事


你必須要非常的努力, 才會看起來毫不費力
Tifa 很漂亮吧, 這次沒有專業技術, 純嘴炮, 什麼是嘴炮呢? 就是聽起來很厲害, 實際上完全沒幫助的東西, 偏偏大家又很愛看, 這技能很重要, 我要來練習一下。

看到強者我朋友這篇《別被 kernel 嚇到了》才有了這篇文章, 我和這位朋友的技術實力大概差了十倍, 之前差很大, 現在縮小一點, 大概是 9.99 的差距吧, 真的只有一點。

但其實我不這麼認為, 知識是有難易等級之分, 用 printf 印出 hello world 很容易, 改用 system call 難一點, 完全靠自己的程式碼寫出來呢? 難度一下子來到幾十倍的等級。

專業知識我自己把它分成幾個等級:
  • 很容易就找到的知識
  • 很容易就能理解的知識
  • 別人告訴你才懂的知識
  • 很難找到的知識
  • 別人告訴你, 你還是無法理解的知識
  • 別人告訴你你還是無法理解的知識, 又很容易忘記的知識
程式有難有易, os 被分類為難寫的程式, 相信沒太大爭議。演算法課本上或是某些公司的面試題目當然也不會很簡單, 但是能在 os 下寫程式已經是個小確性。

os 是屬於難度偏高的程式, 要學習寫 os 需要一些不太容易找到的知識, 像 compiler 一樣, 是屬於比較不流行的程式, 而這些程式總是有些神祕感。

而有一個最根本的困難點是: 寫 os kernel 沒有 library 可用。紅黑樹不會寫有 library 可用, xml parser 不會寫有 library 可以用, compiler 也都還有 lex/yacc 可用, 但有什麼 library link 一下後, 這隻程式就變成 os kernel 了嗎? 沒有! 寫 os kernel 程式意味著得自己打造所有的輪子。

而 os 程式的其他困難點是:

能使用的語言有限: 大部份都是組合語言和 c 語言。有「本事」的人還可以用他喜歡的語言來寫 OS, 例如 os by go, by Haskell, 《這篇文章》則是討論用來寫 os 的語言。而我相信大多數人並不是屬於有「本事」的這一族群, 所以我們還是用組合語言和 c 語言就好, 這已經足以難倒我們了。

JNode 則是用 java 寫的 os, 覺得很神奇嗎? 作者用組合語言開發 jvm, 再來就可以用 java 寫 os 了。算作弊嗎? 當然不算, 用 c 也是要用組合語言的。

要怎麼開始呢? 我能寫個 int main(void) 作為開始嗎? 要怎麼讓 pc/或其他硬體平台一開機就執行我的程式, 光這一小步 (bare metal) 就足以讓人辛苦一陣子。而寫 os 無可避免一定要用到組合語言, 所以還有個組合語言的門檻。要載入 os kernel 到記憶體中再 jump 去執行, 也是在 os 下少做的事情, 也需要對所謂的可執行檔有所熟悉。

除錯: os 下有各式各樣的 debugger 可用, 寫 os kernel 雖然也可以透過 bochs, qemu 等模擬器除錯, 但這些模擬器的結果並非是真的結果, 總是會有些出入, 這時候就得自己想辦法找出 bug, 那可不是普通的痛苦。以前沒有 bochs, qemu 等模擬器那辛苦程度就更不在話下。出動 ice 等級的工具也不是容易的事情, bios/uefi 開發公司, 就有這些 ice 工具。

了解執行檔格式/純粹的機器碼檔案: 這也是需要下點功夫才能理解。像 elf 這麼有趣的執行檔格式, 把它載入並執行, 絕對是很好玩的一件事情。

toolchin 的用法: 其他平台我不知道, 至少使用 gnu toolchain 開發 os 的程式有不一樣的用法, 也是要花點時間學習。linker script 就足以花上不少時間。

cpu 架構的知識: 這不會有人認為很簡單吧? 當然有簡單的 cpu, 但一樣不是速成知識。

c runtime: 一開始是用組合語言撰寫, 但在某個時機會想用 c, 要怎麼樣才能開始用 c 呢?每個平台可能不太一樣。這可是書上或網路上難找的資料。當然如果你想用組合語言完成 os kernel, 那就沒這問題, BareMetal-OS 就是用組合語言寫的。在這個知識上, 我跌了好幾次跤, 總算讓我獲得此技能, 這過程可不是普通的痛苦。

中斷程式: 這也是在 os 下很少練習的程式, 怎麼處理好中斷程式, 事實上它也是一大難題, 寫個一次, 你才真能理解 linux 上提到的 Interrupt Context, 而不是只有名詞上的理解。

context switch, 這個名詞資訊人個個琅琅上口, 不過要寫出這個功能可就不是每個人都做得到, 有了個這功能, 才有 os 的味道, os 有一個很重要的能力就是控制 process, 我要你怎麼跑你就怎麼跑, 不讓這個 process 執行就是不讓你執行, 這需要硬體相關知識才能完成, 很有趣的。

其他難題我沒提到: 因為我覺得不一定要有這些。檔案系統、記憶體管理、硬體資源的管理 ... 但有了才感覺比較像 os kernel 吧, 所以還有得忙。spin lock, mutex, semaphore, 這些東西要理解/使用都不容易了, 寫 os kerne 可是要實作出這些功能。

硬體的話還有: 你想存取硬碟吧, 只用 ramdisk 總是有點虛虛的, 你也想支援 mmu 分頁功能吧, 而這兩個加起來才能支援虛擬記憶體這麼潮的功能。網路時代你也許還想搞定那張網路卡。

這裡提到的東西都不是在書店中或是網路上很容易就能得到的知識, 就算找到了也要花費很大的心力去消化, 不是能輕易搞懂的東西, 而且很容易就會忘記這些知識。有些難度沒那麼高, 但是在 os 環境下很少練習到。

透過練習就可熟悉一件事情, 雖然我不是 100% 贊同這句話, 我認為有些事不是靠努力練習就一定成的, 還需要有天才般的頭腦。不過很幸運的是, 寫 os 程式不在那範圍裡, 它是可以靠努力練習而完成的。

但我同意強者我朋友中的一個論點, 不用把會寫 os kernel 的人看得比較「厲害」, 只要你願意花時間往這個領域發展, 一定能有某種程度上的成就。破解軟體也是, 若你往這方面發展, 也一定能有些小成就。你不會, 那只是因為你的學習領域在別的地方, 在你所會的領域, 會寫 os kernel, 或是破解系統的人不見得比你厲害。現在很流行的 web programming/手機 app 我幾乎一竅不通; 如何處理大型網站的流量, 我也沒有概念 (看過淘宝技术这十年後, 我已達略懂的境界); 對於破解/保護的議題我也不熟, 大家都是學有專精的程式員, 無需自抬身價也無需自卑。

而和一般的應用程式相比, 成就感可能也不高, 一般人不會欣賞 os 程式, process switch 交戶印出兩個字串, 懂的人會覺得「哇! 好厲害!!」一般人可能覺得就是印出兩個字串, 無三小路用, 成就感不高, 拿這時間去寫個 ios app 說不定得到的成就感還比較大。

為什麼要自己開發個 os kernel 呢?
Why develop an OS?》有個不錯的答案。

2014年12月4日 星期四

作業系統之前的程式 for stm32f4discovery (11) - 找出 stm32f4 simple scheme 記憶體使用量

1st edition: 20090417, only the url link.
2nd edition: 20141204, 計算記憶體用量

我想找出 stm32f4 simple scheme (後文簡稱為 sss) 的記憶體用量, sss 沒有使用類似 malloc 的動態記憶體配置, 我們從三個方面來估算其使用的記憶體。

  1. 執行檔案大小
  2. bss,
  3. stack

stack

怎麼算出使用的 stack 容量有點難倒我, 畢竟 stack 的用量會和程式的執行流程有關, 就算同一支程式, 執行的流程不同, 也會得到不同的 stack 用量。

不記得是怎麼因為 __builtin_return_address 而查到這篇。
http://blog.linux.org.tw/~jserv/archives/001870.html

不過我正好需要這個功能。我打算讓 gcc 在離開 function 前插入一段程式碼, 紀錄 stack reigster, 把穿梭在這些 function 裡頭的 stack register 最小值記下, 而 stack register 初使值是 0x1000fff0, 兩者的差就是答案。說來簡單, 實作上愈到不少問題, 誰叫我要用 c++ 呢? 又多折磨我一點點。

在 void __cyg_profile_func_exit(void *this_func, void *call_site) 讀取 sp 的值。注意: 這兩個 function 要放在 extern "C" 裡頭。

myur.cpp
  1 /*
  2  * simple scheme on stm32F4XX
  3  *
  4  *
  5  */
  6 
  7 
489 extern "C"
490 {
491 
492 #ifdef SP_STATUS
493 
494 
495 u32 sp_val=0xffffffff;
496 u32 tmp_sp; 
497 
498 // ref: http://blog.linux.org.tw/~jserv/archives/001870.html
499 __attribute__((__no_instrument_function__))
500 void __cyg_profile_func_enter(void *this_func, void *call_site)
501 {
502 
503 }
504 
505 __attribute__((__no_instrument_function__))
506 void __cyg_profile_func_exit(void *this_func, void *call_site)
507 {
508 
509   //tmp_sp =  get_stack_reg();
510 
511   __asm__ volatile (
512             "mov %0, sp\n"
513             : "=&r"(tmp_sp)
514             :
515           );
516   if (tmp_sp < sp_val)
517     sp_val = tmp_sp;
518 }
519 #endif
520 }

另外需要 4.9.1 g++ 才能成功編譯, 4.7, 4.8 皆失敗, 4.9.1 來的正是時候。

descent@debianlinux:uart_echo$ arm-none-eabi-g++ --version
arm-none-eabi-g++ (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++480.err
1 arm-none-eabi-g++ -fno-exceptions -fno-rtti -g -fno-common -O0 -g -mcpu=cortex-m3 -mthumb -I../inc -DSP_STATUS -finstrument-functions   -c -o myur.o myur.cpp
2 myur.cpp:482:6: error: can't set '__no_instrument_function__' attribute after definition
3  void __cyg_profile_func_enter(void *this_func, void *call_site)
4       ^
5 myur.cpp:488:6: error: can't set '__no_instrument_function__' attribute after definition
6  void __cyg_profile_func_exit(void *this_func, void *call_site)
7       ^
8 make: *** [myur.o] Error 1

L6323, L6367 是反組譯之後可以看到被插入的 function。

arm-none-eabi-objdump -C -d myur.elf
   1 
   2 myur.elf:     file format elf32-littlearm
   3 
   4 
   5 Disassembly of section .text:
   6 
6316 08003ad8 <init_eval()>:
6317  8003ad8: b5b0       push {r4, r5, r7, lr}
6318  8003ada: af00       add r7, sp, #0
6319  8003adc: 4675       mov r5, lr
6320  8003ade: 462b       mov r3, r5
6321  8003ae0: 481c       ldr r0, [pc, #112] ; (8003b54 <init_eval()+0x7c>)
6322  8003ae2: 4619       mov r1, r3
6323  8003ae4: f7fc ffa8  bl 8000a38 <__cyg_profile_func_enter>
6324  8003ae8: 4b1b       ldr r3, [pc, #108] ; (8003b58 <init_eval()+0x80>)
6325  8003aea: 2206       movs r2, #6
6326  8003aec: 701a       strb r2, [r3, #0]
6327  8003aee: 4b1b       ldr r3, [pc, #108] ; (8003b5c <init_eval()+0x84>)
6328  8003af0: 2205       movs r2, #5
6329  8003af2: 701a       strb r2, [r3, #0]
6330  8003af4: 4b1a       ldr r3, [pc, #104] ; (8003b60 <init_eval()+0x88>)
6331  8003af6: 2201       movs r2, #1
6332  8003af8: 701a       strb r2, [r3, #0]
6333  8003afa: 481a       ldr r0, [pc, #104] ; (8003b64 <init_eval()+0x8c>)
6334  8003afc: 491a       ldr r1, [pc, #104] ; (8003b68 <init_eval()+0x90>)
6335  8003afe: f7fd fb0d  bl 800111c <s_strcpy(char*, char const*)>
6336  8003b02: 4b1a       ldr r3, [pc, #104] ; (8003b6c <init_eval()+0x94>)
6337  8003b04: 2201       movs r2, #1
6338  8003b06: 701a       strb r2, [r3, #0]
6339  8003b08: 4b19       ldr r3, [pc, #100] ; (8003b70 <init_eval()+0x98>)
6340  8003b0a: 2201       movs r2, #1
6341  8003b0c: 701a       strb r2, [r3, #0]
6342  8003b0e: 4819       ldr r0, [pc, #100] ; (8003b74 <init_eval()+0x9c>)
6343  8003b10: 4919       ldr r1, [pc, #100] ; (8003b78 <init_eval()+0xa0>)
6344  8003b12: f7fd fb03  bl 800111c <s_strcpy(char*, char const*)>
6345  8003b16: 4b19       ldr r3, [pc, #100] ; (8003b7c <init_eval()+0xa4>)
6346  8003b18: 2201       movs r2, #1
6347  8003b1a: 701a       strb r2, [r3, #0]
6348  8003b1c: 4818       ldr r0, [pc, #96] ; (8003b80 <init_eval()+0xa8>)
6349  8003b1e: 4919       ldr r1, [pc, #100] ; (8003b84 <init_eval()+0xac>)
6350  8003b20: f7fd fafc  bl 800111c <s_strcpy(char*, char const*)>
6351  8003b24: 4b18       ldr r3, [pc, #96] ; (8003b88 <init_eval()+0xb0>)
6352  8003b26: 2201       movs r2, #1
6353  8003b28: 701a       strb r2, [r3, #0]
6354  8003b2a: 4818       ldr r0, [pc, #96] ; (8003b8c <init_eval()+0xb4>)
6355  8003b2c: 4918       ldr r1, [pc, #96] ; (8003b90 <init_eval()+0xb8>)
6356  8003b2e: f7fd faf5  bl 800111c <s_strcpy(char*, char const*)>
6357  8003b32: 4b18       ldr r3, [pc, #96] ; (8003b94 <init_eval()+0xbc>)
6358  8003b34: 2201       movs r2, #1
6359  8003b36: 701a       strb r2, [r3, #0]
6360  8003b38: 4817       ldr r0, [pc, #92] ; (8003b98 <init_eval()+0xc0>)
6361  8003b3a: 4918       ldr r1, [pc, #96] ; (8003b9c <init_eval()+0xc4>)
6362  8003b3c: f7fd faee  bl 800111c <s_strcpy(char*, char const*)>
6363  8003b40: 2400       movs r4, #0
6364  8003b42: 462b       mov r3, r5
6365  8003b44: 4803       ldr r0, [pc, #12] ; (8003b54 <init_eval()+0x7c>)
6366  8003b46: 4619       mov r1, r3
6367  8003b48: f7fc ff80  bl 8000a4c <__cyg_profile_func_exit>
6368  8003b4c: 4623       mov r3, r4
6369  8003b4e: 4618       mov r0, r3
6370  8003b50: bdb0       pop {r4, r5, r7, pc}
6371  8003b52: bf00       nop

在我隨意的測試下, sp 是 100052A8。
1000fff0 - 100052A8 = ad48 = 44360 bytes

bss

比找出 stack 用量簡單不少, 用 readelf 讀出來就搞定:

[ 5] .bss NOBITS 20000060 010060 01df74 00 WA 0 0 4

0x01df74 = 122740 bytes

程式檔案本身

為什麼要加上程式檔案本身呢? 畢竟程式檔案本身會被載入記憶體, 不計算它好像說不過去, 但其中的 .data section 還要另外再算, 不過因為不是很大 (34 bytes),

[ 3] .data PROGBITS 20000000 010000 000034 00 WA 0 0 4

就忽略不計。

descent@debianlinux:stm32f4_simple_scheme$ ls -l myur.bin
-rwxr-xr-x 1 descent descent 22948 Nov 18 11:38 myur.bin

合計

44360 + 122740 + 22948 = 190048 bytes

若要再加上 .data section 34 byte, 就是 190048 + 34 = 190082 bytes

就算不加上程式本身, 192k 的記憶體被我用的也差不多了。當然這是因為我那些 pool 佔據了大量的記憶體, 改用 malloc 就會有所改善。

以下影片是我隨機跑了幾個 expression 的測試結果。



ref:
How much stack memory do I need for my ARM® Cortex®-M applications?
提到 gcc 的 --protect_stack, --protect_stack_all option。