2022年5月27日 星期五

gcc’s enable “–enable-default-pie” option

the 1st edition: 20220329

gcc 從某個版本之後預設開啟了 –enable-default-pie, 從那一版開始我不知道, 但是 gcc 5 沒有開啟這功能。可以用 gcc -v 來查看有沒開啟這功能。

gcc’s enable “–enable-default-pie” option make you stuck at “relocation R_X86_64_32S against …” error

這會影響什麼呢? 如果你是單純的使用者就沒什麼差異, 我的話有時候要看反組譯的組合語言, 有著 pie 的組合語言會比較難看懂, 所以我一般都會下 -fno-pic, -no-pie 來觀察 objdump 之後的組合語言。

通常會影響到全域變數的觀察。我是透過 bare-metal 程式來觀察 elf, bare-metal 的程式很簡潔, 所以很好觀察 elf 所有欄位。 cb.c L10 定義了一個 bbb 全域變數, L42 ++ 它。

cb.c
 1 __asm__(".code16gcc\n");
 2 /*
 3  * c bootloader
 4  */
 5 
 7 
 8 void main(const char   *s);
 9 
10 int bbb=0; // test bss section
11 
34   while(1);
35 }
36 
37 #ifndef POINTER_TEST
38 void main(const char   *s)
39 {
40   while(*s)
41   {
42     ++bbb;
43     __asm__ __volatile__ ("int  $0x10" : : "a"(0x0E00 | *s), "b"(7));
44     s++;
45   }
46 }
47 #endif

先觀察使用 -fno-pic 編譯出來的版本。

list 1 objdump -m i8086 -dS cb.elf -fno-pic
 1 
 2 cb.elf:     file format elf32-i386
 3 
 4 
 5 Disassembly of section .text:
 6 
 7 00007c00 <WinMain>:
 8 void main(const char   *s);
 9 
10 int bbb=0; // test bss section
11 
12 #ifndef POINTER_TEST
13 void main(const char   *s)
14 {
15     7c6c:	66 55                	push   %ebp
16     7c6e:	66 89 e5             	mov    %esp,%ebp
17     7c71:	66 53                	push   %ebx
18   while(*s)
19     7c73:	eb 2e                	jmp    7ca3 <main+0x37>
20   {
21     ++bbb;
22     7c75:	66 a1 10 7d          	mov    0x7d10,%eax
23     7c79:	66 83 c0 01          	add    $0x1,%eax

24     7c7d:	66 a3 10 7d          	mov    %eax,0x7d10
25     __asm__ __volatile__ ("int  $0x10" : : "a"(0x0E00 | *s), "b"(7));
26     7c81:	67 66 8b 45 08       	mov    0x8(%ebp),%eax
27     7c86:	67 66 0f b6 00       	movzbl (%eax),%eax
28     7c8b:	66 0f be c0          	movsbl %al,%eax
29     7c8f:	80 cc 0e             	or     $0xe,%ah
30     7c92:	66 ba 07 00 00 00    	mov    $0x7,%edx
31     7c98:	66 89 d3             	mov    %edx,%ebx
32     7c9b:	cd 10                	int    $0x10
33     s++;
34     7c9d:	67 66 83 45 08 01    	addl   $0x1,0x8(%ebp)
35   while(*s)
36     7ca3:	67 66 8b 45 08       	mov    0x8(%ebp),%eax
37     7ca8:	67 66 0f b6 00       	movzbl (%eax),%eax
38     7cad:	84 c0                	test   %al,%al
39     7caf:	75 c4                	jne    7c75 <main+0x9>
40   }
41 }
42     7cb1:	90                   	nop
43     7cb2:	66 5b                	pop    %ebx
44     7cb4:	66 5d                	pop    %ebp
45     7cb6:	66 c3                	retl   


可以從 list 2 L82 看到 bbb 的位址是 0x7d10, 對照 list 1 L22, L23, 可以看到就是把 bbb 做 +1 的動作。

list 2 cb.elf -fno-pic
 1 ELF Header:
 2   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
 3   Class:                             ELF32
 4   Data:                              2's complement, little endian
 5   Version:                           1 (current)
 6   OS/ABI:                            UNIX - System V
 7   ABI Version:                       0
 8   Type:                              EXEC (Executable file)
 9   Machine:                           Intel 80386
