2022年5月20日 星期五

Benjamin David Lunt os 教材 - usb 篇

実るほど, 頭下る, 稻穗かな;
下るほど, 仰がるる, 藤の花
在「Operating System Design Book Series」看到豐富的 os 資訊, 我對 usb 有興趣, 因為現在都是 usb 鍵盤、 滑鼠, 如果不處理 usb, 根本連鍵盤輸入都做不到, 而 pc 的 usb 掛在 pci 下, 所以僅僅為了處理鍵盤輸入, 就要搞 pci, usb 這些複雜的東西, 所以常看到的 os 鍵盤 driver 範例, 都是 ps/2 keyboard, 但在現實世界上, 太不實際了, 現在的主機板根本沒 ps2 孔。

作者 Benjamin David Lunt 寫了好幾本系列, 組合起來就是一個 OS, 我這次購買的是 USB, SATA 的部份, simple os 就是少了這 2 個支援, 由於不能讀寫硬碟, 所以我沒辦法實作虛擬記憶體的功能, 實在可惜。

list 1 所有系列書籍
[syscore]: Volume 1: The System Core
[filesys]: Volume 2: The Virtual File System
[media]:   Volume 3: Media Storage Devices
[io]:      Volume 4: Input and Output Devices
Volume 5 is currently not available
[gui]:     Volume 6: The Graphical User Interface
Volume 7 is currently not available
[usb]:     Volume 8: USB: The Universal Serial Bus

source code 本來付在書上的光碟, 現在改放在「https://github.com/fysnet/FYSOS

作者 Benjamin David Lunt 在 bochs 加入 usb 支援, 這樣應該可以讓你知道他對 usb 的認識。這些系列書籍都有 kindle 電子書的版本, 不過在電腦學習書上, 我還是偏愛實體書, 前後翻頁比較容易。

運費還是佔了相當的一部分, 整體費用提高不少, kindle 版本便宜不少, 也不用運費, 但學習書還是習慣讀紙本。在收到實體書時, 被 usb 這本的厚度嚇到, 難怪運費這麼貴。

USB: The Universal Serial Bus $39.99
FYSOS: Media Storage Devices  $22.59
Shipping & Handling           $22.80
Order Total                   $85.38

不過似乎買紙本書比較適合, 書中有很多表格都蠻大的, 在 6 吋螢幕上看可能不是個好主意, 買電子書的朋友可能需要用大螢幕來看這些表格。





好久沒在美國亞馬遜買實體書了, 過了好幾年之後又再次購買。這系列的書沒有特別標示出版社, 可能是 amazon 出版的書籍, 有 ISBN, 印刷時間 2022/4/16。

usb keyboard/mouse 的部份似乎沒有 source code, 只有文字講解, 這樣讓我有點失望, 我有點懷疑我自己能靠這樣的資訊就寫出 usb keyboard driver。書中雖然也有講解各種 USB Controllers stack, 但一樣沒程式碼, 我懷疑能不能完成我的心願。

先從偵測 USB Controllers 開始, source code 在 FYSOS/main/usb/utils/detcntlr, 原本的程式是在 freedos + DPMI (我實在沒想到還可以看到這個) 環境下執行, 我稍做修改, 可以在 linux 上直接執行。

其中麻煩的是要怎麼在 linux user mode 下直接 read/write port IO, 是的, 在 user mode 就可以執行 IO port read/write, 不需要在 kernel mode, 後來查到 int iopl(int level);, 也看到

man outb
1 #include <sys/io.h>
2
3 unsigned char inb(unsigned short int port);
4 unsigned char inb_p(unsigned short int port);
5 unsigned short int inw(unsigned short int port);
6 unsigned short int inw_p(unsigned short int port);
7 unsigned int inl(unsigned short int port);
8 unsigned int inl_p(unsigned short int port);

我不想用 inb/outb, 因為之後這段程式我想用在 bare-metal 環境, 所以用 iopl 就好, 但 man page 沒說 level 要怎麼設定, 我胡亂用 3 try (ref: Linux下設置端口權限的系統調用有兩個:ioperm和iopl), 結果是可以正常存取, 當然, 需要使用 root 執行。

改寫之後 list 1 是執行結果, 我在真實機器和模擬器中執行過, 都能正常執行。

list 1. detcntlr
 1 descent@debian64:detcntlr$ sudo ./detcntlr
 2 Detect USB Controllers on a PCI Bus.     v1.00.00
 3 Forever Young Software   --   Copyright 1984-2022
 4  Found a USB compatible device entry.
 5  Bus =  0, device =  6, function = 0, IO Base: 0xF1804000, IRQ: 10, size = 4096
 6 descent@debian64:detcntlr$ sudo ./detcntlr  /type
 7 Detect USB Controllers on a PCI Bus.     v1.00.00
 8 Forever Young Software   --   Copyright 1984-2022
 9  Found a USB compatible device entry. (OHCI)
10  Bus =  0, device =  6, function = 0, IO Base: 0xF1804000, IRQ: 10, size = 4096
11 # ./detcntlr    /type
12 Detect USB Controllers on a PCI Bus.     v1.00.00
13 Forever Young Software   --   Copyright 1984-2022
14  Found a USB compatible device entry. (xHCI)
15  Bus =  0, device = 12, function = 0, IO Base: 0xF0810000, IRQ: 11, size = 65536

作者大部分的程式都是在 freedos 下執行, 作為一個簡單的範例, 這樣是很好的, 很容易就可以移植到其他平台, 由於也支援 djgpp 編譯, 所以用 gcc 編譯可以說是無痛移植。

不過範例程式碼我不太知道要怎麼編譯, 沒有 makefile, 可能得手工編譯, djgpp 的版本是 20220125 加入的, 程式註解有寫如何編譯, 但如果是其他編譯器, 我就不知道怎麼編譯。不過由於範例都用最簡單的形式存在, 所以手工編譯還算容易。

我的修改放在: https://github.com/descent/FYSOS/tree/master/main/usb/utils/detcntlr

執行 OS kernel, 有 dos 的感覺。
cd FYSOS/images
qemu-system-x86_64 -hda hd.img
如果要執行 FYSOS/main/usb/freedos.img

list 2. freedos.img 部份目錄結構
descent@debian64:freedos_img$ tree .
.
├── command.com
├── CWSDPMI.EXE
└─── detcntlr
   ├── detcntlr.c
   ├── detcntlr.exe
   ├── detcntlr.h
   └── makeit.bat

要執行 detcntlr\detcntlr.exe 需要把 CWSDPMI.EXE 複製到 detcntlr, 然後再執行 detcntlr.exe。

cd FYSOS/main/usb
qemu-system-x86_64 -fda freedos.img
在 freedos 下操作
cd detcntlr
copy ..\CWSDPMI.EXE .
detcntlr.exe
detcntlr.exe /type


另外 janaxelson 也有出一系列 usb 的書, 比較偏向應用。
fig 5 janaxelson 其中一本 usb 書籍。


ref:

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。