10   Version:                           0x1
11   Entry point address:               0x7c00
12   Start of program headers:          52 (bytes into file)
13   Start of section headers:          4428 (bytes into file)
14   Flags:                             0x0
15   Size of this header:               52 (bytes)
16   Size of program headers:           32 (bytes)
17   Number of program headers:         3
18   Size of section headers:           40 (bytes)
19   Number of section headers:         13
20   Section header string table index: 12
21 

44 
45 Program Headers:
46   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
47   LOAD           0x000000 0x00007000 0x00007000 0x00d1d 0x00d1d RWE 0x1000
48   LOAD           0x000d1d 0x00007d1d 0x00007dfe 0x00002 0x00002 RW  0x1000
49   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
50 
51  Section to Segment mapping:
52   Segment Sections...
53    00     .text .eh_frame .data 
54    01     .sig 
55    02     
56 
57 There is no dynamic section in this file.
58 
59 There are no relocations in this file.
60 
61 The decoding of unwind sections for machine type Intel 80386 is not currently supported.
62 
63 Symbol table '.symtab' contains 18 entries:
64    Num:    Value  Size Type    Bind   Vis      Ndx Name
65      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
66      1: 00007c00     0 SECTION LOCAL  DEFAULT    1 
67      2: 00007cb8     0 SECTION LOCAL  DEFAULT    2 
68      3: 00007d10     0 SECTION LOCAL  DEFAULT    3 
69      4: 00007d1d     0 SECTION LOCAL  DEFAULT    4 
70      5: 00000000     0 SECTION LOCAL  DEFAULT    5 
71      6: 00000000     0 SECTION LOCAL  DEFAULT    6 
72      7: 00000000     0 SECTION LOCAL  DEFAULT    7 
73      8: 00000000     0 SECTION LOCAL  DEFAULT    8 
74      9: 00000000     0 SECTION LOCAL  DEFAULT    9 
75     10: 00000000     0 FILE    LOCAL  DEFAULT  ABS cb.c
76     11: 00007cb8     0 NOTYPE  GLOBAL DEFAULT    1 _text_end
77     12: 00007d1d     0 NOTYPE  GLOBAL DEFAULT    3 _data_end
78     13: 00007c00     0 NOTYPE  GLOBAL DEFAULT    1 _text
79     14: 00007c6c    76 FUNC    GLOBAL DEFAULT    1 main
80     15: 00007c00   108 FUNC    GLOBAL DEFAULT    1 WinMain
81     16: 00007d10     0 NOTYPE  GLOBAL DEFAULT    3 _data
82     17: 00007d10     4 OBJECT  GLOBAL DEFAULT    3 bbb


再來看看 list 3, list 4 使用了 -fpic 的版本, bbb 位址只在 0x7d6c, 但是在 list 3 卻看不到存取這個位址的程式碼。 list 3 L24 ~ 26 一樣做 bbb +1 的動作, 但用到 edx 是從 L18 來的, 一個很特別的 function - _x86.get_pc_thunk.dx, 細節就不說了, 反正就是運用這個 fuction 間接取得 bbb 的位址。

list 3. ojdump -m i8086 -dS cb.elf cb pic
 1 
 2 cb.elf:     file format elf32-i386
 3 
 4 
 5 Disassembly of section .text:
 6 
 7 00007c00 <WinMain>:
 8 void main(const char   *s);
 9 
10 int bbb=0; // test bss section
11 
12 #ifndef POINTER_TEST
13 void main(const char   *s)
14 {
15     7c7c:	66 55                	push   %ebp
16     7c7e:	66 89 e5             	mov    %esp,%ebp
17     7c81:	66 53                	push   %ebx
18     7c83:	66 e8 5b 00 00 00    	calll  7ce4 <__x86.get_pc_thunk.dx>
19     7c89:	66 81 c2 f3 00 00 00 	add    $0xf3,%edx
20   while(*s)
21     7c90:	eb 36                	jmp    7cc8 <main+0x4c>
22   {
23     ++bbb;
24     7c92:	67 66 8b 82 f0 ff ff 	mov    -0x10(%edx),%eax
25     7c99:	ff 
26     7c9a:	66 83 c0 01          	add    $0x1,%eax
27     7c9e:	67 66 89 82 f0 ff ff 	mov    %eax,-0x10(%edx)
28     7ca5:	ff 
29     __asm__ __volatile__ ("int  $0x10" : : "a"(0x0E00 | *s), "b"(7));
30     7ca6:	67 66 8b 45 08       	mov    0x8(%ebp),%eax
31     7cab:	67 66 0f b6 00       	movzbl (%eax),%eax
32     7cb0:	66 0f be c0          	movsbl %al,%eax
33     7cb4:	80 cc 0e             	or     $0xe,%ah
34     7cb7:	66 b9 07 00 00 00    	mov    $0x7,%ecx
35     7cbd:	66 89 cb             	mov    %ecx,%ebx
36     7cc0:	cd 10                	int    $0x10
37     s++;
38     7cc2:	67 66 83 45 08 01    	addl   $0x1,0x8(%ebp)
39   while(*s)
40     7cc8:	67 66 8b 45 08       	mov    0x8(%ebp),%eax
41     7ccd:	67 66 0f b6 00       	movzbl (%eax),%eax
42     7cd2:	84 c0                	test   %al,%al
43     7cd4:	75 bc                	jne    7c92 <main+0x16>
44   }
45 }
46     7cd6:	90                   	nop
47     7cd7:	66 5b                	pop    %ebx
48     7cd9:	66 5d                	pop    %ebp
49     7cdb:	66 c3                	retl   
50 
51 Disassembly of section .text.__x86.get_pc_thunk.ax:
52 
53 00007cdd <__x86.get_pc_thunk.ax>:
54     7cdd:	67 66 8b 04 24       	mov    (%esp),%eax
55     7ce2:	66 c3                	retl   
56 
57 Disassembly of section .text.__x86.get_pc_thunk.dx:
58 
59 00007ce4 <__x86.get_pc_thunk.dx>:
60     7ce4:	67 66 8b 14 24       	mov    (%esp),%edx
61     7ce9:	66 c3                	retl   


list 5. cb.elf pic
 1 ELF Header:
 2   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
 3   Class:                             ELF32
 4   Data:                              2's complement, little endian
 5   Version:                           1 (current)
 6   OS/ABI:                            UNIX - System V
 7   ABI Version:                       0
 8   Type:                              EXEC (Executable file)
 9   Machine:                           Intel 80386
10   Version:                           0x1
11   Entry point address:               0x7c00
12   Start of program headers:          52 (bytes into file)
13   Start of section headers:          4772 (bytes into file)
14   Flags:                             0x0
15   Size of this header:               52 (bytes)
16   Size of program headers:           32 (bytes)
17   Number of program headers:         3
18   Size of section headers:           40 (bytes)
19   Number of section headers:         16
20   Section header string table index: 15
21 
65 
66 Symbol table '.symtab' contains 25 entries:
67    Num:    Value  Size Type    Bind   Vis      Ndx Name
68      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
69      1: 00007c00     0 SECTION LOCAL  DEFAULT    1 
70      2: 00007cdd     0 SECTION LOCAL  DEFAULT    2 
71      3: 00007ce4     0 SECTION LOCAL  DEFAULT    3 
72      4: 00007cec     0 SECTION LOCAL  DEFAULT    4 
73      5: 00007d6c     0 SECTION LOCAL  DEFAULT    5 
74      6: 00007d7c     0 SECTION LOCAL  DEFAULT    6 
75      7: 00007d88     0 SECTION LOCAL  DEFAULT    7 
76      8: 00000000     0 SECTION LOCAL  DEFAULT    8 
77      9: 00000000     0 SECTION LOCAL  DEFAULT    9 
78     10: 00000000     0 SECTION LOCAL  DEFAULT   10 
79     11: 00000000     0 SECTION LOCAL  DEFAULT   11 
80     12: 00000000     0 SECTION LOCAL  DEFAULT   12 
81     13: 00000000     0 FILE    LOCAL  DEFAULT  ABS cb.c
82     14: 00000000     0 FILE    LOCAL  DEFAULT  ABS 
83     15: 00007d7c     0 OBJECT  LOCAL  DEFAULT    6 _GLOBAL_OFFSET_TABLE_
84     16: 00007cdd     0 NOTYPE  GLOBAL DEFAULT    1 _text_end
85     17: 00007cdd     0 FUNC    GLOBAL HIDDEN     2 __x86.get_pc_thunk.ax
86     18: 00007ce4     0 FUNC    GLOBAL HIDDEN     3 __x86.get_pc_thunk.dx
87     19: 00007d79     0 NOTYPE  GLOBAL DEFAULT    5 _data_end
88     20: 00007c00     0 NOTYPE  GLOBAL DEFAULT    1 _text
89     21: 00007c7c    97 FUNC    GLOBAL DEFAULT    1 main
90     22: 00007c00   124 FUNC    GLOBAL DEFAULT    1 WinMain
91     23: 00007d6c     0 NOTYPE  GLOBAL DEFAULT    5 _data
92     24: 00007d6c     4 OBJECT  GLOBAL DEFAULT    5 bbb

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:

2022年5月12日 星期四

用 pascal 寫的 kernel

fig 1. 向 bootboot 致敬
Writing OS (bare metal with FPC)」是我想找用 pascal 寫的 kernel, 意外找到的。

source code: https://gitlab.com/bztsrc/bootboot 放在 gitlab 很少見, 一般都是放在 github, 作者似乎和 ms 有什麼恩怨的樣子。

圖示很有趣, 是一雙短靴 (不是 fig 1 那張照片), 我一開始以為跑到女性服飾的購物網站, 不過 boot 就是這個意思。

結果另外發現作者提供很多語言版本的 kernel, 除了我想要的 pascal 還有 ada ..., 另外還有其他平台的 bootloader/kernel 版本, 例如 Raspberry Pi4 ...

程式分為兩個部份, 一個是 bootloader, 以 x86 來說有提供 legacy bios, uefi; 另外就是 kernel, 這個就有多語言版本。編譯 pascal 寫的 kernel 要安裝 Free Pascal Compiler (fpc)。

以下介紹的 image 開發環境以 x86-64 uefi 為主, 舊的東西就不說了。其他平台我沒力看了。

編譯 bootboot/x86_64-efi 需要安裝 gnu-efi, 否則會看到缺少 efi.h 的錯誤, 這是一個 efi 開發環境, 有 efi runtime, 讓你不用面對 edk2 這個大傢伙, edk2 太複雜, 僅僅開發 bootloader 用 gnu-efi 就可以。

apt-get install gnu-efi

先來看看怎麼執行裡頭的 image, 以 x86_64-efi 的執行方式, 使用 qemu, 先來把這個 disk-x86.img image 執行起來。

先切到 origin/binaries branch:
git checkout origin/binaries -b binaries
cd images
另外需要 OVMF.fd, qemu 才能使用 uefi, 請自行搜尋下載。
qemu-system-x86_64 -bios OVMF.fd -hda disk-x86.img -net none
這樣就會看到一個圖形畫面, 是 kernel 執行的結果 (fig 2), 整個過程是 uefi bootloader 開機執行之後, load BOOTBOOT/INITRD, INITRD 裡頭有 sys/core, core 就是 kernel。

fig 2 預設 image 執行結果


影片是整個執行過程:


由於我已經會用 c 寫 uefi loader, 然後載入 kernel, 但看看他設計的方式也不錯。但讓我真的更感興趣的是用 pascal 寫的 kernel。

再來看看 disk-x86.img, 如何更新編譯後的 kernel? 步驟有點煩雜, 如果對於 uefi, linux initrd 不熟, 可能會難倒你, 需要使用 cpio。我花了一些功夫理解整個 disk-x86.img 的設計。

fig 3. pascal 寫的 kernel

fig 3 是我修改 pascal kernel 多印一個 pascal 字樣, 以示區別。再來介紹如何更新 image, 換上自己編譯的 kernel。

cd bootboot/mykernel/pas
makefile mykernel.x86_64.elf

如果失敗, 可以參考 list 1 的改法。

list 1. fpc 編譯指令
fpc -Px86_64 -Aelf -n -O3 -Xd -CX -XXs -Tlinux kernel.pas
ld -r -b binary -o font.o font.psf
ld -nostdlib -T link.ld kernel.o font.o -o mykernel.x86_64.elf
strip -s -K mmio -K fb -K bootboot -K environment -K initstack mykernel.x86_64.elf
readelf -hls mykernel.x86_64.elf > mykernel.x86_64.txt

Makefile 寫的有些錯誤, 在我的環境無法編譯, list 1 是我修正後的結果。

首先用以下指令把 disk-x86.img image 解出來。
# fdisk -lu disk-x86.img
Disk disk-x86.img: 128 MiB, 134217728 bytes, 262144 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 66AEEDA9-9F6A-2448-34BD-DEE6347D5A4E

Device        Start   End Sectors Size Type
disk-x86.img1   128 32895   32768  16M EFI System

losetup  /dev/loop1 disk-x86.img -o $((128*512))
mount /dev/loop1 a/
list 2 disk-x86.img 目錄結構
root@debian-vm:/home/descent/git/images/img# tree
.
├── BOOTBOOT
│   ├── CONFIG
│   ├── INITRD
│
├── BOOTBOOT.BIN
├── EFI
│   └── BOOT
│       └── BOOTX64.EFI
└── NvVars

整個流程是這樣: uefi 開機之後 load BOOTX64.EFI, BOOTX64.EFI, 會去找 BOOTBOOT/INITRD, INITRD 是一個 cpio 再 gzip 之後的檔案, 類似 linux 的 initrd, 裡頭長這樣:

list 3 BOOTBOOT/INITRD 內容
descent@debian-vm:a$ tree 
.
└── sys
    └─── core

sys/core 就是編譯出來的 pascal kernel。所以 BOOTX64.EFI load BOOTBOOT/INITRD 之後再去執行 sys/core。

解開 BOOTBOOT/INITRD:
mv INITRD INITRD.gz
gzip -d INITRD.gz
mkdir a
cd a
cpio -idv < ../INITRD
就會看到 list 3 的目錄結構, 把編譯好的 pascal kernel 複製到 sys/core 即可, 然後製作 cpio 檔案。
cd a
find . | cpio -ov > /tmp/object.cpio
gzip /tmp/object.cpio
cp /tmp/object.cpio.gz BOOTBOOT/INITRD

再來執行 qemu, 不需要製作 image 的檔案, qemu 可以直結讀取一個目錄當作 image file,
qemu-system-x86_64 -drive if=ide,file=fat:rw:img,index=0,media=disk -bios OVMF.fd -net none

img 就是我解開 disk-x86.img 的目錄。如果不熟 linux 這些 image 指令操作, 相信夠你忙一陣子。

另外也可自己打指令把 uefi loader 執行起來。


另外 disk-x86.img 似乎也同時支援 legacy bios, qemu-system-x86_64 -hda disk-x86.img 也可以看到 kernel 畫面。

至於我有興趣的 pascal kernel, 果然對 pascal 不熟, 有很多東西看不懂, 但大多是語法的部份, 關鍵的地方我已經弄懂, 本來應該自己挑戰一個試試, 不過我得先把時間花在別的地方。

2022年5月5日 星期四

covid-2019 快篩之亂

the 1st edition: 20220505
超前佈署, 超慢佈署, 沒有佈署, 類佈署。

20220428 民進黨政府仿照口罩推出了 covid-2019 快篩實名制, 為什麼需要實名制, 因為快篩不足, 這個有一年時間可以準備, 但真正需要時, 就是不夠, 這該算是超慢佈署吧? 不過超慢佈署總是比沒有佈署好。

我是要去買藍色普拿疼看到快篩真的很搶手, 需要排隊+實名制購買, 像極了口罩那時候的排隊風潮, 很容易就可以看到排隊的熱潮。但是連我要買的藍色普拿疼也沒貨, 這我就真的搞不懂了。

跑了四間藥局, 通通買不到藍色普拿疼, 買了替代的版本, 備用也好。

這個快篩搞出了很多事情:
fig 1 18:00 去時, 快篩已經賣完
讓本來就多事之秋的快篩又更複雜了。而也和往常一樣, 另外一方也有一個說法, 又是各說各話, 讓人民更混亂了, 我實在不想把自己的時間用在查證這些事情上, 查證這些事情花的時間不會比我研究一個電腦技術主題還少。而有些事, 如果被刻意隱瞞, 不是圈內人, 也是查不到真相的。像到現在我還找不到郭董到底有沒拿到 BNT 原廠授權書 (google 都找不到相關新聞), 所以才能捐 BNT 疫苗。

超商賣快篩 指揮中心不限制縣市企業自行進口 這個不禁止可能會讓人誤會, 並不是可以任意購買的意思, 還是要照醫療器材的規定, 讓合法的廠商購買, 並不是任何人可以任意購買的意思。另外 20220510 有這消息, 評估要開放可以個人購買 covid-2019 快篩 - 陳時中:開放個人進口快篩2個月 限自用不得販售「成效自行負責」

最近在網路的確有在酸國人買便宜快篩的言論, 買便宜的東西什麼時候也要被酸了, 買菜都會挑便宜的, 買個 3c 產品也是比價半天, 買實名快篩就要被酸哦! 還有一派提倡買東西還要特別「做功課」, 消費者挑便宜的東西買為什麼要被罵? 買便宜的東西是一個自然的行為, 有什麼好撻伐的, 這是不是「類護航」? 「快篩劑就是不足」黃國昌:還帶風向指責人民!讓人看不下

另外中央和台北市政府的快篩議題也令人眼花撩亂, 不知道誰說才是真的, 想要查清楚的話得花不少時間查證。

超前佈署項目:
  • 關閉境外入境
  • 提出口罩實名制
  • 管制口罩

超慢佈署項目:
另外超慢佈署的 BNT 終於來了 - 今年第一批採購Pfizer-BioNTech成人劑型疫苗185.796萬劑於今日 (2022-05-09) 上午抵臺

沒有佈署項目:
以下節目討論高登這間廠商, 可以大概理解個來龍去脈:




可以看到下面的意見也是很雜亂, 各種聲音都有, 讓真相更難知道了。

fig 2 2022/5/15 在第3間 7-11 買到, 第3間剛好補貨, 180nt。
fig 3 2022/5/16 排隊買到實名制快篩, 大約排20分鐘。


20220521 另外再買到實名制快篩, 這次沒有排隊, 很好買。
fig 5. 20220521 買到實名制快篩, 這次沒有排隊, 很好買。


快篩試劑哪裡有?2大超商App、LINE熱點一鍵查詢

20220521 netflix 為了戲劇行銷, 推出了一個快篩買不到的影片, 引起了一些反彈, 20220523 netflix 發出了道歉聲明。

2022年4月24日 星期日

淘寶物流 - dd 3 分發光眼鏡, 從深圳出貨, ezway 沒有報關通知

淘寶這陣子因為中國疫情 (covid-2019) 封城的關係, 物流相當不穩定, 這次的物品 20220415 電池特貨走深圳空運, 20220420 台灣清關完成, 20220422 在台灣收到, 奇怪的是 ezway 沒有資料需要我按, 真是奇怪, 公主集運客服是說 ezway 沒有即時更新, 我本來懷疑是不是在唬爛我, 沒想到是真的。在我收到物品之後, 也一直沒收到 ezway 海關資訊。



這次買的物品是發光眼鏡, 是3分娃用的, 只能紅色/綠色恆亮, 不能閃爍, 也不能切換顏色, 有點單調, 期待之後的改版。不過蠻有趣就是, 售價也不便宜, 我買了 2 個。

20220110 拍下, 35rmb/個。



我買的是 2.0 的版本, 看起來不太像眼鏡, 有點類似蛙鏡的感覺, 電池大大一顆在後方, 有點影響美觀, 3.0 的版本有改善, 比較像一般的眼鏡。透明的部份當然不是玻璃材質, 看起來像是透明塑膠的感覺, 沒有眼鏡的那種透明度, 有點可惜。



把很久之前買的黑色緊身服拿出來搭配, 很意外這個衣服竟然還沒有爛掉, 這種人工皮革很容易就因為時間太長而容易壞掉, 不過穿上之後, 還是可以看到有壞掉的跡象, 皮革被拉扯之後, 開始有點奇怪的微粒, 照片可能看不太出來就是。



發光眼鏡這樣的搭配頗有女特工的感覺, no 1, 該出任務了, 對於你的所做所為, 我們一概不承認。然後開始燒火柴 ...



由於這整件都是黑色, 內裡也是黑色, 拍完照之後就趕緊換下了, 我可不想在染黑一個身體了。

2022年4月20日 星期三

キャプテン・フューチャー (Captain Future) 動畫

小時候看過的卡通, 能再次見到, 真的感動。

以下從集數「數位修復版 超級經典 稀有日語發音英文字幕 太空突擊隊 全52集共六片」轉貼。

由於台視播映時部分集數順序與日本原版有所異動,故將兩者的播映集數分開列出。另外本作是以四集為一單元(相當於原作的一冊長篇),故在各集標題前均會註記所屬故事的單元總標題(原作名稱)。

日本台視單元名稱(原作標題)各集原文標題台視標題編劇演出作畫監督美術
1恐怖の宇宙帝王
(Captain Future and the Space Emperor)
宇宙帝王現わる宇宙怪人辻真先勝間田具治森利夫坂本信人
2炎の海の牢獄火海戰術原田謙一
3天翔ける砦の奇蹟對症下藥佐々木正広青鉢芳信下川忠海
4衛星ヌーンの決戦大決戰落合正宗坂本信人
5時のロスト‧ワールド
(The Lost World of Time)
SOS1億年前求救信號森下孝三青鉢芳信
6聖なる星クウムの謎古老的星球勝間田具治篠田章原田謙一
7太陽系創世記眼中釘高山秀樹森利夫坂本信人
8遥かなり50億年の旅放下屠刀秦秀信
9挑戦!嵐の海底都市
(Captain Future's Challenge)
破壊王の陰謀破壞王雷克金子武郎森下孝三篠田章辻忠直
原田謙一
10海底の罠大陰謀落合正宗坂本信人
11戦慄の海悪魔海底城勝間田具治森利夫
12破壊王の謎咎由自取森下孝三秦秀信
13輝く星々の彼方へ!
(The Quest beyond the Stars)
惑星に空気がなくなるとき天不作美神波史男勝間田具治
広田茂穂
內川文広
14悲劇の暗黒星聯合作業高山秀樹坂本信人
15見張りのおきて困難重重佐々木正広青鉢芳信秦秀信
16甦える惑星相得益彰松浦錠平鈴木章夫坂本信人
17透明惑星危機一髪!
(The Magician of Mars)
ウル・クォルンの挑戦緊急追緝令星山博之森下孝三森利夫辻忠直
18暗闇族のすむ地底改頭換面松浦錠平野田卓雄坂本信人
辻忠直
19惑星ただ一人輻射追蹤富田義治
山內重保
森利夫內川文広
20透明惑星の幻人間透明行星石黒昇
高山秀樹
篠田章坂本信人
21太陽系七つの秘宝
(Captain Future and the Seven Space Stones)
銀河に眠る神秘の石神祕寶石金子武郎橫井昭森利夫秦秀信
22銀河サーカスの死闘捷足先登篠田章坂本信人
23キャプテンフューチャー死す!探囊取寶橫井昭
高山秀樹
青鉢芳信內川文広
24未知のミクロ宇宙救世主松浦錠平森利夫秦秀信
2533暗黒星大接近!
(Calling Captain Future)
渦巻く墓標空襲警報辻真先中津川勲
勝間田具治
辻忠直
2634吠える大氷流危險區域中津川勲
山內重保
坂本信人
2735怪獣狩人は語る僕僕風塵佐々木正広原田謙一
2836幻の星、幻の文明黑暗星的破滅石黒昇
高山秀樹
三浦清継秦秀信
2925宇宙囚人船の反乱
(The Face of the Deep)
囚人船ハイジャックさる!百密一疏小野竜之助森下孝三
長谷川康雄
森利夫坂本信人
3026銀河からの大脱走賓客易主富田義治
山內重保
篠田章辻忠直
3127ゼロからの出発小行星的祕密石黒昇
高山秀樹
森利夫坂本信人
3228星くずのスペースマン同舟共濟松浦錠平野田卓雄辻忠直
3329魔法の月の決闘
(The Magic Moon)
キャプテンフューチャー募集!將計就計金子武郎森下孝三落合正宗秦秀信
3430恐怖のスペース・ロケーション明爭暗鬥小出啟介鈴木康彥坂本信人
3531幻影の惑星陰謀畢露高山秀樹森利夫秦秀信
3632放たれた最終兵器最後兵器森下孝三
長谷川康雄
菊池城二坂本信人
37彗星王の陰謀
(The Comet King)
消えた宇宙船娟娟失蹤了星山博之笠井由勝辻忠直
38彗星の支配者電氣怪人松浦錠平秦秀信
39アルルスの正体阿爾斯之謎石黒昇
山內重保
鈴木康彥坂本信人
40悪夢の世界・四次元四次元世界森下孝三
長谷川康雄
篠田章
41脅威!不死密売団
(The Triumph of Captain Future)
不死密売シンジケート生命之水金子武郎富田義治
高山秀樹
森利夫辻忠直
42不死帝王の挑戦前仆後繼小出啟介飯野皓秦秀信
43生と死の幻影生死邊緣森下孝三
山內重保
森利夫坂本信人
44永遠の都の決斗為民除害松浦錠平飯野皓辻忠直
伊藤岩光
45惑星タラスト救出せよ!
(Planets in Peril)
よみがえれ伝説の英雄異次元的求救辻真先森下孝三
山內重保
田辺由憲坂本信人
46グラッグ奪回作戦救援行動高山秀樹飯野皓內川文広
47ひとりぼっちの地獄刑逆來順受山內重保菊池城二松本健治
48英雄カフールの謎出奇制勝笠井由勝飯野皓坂本信人
49人工進化の秘密!
(The Star of Dread)
宇宙遺跡の謎帝國的祕密安藤豊弘石黒昇
山內重保
50半獣人の謎特殊人種佐々木正広山口俊和
51死都の対決任重道遠松浦錠平松本健治
52光と闇の彼方へ天理昭彰笠井由勝森利夫坂本信人


拜網路之賜, 也可以查到完整的資訊。忘記是不是「太空突擊隊」這個名字, 原文名字是キャプテン・フューチャー, 未來隊長, 為美國科幻小說家艾德蒙·漢彌頓寫的科幻小說, 1940 年代的作品。1978 日本做了卡通版本。



彗星號(コメット号)」也有販售模型, 它的地位類似海賊王的千陽號, 是魯夫キャプテン・フューチャー的座騎太空船, 有曲速引擎, 可以超快速飛行, 反正怎麼掰都是類似的。

主角是キャプテン・フューチャ - 未來隊長, 帥氣的太空服, 印象最深刻的就是胸口的大鏡子, 太空服有很多特異功能, 可以隱形之類的 ...





一些女性角色, 穿紅色服裝那位應該是女主角, 在劇中蠻常出現的。



另外未來隊長的夥伴有一個機器人, 一個橡皮人, 有易容術的能力, 還有一個腦, 以腦的形式活下來的教授。

我的英雄學員通形未吏生(通とお形がた ミリオ,Togata Mirio)/盧米利昂百萬 (ルミリオン,Lemilion) 的個性是穿透; 火影忍者帶土的能力也是穿透; 而早在 1978 年的キャプテン・フューチャー也有個有穿透能力的反派 - 宇宙帝王。

宇宙帝王是藉由高科技裝備擁有穿透能力, 怎麼攻擊他, 就是也帶著一樣的裝備, 就可以攻擊到他了。

另外還有回到一億年前的過去, 很扯吧, 當時就有這樣的想像力, 不過故事實際上是回到50億年, 那時還沒有九大行星, 佩服作家的想像力。

當時的動畫看起來不太流暢, 有點頓頓的感覺, 可能都是人工製作的關係。主題曲也有很濃厚那個時代的味道, 類似銀河鐵道999的主題曲。

平行宇宙、透明星球, 這些非常有想像力的故事, 竟然在那麼早期就有人想到了。

配音一樣高水準, 真的厲害。

這邊有中文配音第一集 - 【哲生的童年回憶】太空突擊隊 第一集(中文配音)

ref:
キャプテン・フューチャー

2022年4月15日 星期五

grub uefi for arm64 from source code

grub 可以編譯成 uefi 格式或是 legacy bios bootloader, 這邊介紹的是 uefi 格式, 並且是 arm64 的版本, 從編譯到執行。

wget --no-check-certificate https://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz
tar xvf grub-2.06.tar.xz
# grub for arm64 efi, 少了 efi_uga, video_bochs, video_cirrus, appleldr module
./configure --with-platform=efi --target=aarch64-elf --disable-werror  --prefix=/home/descent/grub-arm64-bin
make
make install

--target=aarch64-elf 是 toolchain 名字的一部分, 如果 toolchain 是 aarch64-elf-gcc 指定 --target=aarch64-elf; 如果 toolchain 是 aarch64-buildroot-linux-gnu-gcc 指定 --target=aarch64-buildroot-linux-gnu。編譯時 toolchain 要存在 PATH。

製作出 arm64.efi (grub uefi 執行程式)
cd /home/descent/grub-arm64-bin/lib/grub
../../bin/grub-mkimage -d arm64-efi  -p /EFI/grub -o arm64.efi -O arm64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs hfs iso9660 normal search_fs_file configfile linux loopback echo efi_gop file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true --prefix=/boot/grub/

做完最後一步就可以看到產生一個 arm64.efi, 再來用 qemu 來測試, 我沒有支援 uefi 的 arm64 機器。

可以製作一個磁片 image, 複製 arm64.efi 到該磁片 image 中, 我的範例是取名為 f.img, 另外 grub 會有額外的 mod 要安裝, 這邊我沒有複製這些 mod 檔案。

執行以下 qemu 指令, 載入磁片的 arm64.efi。

qemu-system-aarch64 -m 128 -M virt -cpu cortex-a57 -drive if=none,format=raw,file=f.img,id=hd0 -device virtio-blk-device,drive=hd0 -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -net none -nographic

再來的操作看影片比較容易理解:



ref: