2017年8月18日 星期五

樹莓派 2 透過 linux sys 設定 gpio

利用 linux sys 檔案系統來設定 gpio 很簡單, 不簡單的是 gpio 編號是多少呢? 我找了好久終於找到樹莓派 2 的 gpio pin 圖。

發現可以用 gpio pin 17, 27 來測試。

樹莓派 2 gpio pin

cd /sys/class/gpio
echo 27 > export
echo out > gpio27/direction
echo 1 > gpio27/value

cd /sys/class/gpio
echo 17 > export
echo out > gpio17/direction
echo 1 > gpio17/value

由於我沒有接上 led, 所以透過 LA 來確認有無正確設定這 2 個 gpio pin。



觀察 gpio 編號

mount -t debugfs none /sys/kernel/debug/
cat /sys/kernel/debug/gpio

#!/bin/sh
cd /sys/class/gpio/
echo 17 > export
echo out >  gpio17/direction

echo 27 > export
echo out >  gpio27/direction

while true; do
    echo 1 > /sys/class/gpio/gpio17/value
    echo 0 > /sys/class/gpio/gpio27/value
    #sleep 0.5
    echo 0 > /sys/class/gpio/gpio17/value
    echo 1 > /sys/class/gpio/gpio27/value
    #sleep 0.5
done

LA 抓到的波型

2017年8月11日 星期五

20170805~0806 coscup

coscup 是一年一度的 opensource 大會, 今年有搶到報名, 機會難得, 再次前往參加。



如何搭車依然困擾我, 最後選了比較辛苦的方式, 不知道是不是頭腦不清楚, 下車時, 還把紅色小帽留在車上, 好幾天之後, 才順利取回, 感謝行車人員的辛勞。

台北果然就是車多、人多, 不太習慣, 走路到捷運入口後, 搭乘捷運到科技大樓站, 再走路到台大社會科學院, 有點距離, 好在難不倒我, 就是手上東西多了點。

大概在 08:00 左右到達, 早到了, 工作人員才剛要開始佈置場地, 我就找個地方, 好好休息一下, 有點累!

08:45 報到後, 先去名人場, 有張善政董事長、呂秋遠律師、吳聲明建築師、柯文哲市長, 吳聲明的大稻埕、迪化街商圈建築的打造令我讚嘆, 我常覺得台灣的文化意識很低, 大部分人看中的還是錢錢錢, 吳聲明運用本身專業, 打造了和大稻埕、迪化街的空間, 讓附近的人們分享彼此遺忘的古老回憶, 這才是政府應該大力補助的文創才是, 而不是都在賣東西。

柯文哲, 就是那個台北市長, 大家都很熟, 不多說了, 我是帶著拜神的敬意來聽演講的。



再來是 303 的區塊鏈主題, 很多人, 擠不太進去, 這麼火紅的主題, 我應該要來略懂一下, 聽別人的分享是最快的。不過人算不如天算, 這場講者不講區塊鏈, 厄 ... 也沒關係, 就聽聽別的東西也很好。



最近共享單車很紅, 不過這邊只有 YouBike 台北市公共自行車, 我沒有登記的悠遊卡, 只能用信用卡借車, 但我搞了半天在選車時, 系統當機了, 後來就不再給我用信用卡借車了, 第一次使用的感覺很不好, 我又詢問 YouBike 客服, 信用卡客服, 確認有無被扣款, 心情不太好。最後就沒借車了。

隔壁體育館是動漫展, 好想去阿! 時間真的不夠。

下午聽了用 gcc 來最佳化 postgresql 的議程, 原來編譯器還真有特異功能, 只要選項下的好, 就有機會可以得到高效能的執行檔。

簡報: 用 GCC 讓你的 PostgreSQL 噴噴噴

fig 3. dd 3分皮革高跟開口鞋, 1880nt
再來去可汀, 可汀? coscup 有這議程? 當然沒有, 這是娃店, 一年只來一次。

這次主要想看矽膠素體, 可惜還沒到貨, 連展示的版本都沒有, 不過架上有個透明的娃體很吸引我, 目前已經沒有販售了。由於是透明的, 僅僅只有展示的功能, 不太適合拿來一般的打扮。

來尋寶吧! 來這裡幾乎每次都得花大錢才能脫離的, 這次我對一套衣服有興趣, 不過我竟然忘記拍照了, 衣服只適合 M 胸 (3xxx), 所以我就沒出手, 而且價錢也讓我猶豫中 ...

這次運氣還不錯, 似乎沒被什麼配件吸引到 (這算好處嗎?), 當然照例也要欣賞店長的娃娃, 這次店裡真是難得, 沒什麼人, 逛起來比較輕鬆。我仔細的觀察所有服飾配件, 最終被 fig 3 的 皮革高跟開口鞋吸引。

fig 3 可不是那個正妹的美腿, 是 3 分 DD 娃, 那雙鞋我一樣看了好幾遍, 猶豫不決, 過了幾分鐘後, 拿去店長那裡試穿, 當然是店長的娃, 看來還不錯, 就它了。

果然還是要帶點東西回去才有滿足感。晚上到鶯歌借宿 R 君家, 滿滿的火力展示, 感謝招待。

第一天實在太累了, 第二天醒來到會場時已經 11:00, 我想聽的 rust 議程已經都結束了, 趕緊去聽 BSDMIZER: a framework to improve FreeBSD continuously, 真的長見識, 連編譯這個動作都可以加入機器覺習, 讓編譯器編出效能更好的程式碼, 嚇死寶寶了。

Long-term Maintenance Model of Embedded Industrial Linux Distribution 議程則是提供了在工業控制上使用 linux 的經驗, 怎麼選定一個長期支援的 kernel 版本, 通常是以 10 年為計算單位, 講者似乎在一個很棒的 kernel team, 有這樣的能力完成這些工作。
再來就是 emcas 議程, 是 tg 上的朋友開講, fatfingererr, coldnew 都展示了 emcas 強大的能力, 不過我不知道怎麼才能學到他們那樣隨意的使用 emacs, 現在用 emacs 打這篇文章已經是我使用 emcas 的極限了, 無法像他們那樣, 這麼流利的使用。

fatfingererr:
開發連續技 - Auto-Complete 與 yasnippet 的結合應用 by fatfingererr

Yen-Chin Lee:

  1. 一個 org file: https://github.com/coldnew/COSCUP2017_org-mode/blob/master/slide.org
  2. 2013 年的投影片在這: http://coldnew.github.io/COSCUP2013_org-mode/slide.html

這次的下午茶點心還蠻多的, 之前都搶不到, 我找了個地方坐下來, 慢慢享用這些美食。

fig 5. 洋娃娃輓歌
時間差不多了, 我得趕緊離開會場, 趕去參觀一個「洋娃娃輓歌」的展覽, 由 Zihling 和 Mangasick 主辦, 地點在公館和古亭捷運中間, 但我走錯了, 多花了一點時間才到, 是這裡嗎? 我看著那個門, 突然有位水手服美少女走了出來, 沒有圖, 別問了, 我也很想留下一張照片的。我嚇傻了, 竟然在真實世界看到水手服美少女, 後來得知是店員。

再回到那個門, 勇敢的打開它, 進去了, 如果開到隔壁的門, 那就是非法闖入民宅。

Mangasick
是一個很特別的地方, 算是獨立書店。進的是日版的一些很特殊主題的漫畫, 可能會嚇壞人的那種主題, 看起來很詭異和情色有關。目前剛好有個「洋娃娃輓歌」的展覽, 是 Zihling 的插畫作品, fig 5 雖然是一個 bjd, 但這展覽其實是插畫, 和娃娃相關的主題。

我買了千之刃展覽手冊 (280), 本來猶豫不絕, 但看到有千之刃的簽名之後就沒任何猶豫了, 另外買了一本國內插畫家的畫冊 (350), 鼓勵一下國內的插畫創作, 這不容易, 很辛苦。

再來得去找住宿的地方了。從 airbnb 找到「星盒青年旅館」, 只有床位, 但從 airbnb 付款實在繁瑣, 還要附身份證的圖, 我比較喜歡直接到那裡, 詢問、付款、入住, 簡單多了。從中山捷運 5 號出口出來, 但是我走過頭, 南京西路 288 號我走到 4xx 號, 喵的勒。

櫃台小姐很親切, 也是正妹, 這邊進出需要通過警衛的管制, 有點麻煩, 第一次需要有人來帶, 進入電梯到四樓, 星期日價位 420 nt, 只有床位, 我很喜歡這樣的住宿方式, 台北竟然有這個, 隔壁是寧夏夜市, 剛好解決晚餐問題。買燒烤時有遇到一個正妹, 這是幸運的一天。



睡覺時遇到二重唱, 沒在怕的, 趕緊睡著加入三重唱。

本來想再去「白日夢森林」, 也是娃店, 不過交通不太方便, 最後還是沒去, 時間真的不太夠。


2017年8月4日 星期五

books - x86/x64 保護模式相關書籍

the 1st edition: 20131125

這篇文章被我遺忘了, 從 20131003 開始寫, 到現在 201708 了, 整整過了快 4 年, 沒辦法照心目中的想法完成, 先按照目前的內容出版吧!

一起把幾本相關的書介紹一下, 都是和 x86 保護模式相關。侯捷的文章有篇提到類似的技術: 93/04 無限延伸 DOS 視野, 以我的學習方式來說, 如果在那時代, 我一定會把這些書籍補齊 (雖然我看原文書的能力極度不佳)。不過我沒有經歷過那時代的程式設計, 不知道是有幸還是不幸; 在 linux 程式設計中, 不需要 undocument 系列, 該書評書中列的程式, 在 unix like os 都有對應的工具, 甚至還有 source code 可以參考。

現在的我寫的出如何進出保護模式的程式, 也寫得出 multitask 程式, 勉強趕上 1990 這些大師們的腳步。

1992 出版的 apue, 裡頭的技術, 到了現在 (2013) 還是可以使用, 1992 ms dos/windows 的技術呢? 辛苦這些程式設計師了。文章提到的技術雖已經過時, 但文章本身看來依然精彩, 我看得欲罷不能。

apue Details:
  • Series: Addison-Wesley Professional Computing Series
  • Hardcover: 768 pages
  • Publisher: Addison-Wesley Professional; First Edition edition (June 30, 1992)
  • Language: English
  • ISBN-10: 0201563177
  • ISBN-13: 978-0201563177
  • Product Dimensions: 9.2 x 7.8 x 2.2 inches
  • a
  • Shipping Weight: 3.2 pounds

我大概在 1998 年左右將重心從 ms 平台移到 linux 平台, 在當時, 這是一個看似自殺的舉動, 那時候誰寫程式不是在 ms windows 呢? 開始學習使用 linux 和 linux programming, 在 linux 上學習到的技術, 到現在 (2013) 一直都存在, 沒有淘汰的問題, 能踏進 unix 領域真的太棒了, 不用一直去追新的技術, 不用擔心 ms 出了什麼新東西沒去學習會怕跟不上, 所以我現在學新 (老) 東西, 也會仔細評估, 儘量不去學習有可能過時的技術, 也比較傾向於 open source 的東西。

看完書評, 我也想做類似的事情, 把我擁有/讀完的幾本書一起討論, 我想學侯老師的文章風格, 不過怕畫虎不成反類犬, 還是以自己的文字風格描述。我沒能看完所有內容, 所以只提看過的部份, 因為我對保護模式已經有了基本理解, 已經足夠我完成保護模式的 os, 所以有些細節就沒繼續研究。我的學習主要來自於 Orange's 一個作業系統的實現第三章。

因為要學習 x86 os 開發才會關注這些主題, 這個過程實在辛苦, 目前我已經把重心轉移到 arm cortex m3, 這顆 mcu 簡單不少, 我打算在上面開發一個研究用的 os, 稱做 cm3_simple_os, 打算以 c++ 實作, 若能把 simple_os (x86) 整合進來, 那 x86 和 cm3 就可以用同樣的程式碼了, 這路還很遠, 我沒把握。

侯老師提的書籍雖然已經過時, 不過文章本身很精彩, 建議一讀, 我是把這些技術當作歷史來讀。

和侯老師這篇評的書籍有所不同, 這裡所提到的方式都是自己撰寫程式碼, 並不靠誰來完成保護模式的程式, 我覺得這種方式比較可以學到基本的東西, 否則沒了 DOS Extender, 不就什麼都完成不了嗎? 那些書的技術會過時, VCPI/DPMI, ems/xms, 286-DOS Extender 和 386 DOS Extende, 沒學到這個不知道是幸還是不幸, 因為這些東西不容易, 若你辛苦學成, 到了現在也沒用了, 而且你可能也不會自己寫程式進出保護模式。但本篇文章介紹的這幾本可不會, 放心把錢掏出來。只要 x86 一直回溯相容, 這些書籍的知識就不會過時, 不過 intel 會不會倒掉那可不是我能保證的。別以為不可能, ms 會落到這種地步在 1993 年誰也不會想到。intel 也因為 mobile device 而追趕的很辛苦。

在那個年代 (1990) 就能寫出在 dos 進入保護模式, 存取 1M 之外的記憶體, 再回到 dos, 應該很轟動, 不過就算是 2013 年, 這也一樣不是那麼為人所知的程式。當然就是這些書讓我學會這些。更珍貴的是, 這是中文書籍, 比起外文書, 只要你肯看, 不會有語言障礙, 達成學習目標是比較容易的, 我敢說若你看一樣的原文書, 我一定比你先搞懂, 只要英文不是你的母語。

我相信去看原文書一定是最不得已的作法, 若是中文書有相同主題的東西, 我懷疑會有多少人去看原文書, 我不相信你可以忍受這樣的誘惑, 當然前提這本中文書籍一定也得有相當水準。台灣或許沒有, 不過拜中國崛起之賜, 同樣使用中文的我們可以看懂他們的簡體書籍, 而其豐富的主題不是台灣的電腦書籍可以比擬的 (不論是原創還是翻譯), 甚至還有不少出版社已經開始翻譯簡體中文書籍。

難得的是這幾本書都不是翻譯書, 在中文世界很少有這樣的主題。

不過我很懷疑會有多少人願意買這些書呢? 2013 已經不像 1990, 只有系統層級的東西有趣, 在網路普遍之後, 光 web 這塊就有了極大的變化, 還有 ios, android app, 嵌入式系統, linux 程式設計, 不在只是 ms 的天下, COM+, Office OLE, 這些東西的重要性已經沒那麼高, 從 web 演伸出來的雲端更是目前的大熱門, 2013 有很多程式領域可供選擇, 這種底層的東西非但無法帶來立即的成就感 (挫折感可能到不少), 而學習曲線更是陡峭, 你寫了一個保護模式的程式能幹嘛? 除非開發 os kernel, 否則一般人哪會去學習這個。用這技能找工作可能也不會太有優勢, 不過有趣就好, 讓我們來看看下面的書單。




x86/x64体系探索及编程
目录

第一篇  x86基础
第1章  数与数据类型 2
1.1  数 2
1.1.1  数字 2
1.1.2  二进制数 3
1.1.3  二进制数的排列 3
1.1.4  十六进制数 5
1.1.5  八进制数与十进制数 5
1.2  数据类型 6
1.2.1  integer数 6
1.2.2  floating-point数 9
1.2.3  real number(实数)与NaN(not a number) 11
1.2.4  unsupported编码值 14
1.2.5  浮点数精度的转换 15
1.2.6  浮点数的溢出 17
1.2.7  BCD码 20
1.2.8  SIMD数据 21
第2章  x86/x64编程基础 23
2.1  选择编译器 23
2.2  机器语言 24
2.3  Hello world 25
2.3.1  使用寄存器传递参数 26
2.3.2  调用过程 27
2.3.3  定义变量 27
2.4  16位编程、32位编程,以及64位编程 28
2.4.1  通用寄存器 28
2.4.2  操作数大小 30
2.4.3  64位模式下的内存地址 30
2.4.4  内存寻址模式 31
2.4.5  内存寻址范围 34
2.4.6  使用的指令限制 34
2.5  编程基础 34
2.5.1  操作数寻址 35
2.5.2  传送数据指令 39
2.5.3  位操作指令 45
2.5.4  算术指令 47
2.5.5  CALL与RET指令 48
2.5.6  跳转指令 48
2.6  编辑与编译、运行 48
第3章  编写本书的实验例子 50
3.1  实验的运行环境 50
3.2  生成空白的映像文件 52
3.2.1  使用nasm编译器生成 52
3.2.2  使用bximage工具 52
3.3  设置bochs配置文件 53
3.4  源代码的基本结构 54
3.5  编译源代码 55
3.6  映像文件内的组织 55
3.7  使用merge工具 56
3.7.1  merge的配置文件 57
3.7.2  执行merge命令 57
3.8  使用U盘启动真实机器 58
3.8.1  使用merge工具写U盘 58
3.8.2  使用hex编辑软件写U盘 59
3.9  编写boot代码 60
3.9.1  LBA转换为CHS 62
3.9.2  测试是否支持int 13h扩展功能 63
3.9.3  使用int 13h扩展读磁盘 64
3.9.4  最后看看load_module() 64
3.10  总结 66
第4章  处理器的身份 67
4.1  测试是否支持CPUID指令 67
4.2  CPUID指令的术语及表达 68
4.3  基本信息与扩展信息 68
4.4  处理器的型号(family,model与stepping) 72
4.5  最大的物理地址和线性地址 73
4.6  处理器扩展状态信息 74
4.6.1  探测Processor Extended State子叶 75
4.6.2  Processor Extended State子叶所需内存size 76
4.6.3  Processor Extended State的保存 77
4.6.4  Processor Extended State的恢复 78
4.7  处理器的特性 78
4.8  处理器的Cache与TLB信息 80
4.9  MONITOR/MWAIT信息 83
4.10  处理器的long mode 84
第5章  了解Flags 85
5.1  Eflags中的状态标志位 86
5.1.1  signed数的运算 86
5.1.2  unsigned数的运算 89
5.2  IOPL标志位 90
5.3  TF标志与RF标志 93
5.4  NT标志 95
5.5  AC标志 96
5.6  VM标志 98
5.7  eflags寄存器的其他事项 99
第6章  处理器的控制寄存器 101
6.1  CR8 102
6.2  CR3 103
6.3  CR0 104
6.3.1  保护模式位PE 104
6.3.2  x87 FPU单元的执行环境 104
6.3.3  CR0.PG控制位 108
6.3.4  CR0.CD与CR0.NW控制位 108
6.3.5  CR0.WP控制位 110
6.3.6  CR0.AM控制位 110
6.4  CR4 110
6.4.1  CR4.TSD与CR4.PCE控制位 110
6.4.2  CR4.DE与CR4.MCD控制位 111
6.4.3  CR4.OSFXSR控制位 111
6.4.4  CR4.VMXE与CR4.SMXE控制位 111
6.4.5  CR4.PCIDE与CR4.SMEP控制位 112
6.4.6  CR4.OSXSAVE控制位 113
6.4.7  CR4中关于页的控制位 113
6.5  EFER扩展功能寄存器 114
第7章  MSR 116
7.1  MSR的使用 116
7.2  MTRR 117
7.2.1  Fixed-range区域的映射 118
7.2.2  MTRR的功能寄存器 120
7.3  MSR中对特殊指令的支持 124
7.3.1  支持sysenter/sysexit指令的MSR 125
7.3.2  支持syscall/sysret指令的MSR 126
7.3.3  支持swapgs指令的MSR 127
7.3.4  支持monitor/mwait指令的MSR 128
7.4  提供processor feature管理 129
7.5  其他未列出来的MSR 129
7.6  关于MSR一些后续说明 129
第二篇  处理器的工作模式
第8章  实地址模式 132
8.1  真实的地址 132
8.2  real mode的编址 132
8.3  real mode的状态 133
8.4  段基址的计算 134
8.5  第1条执行的指令 134
8.6  实模式下的执行环境 135
8.7  实模式下的IVT 135
8.8  突破64K段限 136
8.9  A20地址线 137
第9章  SMM系统管理模式探索 138
9.1  进入SMM 138
9.2  SMM的运行环境 141
9.2.1  SMRAM区域 141
9.2.2  SMM执行环境的初始化 143
9.2.3  SMM下的operand与address 144
9.2.4  SMM下的CS与EIP 144
9.2.5  SMM下的SS与ESP 145
9.3  SMM里的中断 145
9.4  SMI的Back-to-Back响应 147
9.5  SMM里开启保护模式 147
9.6  SMM的版本 148
9.7  I/O指令的重启及Halt重启 151
9.8  SMM的退出 152
9.9  SMBASE的重定位 153
9.10  SMI处理程序的初始化 154
9.11  SMM的安全 156
9.11.1  芯片组的控制 156
9.11.2  处理器对SMRAM空间的限制 158
9.11.3  cache的限制 160
9.12  测试SMI处理程序 161
第10章  x86/x64保护模式体系(上) 163
10.1  x86/x64的权限 164
10.2  保护模式下的环境 164
10.2.1  段式管理所使用的资源 165
10.2.2  paging分页机制所使用的资源 165
10.3  物理地址的产生 166
10.4  段式管理机制 167
10.4.1  段式内存管理 168
10.4.2  段式的保护措施 168
10.5  段式管理的数据结构 169
10.5.1  Segment Selector(段选择子) 169
10.5.2  Descriptor Table(描述符表) 172
10.5.3  Segment Selector Register(段寄存器) 174
10.5.4  Segment Descriptor(段描述符) 175
10.5.5  LDT描述符与LDT 258
10.6  开启保护模式 260
10.6.1  初始化GDT 260
10.6.2  初始化IDT 262
10.6.3  切换到保护模式 263
第11章  x86/x64保护模式体系(下) 265
11.1  物理页面 265
11.1.1  处理器的最高物理地址(MAXPHYADDR) 266
11.1.2  物理页面的大小 267
11.1.3  页转换模式(Paging Mode) 268
11.2  paging机制下使用的资源 270
11.2.1  寄存器 270
11.2.2  CPUID查询leaf 270
11.2.3  寄存器的控制位 271
11.2.4  页转换表资源 272
11.3  32位paging模式(non-PAE模式) 273
11.3.1  CR3结构 274
11.3.2  32位paging模式下的PDE结构 275
11.3.3  使用32位paging 279
11.4  PAE paging模式 282
11.4.1  在Intel64下的CR3与PDPTE寄存器 283
11.4.2  在AMD64下的CR3 285
11.4.3  PAE paging模式里的PDPTE结构 286
11.4.4  PAE paging模式里的PDE结构 286
11.4.5  PAE paging模式里的PTE结构 288
11.4.6  使用和测试PAE paging模式 288
11.4.7  使用和测试Execution Disable功能 292
11.5  IA-32e paging模式 297
11.5.1  IA-32e paging模式下的CR3 299
11.5.2  IA-32e paging模式下的PML4E结构 302
11.5.3  IA-32e paging模式下的PDPTE结构 302
11.5.4  IA-32e paging模式下的PDE结构 303
11.5.5  IA-32e paging模式下的PTE结构 304
11.5.6  SMEP机制 304
11.5.7  使用IA-32e paging模式 308
11.6  TLB与Cache 314
11.6.1  TLB 315
11.6.2  Paging-Structure Cache 328
11.7  page的内存cache类型 335
11.7.1  PAT(Page Attribute Table) 335
11.7.2  PAT MSR 337
11.7.3  各级table entry的PCD及PWT标志 337
11.8  页的保护措施 338
11.8.1  访问权限位U/S的检查 338
11.8.2  读/写权限位R/W的检查 339
11.8.3  执行权限位XD的检查 339
11.8.4  缺页保护P标志位的检查 340
11.8.5  保留位的检查 341
第12章  Long-mode 342
12.1  x64体系的设计原则 343
12.2  开启long-mode 344
12.2.1  检测处理器是否支持long-mode 344
12.2.2  EFER寄存器 345
12.2.3  进入long-mode的必要条件 346
12.3  退出long-mode 350
12.4  long-mode的执行环境 352
12.4.1  处理器模式的判断 352
12.4.2  64位模式下的段描述符 353
12.4.3  Long-mode的gate描述符 353
12.4.4  Long-mode的描述符表结构 355
12.4.5  Long-mode模式的段寄存器 356
12.4.6  Long-mode的paging机制 357
12.5  long-mode的指令环境 358
12.5.1  64位模式的操作数 358
12.5.2  64位模式下的无效指令 360
12.5.3  64位模式下的寻址模式 361
12.6  64位模式与compatibility模式编程 363
12.6.1  64位模式切换到compatibility模式 363
12.6.2  compatibility模式切换到64位模式 363
12.6.3  利用compatibility模式执行legacy的库函数 364

第三篇  调试与性能监控
第13章  断点调试 370
13.1  Single-Step单步调试模式 370
13.2  Breakpoint调试模式 371
13.3  Memory和I/O地址调试模式 372
13.3.1  断点寄存器DR0~DR3 372
13.3.2  状态寄存器DR6 372
13.3.3  控制寄存器DR7 373
13.3.4  Fault与Trap类型的debug异常 375
13.3.5  General Detect产生的#DB异常 375
13.3.6  执行断点指令产生的#DB异常 377
13.3.7  访问数据断点产生的#DB异常 386
13.3.8  访问I/O断点产生的#DB异常 390
13.3.9  任务切换时产生的Trap调试异常 392
第14章  分支记录 394
14.1  检测处理器的家族和型号 395
14.2  初识Branch Record 395
14.2.1  记录存放的地方 395
14.2.2  记录的形式 396
14.2.3  何时进行记录 396
14.3  IA32_DEBUGCTL寄存器 396
14.3.1  配置Branch trace record的存放 398
14.3.2  CPL-qualified branch record(受CPL限制的BTS) 399
14.3.3  冻结监控 400
14.4  LBR stack 402
14.4.1  FROM_IP与TO_IP寄存器 402
14.4.2  IA32_LASTBRANCH_TOS寄存器 404
14.4.3  LBR stack的使用 405
14.5  使用LBR捕捉branch trace 405
14.6  #DB异常下的LBR 419
14.7  IA-32e模式下的LBR stack 421
14.8  使用Single-step on branch功能 428
14.9  BTS(Branch Trace Store)机制 429
14.9.1  检测DS(Debug Store)是否支持 430
14.9.2  Debug store 64位格式 431
14.9.3  检测BTS(Branch Trace Store)机制是否可用 431
14.9.4  检测PEBS(Precise Event Based Sampling)机制是否可用 432
14.9.5  Debug Store存储区域 432
14.9.6  设置DS存储区域 439
14.9.7  使用环形回路BTS buffer 443
14.9.8  使BTS buffer产生DS中断 447
14.9.9  过滤BTS记录 459
14.9.10  64位模式下的BTS机制 463
第15章  性能监控 469
15.1  性能监控机制 469
15.2  Performance monitoring机制的版本 470
15.2.1  确定处理器所支持的功能 471
15.2.2  IA32_PMCx寄存器在各版本中的数量 472
15.2.3  IA32_PMCx寄存器的宽度 472
15.2.4  预定义的event 473
15.3  Nehalem架构下的性能监控机制 474
15.3.1  物理资源 474
15.3.2  counter(计数器) 475
15.3.3  开启计数器 476
15.3.4  全局控制器 476
15.3.5  通用计数控制器 477
15.3.6  固定用途计数控制器 478
15.3.7  全局状态寄存器 480
15.3.8  全局溢出控制器 481
15.3.9  使用Performance monitoring的例子 481
15.3.10  在PMI中冻结计数器 486
15.4  PEBS(Precise Event Based Sampling)机制 489
15.4.1  PEBS buffer 490
15.4.2  PEBS中断 493
15.4.3  PEBS事件 496
15.4.4  PEBS的触发 497
15.4.5  PEBS记录的报告 498
15.4.6  PEBS buffer满时中断 504
15.4.7  多个PMI触发 510
15.4.8  Load latency监控机制 521
15.5  使用Fixed计数器 525
15.6  Time-stamp counter与clock 528
15.6.1  Invariant TSC 529
15.6.2  读取TSC值 530
15.6.3  Clock per instruction 531
第四篇  中断体系
第16章  中断与异常处理 538
16.1  Interrupt Source(中断源) 539
16.1.1  硬件中断 539
16.1.2  软件中断 540
16.2  Exception Source(异常源) 540
16.3  Exception的恢复 541
16.4  中断vector 544
16.5  中断的屏蔽 545
16.5.1  可屏蔽的中断 545
16.5.2  不可屏蔽的中断 547
16.6  IDTR寄存器 548
16.7  IVT(Interrupt Vector Table) 549
16.8  IDT(Interrupt Descriptor Table) 550
16.9  gate描述符 551
16.9.1  legacy保护模式下的Interrupt-gate与Trap-gate描述符 551
16.9.2  IA-32e模式下的Interrupt-gate与Trap-gate描述符 552
16.9.3  Task-gate描述符 552
16.10  软件上的中断/异常处理流程 553
16.10.1  处理器对gate描述符和code描述符的检查 553
16.10.2  权限的检查 556
16.10.3  权限处理的三种情形 557
16.10.4  第1种情形:同级调用 558
16.10.5  第2种情形:权限及stack的切换 559
16.10.6  第3种情形:conforming代码段 566
16.10.7  Eflags标志位的处理 567
16.10.8  执行中断/异常处理程序 567
16.11  中断/异常调用中的任务切换 567
16.12  中断/异常调用返回 568
16.12.1  返回时的任务切换 568
16.12.2  IRET指令的operand size 568
16.12.3  IRET指令返回前的检查 571
16.12.4  返回到低权限级别时 573
16.12.5  同级返回 578
16.13  错误码 579
第17章  8259中断控制器 582
17.1  8259结构 583
17.1.1  IRQ的优先级 584
17.1.2  中断请求状态 584
17.1.3  中断服务状态 584
17.1.4  中断屏蔽状态 585
17.1.5  中断响应过程 586
17.2  8259编程 587
17.2.1  8259寄存器I/O地址 587
17.2.2  8259初始化 588
17.2.3  8259的操作字 592
17.2.4  设置edge和level触发模式 596
第18章  Local APIC体系 597
18.1  APIC体系概述 597
18.1.1  local APIC接收到的中断源 598
18.1.2  APIC体系的版本 600
18.2  使用local APIC 600
18.2.1  检测local APIC版本 600
18.2.2  开启和关闭local APIC 601
18.3  local APIC寄存器 604
18.3.1  local APIC寄存器地址 604
18.3.2  local APIC寄存器列表 606
18.4  local APIC ID 609
18.4.1  local APIC ID寄存器 609
18.4.2  APIC ID在multi-threading处理器下 610
18.4.3  multi-threading技术的使用 617
18.4.4  multi-threading处理器编程 627
18.5  local APIC版本寄存器 633
18.6  LVT寄存器 634
18.7  ICR(Interrupt Command Register) 635
18.8  LVT寄存器及ICR的设置 636
18.8.1  delivery mode的设置 636
18.8.2  trigger模式的设置 637
18.9  中断vector及priority 637
18.9.1  local interrupt的vector设置 637
18.9.2  有效的vector值 638
18.9.3  local interrupt的优先级 638
18.9.4  在64位模式下的优先级 640
18.10  处理器的IPI机制 641
18.10.1  IPI消息对象 641
18.10.2  使用physical目标模式 641
18.10.3  使用logical目标模式 645
18.10.4  多处理器的初始化与编程 648
18.11  local APIC的中断处理 659
18.11.1  检查目标 660
18.11.2  IRR和ISR仲裁 661
18.11.3  发送EOI命令 663
18.12  APIC timer 663
18.13  错误处理 666
18.14  LINT0与LINT1 669
18.14.1  LINT0与LINT1寄存器 670
18.14.2  从LINT0屏蔽外部中断请求 672
18.14.3  从LINT1屏蔽NMI 673
18.15  Performance Monitoring 675
第19章  I/O APIC 679
19.1  I/O APIC寄存器 680
19.1.1  direct register(直接寄存器) 680
19.1.2  indirect register(间接寄存器) 682
19.1.3  I/O APIC的IRQ 684
19.1.4  I/O APIC的中断处理 685
19.2  使用HPET(高精度定时器) 688
19.2.1  HPET寄存器基址 688
19.2.2  HPET的工作原理 689
第五篇  浮点与SIMD指令环境
第20章  x87 FPU单元与MMX技术 698
20.1  x87 FPU执行环境 699
20.1.1  x87 FPU 数据寄存器 700
20.1.2  x87 FPU的stack结构 701
20.1.3  x87 FPU状态寄存器 710
20.2  x87 FPU的异常 718
20.2.1  status寄存器的异常标志位 719
20.2.2  异常的屏蔽 720
20.2.3  #IS与#IA异常 720
20.2.4  #D异常 722
20.2.5  #Z异常 723
20.2.6  #O与#U异常 723
20.2.7  舍入 727
20.3  x87 FPU的异常处理机制 729
20.3.1  默认处理方法 730
20.3.2  unmasked下的异常 732
20.3.3  使用native模式 732
20.3.4  使用DOS compatibility模式 739
20.4  MMX指令环境 742
20.4.1  MMX寄存器 742
20.4.2  64位SIMD整数运算 743
20.4.3  MMX指令的比较操作 746
20.4.4  MMX指令的unpack操作 746
20.4.5  x87 FPU与MMX混合编程 747
20.5  x87 FPU与MMX的状态 748
20.5.1  x87 FPU环境信息的保存 748
20.5.2  使用FSAVE/FNSAVE指令 749
20.5.3  MMX寄存器的保存 750
20.6  x87 FPU与MMX环境的设置 750
20.6.1  为任务切换设置环境 751
20.6.2  x87 FPU与MMX环境的推荐设置 758
第21章  SSE系列指令环境 759
21.1  处理器的资源 760
21.1.1  处理器对SSE指令的支持 761
21.1.2  128位的XMM寄存器 762
21.1.3  MXCSR 762
21.1.4  SIMD数据类型 765
21.2  SSE系列指令的异常 765
21.2.1  异常的屏蔽 766
21.2.2  numeric异常的处理 769
21.3  SSE系列指令的操作 771
21.3.1  packed数据的运算 772
21.3.2  scalar数据的运算 772
21.3.3  Horizontal的运算 773
21.3.4  MOV与load/store操作 773
21.3.5  shuffle操作 774
21.3.6  unpack操作 777
21.3.7  blend操作 777
21.3.8  insert操作 778
21.3.9  extract操作 780
21.3.10  compare操作 781
21.3.11  logical操作 783
21.3.12  convert操作 785
21.3.13  string处理指令 788
21.4  SSE系列指令操作环境 800
21.4.1  SSE系列指令支持 800
21.4.2  SSE系列指令State信息 801
21.4.3  SSE系列指令环境的设置 805
21.4.4  x87 FPU/MMX与SSE环境的延时切换 807
附录A  参考资料 808
附录B  实验清单 809

這是本大部頭, 20130121 購於台南若水堂 119 X 5.2 = 619, 可不是便宜的書籍。不過其技術含量絕對不只值這價錢, 這是一本教 x86/x64 cpu 的書籍, 涵蓋 x86 保護模式, 以及 64 bit 模式的程式設計。

有人說這不是初學者看得懂的書, 我不能確定, 畢竟我不是初學者, 但就算初學者還是可以試著讀讀看, 會拿起這本書的讀者一定是想知道 x86 的細節, 到底什麼是 x86 cpu?


中國亞馬遜的評論
内容零乱,不适合初学者。不能说书的内容一无是处,但是初学者看绝对一头雾水,所以不建议初学者看。
回应 | 
这条评论对您有用吗?
平均2.0 星 很一般的书 2013年3月24日
评论者 alemist
购买过此商品
很一般的书,内容很杂,没有重点,当参考书用都参考不了 

中國亞馬遜上的評價看到這評論, 寫出這種評論很容易, 但要寫出這本書, 難度至少是 n 次方起跳, 身為讀者, 我看得很難過, 我相信作者更難過, 文人相輕莫過於此。看輕別人除了顯示你自己的自尊高之外, 並不能提高自己的程度。身為讀者尊重一本好書是我認為最基本的態度, 不管這本書對你是否有用。

你能說出 x86 16 bit, 32 bit, 64 bit 的程式有什麼不同嗎?
好奇為什麼這樣的程式碼稱為 16 bit, 那樣的則稱為 32 bit, 而怎樣又是 64 bit 程式?
和暫存區器寬度、位址線有關係嗎?

我曾經被這些問題所迷惑 ... 當然我並不是只看本書就解除疑惑, 這是我知識金字塔的累積, 問題很久之前就有, 但答案卻是很久之後才知道。但本書還是能提供不少線索來理解這問題。

x86 很複雜, 但是能在一顆 cpu 就同時享受 16 bit, 32 bit, 64 bit 程式, 似乎也只有 x86 這樣有包袱的 cpu 才能遇到。它是一顆偉大的 cpu。

x86 為了相容而倒置這麼混亂的東西想把他釐清嗎? 看看本書並搭配作者的網站, 相信會有很好的收穫。

可以把 x86/x64 体系探索及编程當成一本組合語言學習書籍, 和台灣一堆教組合語言的書籍不同在於: 自己打造執行環境, 從開機後就執行書上的範例程式, 沒有 os 介入。沒有什麼 int 21 中斷的東西, 都什麼時代了, 還有多少人需要學習 dos int 21, 這對於學習組合語言來說是沒必要的, bios call 可能還更重要些 (不過可能也要過時了)。

8.8 提到 big real mode, big real mode 可以在真實模式下存取到 4g 記憶體, 又可以使用真實模式下的 bios call, 很神奇吧, 你一定有興趣的。

我實作了這個功能, 請參考:《在 x86 真實模式載入大於 1M 的 kernel

第 12 章介紹 long mode (64 bit mode), 要怎麼進入 long mode 呢? 和進入保護模式一樣, 需要寫一段程式碼, 可以由保護模式進入 long mode, 也可以由真實模式進入 long mode, 但是和保護模式不同, long mode 需要使用 paging, 所以還得先把 paging 搞定才行; 而保護模式並不一定要啟用 paging。 你應該有發現, 就算使用 long mode, 32bit 程式碼一樣可以正常執行, 這可是保護模式無法做到的事情 (保護模式無法執行 16bit 程式, 或者應該這麼說, 執行結果不是你要的), 很厲害的設計吧!

chapter 13 談論 x86 相關的 debug, breakpoint, single-step 技術, 有些範例在 vmware, bochs 和真實機器下結果不同, 模擬器畢竟只是模擬器, 在開發 simple os 時, 我也因為太相信模擬器結果吃了不少虧, 總之還是用真實機器跑過一次最準確。

書本相關訊息: http://www.mouseos.com/books/x86-64/index.html
x86/x64 指令编码内幕(适用于 AMD/Intel): http://www.mouseos.com/x64/index.html

一起參考
学习OpCode: http://www.luocong.com/learningopcode.htm



80x86汇编语言程序设计教程 [平装]
~ 杨季文 (编者)

市场价: ¥ 39.00
价格: ¥ 31.20 此商品可以享受免费送货 详情
为您节省: ¥ 7.80 (8折)


原來台灣技術書籍的水準已經差中國這麼多了, 80x86 汇编语言程序设计教程 (杨季文) 這本可是 1998 年出版的, 其中第二部份在探討保護模式, 並且有組合語言範例 (masm) 針對保護模式切換、中斷、權限、分頁管理 ...

真可悲, 我還把 80486/Pentium 保護模式原理與實務當寶貝, 80x86 汇编语言程序设计教程這本的技術含量高多了, 原來台灣落後這麼多了, 要得到這些資料只能硬 K intel 那手冊嗎? 保證 K 死你, 光印出來就累了, 什麼, 你要在電腦上看, 那我猜你一定沒看過這些手冊吧!

很高興我可以刪除那些字眼, 80386 使用手冊, 民國 79 年 (1990) 12 月就已經出版, 這是與中國這些書籍可以一拼的書。

1998 年的書, 就談到怎麼寫保護模式的程式碼了。難怪中國一堆 x86 保護模式的資料。這本好像是少見的長賣書籍, 中國書籍雖然產量豐富, 但是大多一刷之後就沒了, 手頭這本是 200908 第 18 刷, 嚇了一跳, 賣了十多年的書, 我懷疑這本書是被的當成教科書才能如此長命, 讓 2013 年的我還買得到。

這本書有過時嗎? 前半部肯定是的, dos 下的程式設計大概很難在遇上了, 當然有些觀念是相通的, 不過 int 21 的用法很難再派上用場了。後半部的保護模式則是最精彩的部份, 就算現在使用 64bit cpu, 還是有相當參考價值。

還能買到, 運氣不錯, 但是書況不是很好, 有點破損又泡水, 我收到時心理頭不大痛快。而且沒有範例程式可以下載, 這很頭疼, 要是書上的程式碼有錯就慘了。

chapter 12 講解實際操作方式, 使用的是 masm 5.0 的版本, linker 是 3.0; 也有提到 tasm/tlink 的操作方式。還好 masm 5.0 還能支援組譯出 x86 32bit code。

1998 年的書自然不會提到 long mode (64 bit), 那時候可還沒有這樣的 cpu。

目录

第一部分 基础部分
第1章 绪论
1.1 汇编语言概述
1.2 数据的表示和类型
1.3 Intel系列CPU简介
1.4 习题
第2章 8086/8088寻址方式和指令系统
2.1 8086/8088寄存器组
2.2 存储器分段和地址的形成
2.3 8086/8088的寻址方式
2.4 8086/8088指令系统
2.5 习题
第3章 汇编语言及其程序设计初步
3.1 汇编语言的语句
3.2 变量和标号
3.3 常用伪指令语句和源程序组织
3.4 顺序程序设计
3.5 分支程序设计
3.6 循环程序设计
3.7 习题
第4章 子程序设计和DOS功能调用
4.1 子程序设计
4.2 主程序与子程序间的参数传递
4.3 DOS功能调用及应用
4.4 磁盘文件管理及应用
4.5 子程序的递归和重入
4.6 习题
第5章 输入输出与中断
5.1输 入和输出的基本概念
5.2 查询方式传送数据
5.3 中断
5.4 基本输入输出系统BIOS
5.5 软中断处理程序举例
5.6 习题
第6章 简单应用程序的设计
6.1 字符串处理
6.2 十进制数算术运算调整指令及应用
6.3 DOS程序段前缀和特殊情况处理程序
6.4 TSR程序设计举例
6.5 习题
第7章 高级汇编语言技术
7.1 结构和记录
7.2 宏
7.3 重复汇编
7.4 条件汇编
7.5 源程序的结合
7.6 习题

第8章 模块化程序设计技术
8.1 段的完整定义
8.2 段的简化定义
8.3 模块间的通信
8.4 子程序库
8.5 编写供Turbo C调用的函数
8.6 习题
第二部分 提高部分
第9章 80386程序设计基础
9.1 80386寄存器
9.2 80386存储器寻址
9.3 80386指令集
9.4 实方式下的程序设计
9.5 习题
第10章 保护方式下的80386及其编程
10.1 保护方式简述
10.2 分段管理机制
10.3 80386控制寄存器和系统地址寄存器
10.4 实方式与保护方式切换实例
10.5 任务状态段和控制门
10.6 控制转移
10.7 80386的中断和异常
10.8 操作系统类指令
10.9 输入/输出保护
10.10 分页管理机制
10.11 虚拟8086方式
10.12 习题
第11章 80486及Pentium程序设计基础
11.1 80486程序设计基础
11.2 80486对调试的支持
11.3 Pentium程序设计基础
11.4 基于Pentium的程序优化技术
11.5 习题
第三部分 上机实验指导
第12章 实验指导
12.1 实验的一般步骤
12.2 汇编器和连接器的使用
12.3 调试器DEBUG的使用
12.4 Turbo Debugger的使用
参考文献
附录 Pentium指令与标志参考表 


20131031 委託代買從中國亞馬遜訂購 20131112 收到, 43.2*5.1+91 = 311.3 nt, 比照 31.2 rmb 貴上不少, 幾乎是兩倍價錢。

書中介紹的詳細程度是包含程式碼, 可不是只單純的介紹什麼是保護模式, 只介紹觀念, 沒有紮實的程式, 這相對上容易多了。

資訊教育的書籍程度就差這麼多, 程式人員素質的優劣可想而知, 連學習的教材都沒有, 要怎麼競爭呢? 台灣要追上很辛苦。

這本吸引我的部份是保護模式, 使用的組譯器是 masm, masm 由於有些 segment reigster 的指定, 整個語法看來複雜不少, 有弊必有其利, 這可以做比較詳細的控制。

p376 是第1個進出保護模式的範例 (T10-1.ASM), 我想試試看能不能用 masm 完成它。

書中程式碼有點問題, 以下為我修改後的版本:
https://github.com/descent/progs/blob/master/masm_progs/spm.asm

11.2 (p535) 說明 debug 暫存器, 並提供了在真實模式下的範例, 這多少可以幫助我們理解 debuger 到底是怎麼實作的, 真令人好奇。

也許是年代久遠, 這本提到少見的 v86 模式, 10.11 (p506) 開始, 當然除了解釋什麼是 v86 外, 還附上程式碼, 我掃了一下, 看來不太簡單, 這部份是我沒涉獵的, 除了 call bios call, 我實在想不到這模式要在哪裡派上用場, 我已經辛苦的將切換螢幕程繪圖模式的程式碼完成, 似乎不太有需要在保護模式呼叫 bios。

masm 的缺點是只能在 ms 平台上使用, 選用軟體時, 我儘量不使用只能在單一平台的軟體, 蘋果都知道代工廠不能只找鴻海, 我也是。gas, nasm 都是跨平台的好選擇, 購買此書, 單純為了蒐集吧了!

寄件者 computer books
x86汇编语言:从实模式到保护模式
目录

目录
目 录
第1部分 预备知识
第1章 十六进制计数法 3
1.1 二进制计数法回顾 3
1.1.1 关于二进制计数法 3
1.1.2 二进制到十进制的转换 3
1.1.3 十进制到二进制的转换 4
1.2 十六进制计数法 4
1.2.1 十六进制计数法的原理 4
1.2.2 十六进制到十进制的转换 5
1.2.3 十进制到十六进制的转换 6
1.3 为什么需要十六进制 6
本章习题 7
第2章 处理器、内存和指令 8
2.1 最早的处理器 8
2.2 寄存器和算术逻辑部件 8
2.3 内存储器 10
2.4 指令和指令集 11
2.5 古老的Intel 8086处理器 13
2.5.1 8086的通用寄存器 13
2.5.2 程序的重定位难题 14
2.5.3 内存分段机制 17
2.5.4 8086的内存分段机制 18
本章习题 21
第3章 汇编语言和汇编软件 22
3.1 汇编语言简介 22
3.2 NASM编译器 24
3.2.1 从网上下载NASM安装程序 24
3.2.2 安装NASM编译器 25
3.2.3 下载配书源码和工具 26
3.2.4 用Nasmide体验代码的书写和编译过程 28
3.2.5 用HexView观察编译后的机器代码 29
本章习题 30

第4章 虚拟机的安装和使用 31
4.1 计算机的启动过程 31
4.1.1 如何将编译好的程序提交给处理器 31
4.1.2 计算机的加电和复位 31
4.1.3 基本输入输出系统 32
4.1.4 硬盘及其工作原理 33
4.1.5 一切从主引导扇区开始 35
4.2 创建和使用虚拟机 35
4.2.1 别害怕,虚拟机是软件 35
4.2.2 下载Oracle VM VirtualBox 36
4.2.3 安装Oracle VM VirtualBox 36
4.2.4 创建一台虚拟PC 37
4.2.5 虚拟硬盘简介 42
4.2.6 练习使用FixVhdWr工具向虚拟硬盘写数据 43
第2部分 16位处理器下的实模式
第5章 编写主引导扇区代码 49
5.1 欢迎来到主引导扇区 49
5.2 注释 49
5.3 在屏幕上显示文字 50
5.3.1 显卡和显存 50
5.3.2 初始化段寄存器 52
5.3.3 显存的访问和ASCII代码 53
5.3.4 显示字符 55
5.4 显示标号的汇编地址 56
5.4.1 标号 56
5.4.2 如何显示十进制数字 60
5.4.3 在程序中声明并初始化数据 61
5.4.4 分解数的各个数位 61
5.4.5 显示分解出来的各个数位 65
5.5 使程序进入无限循环状态 66
5.6 完成并编译主引导扇区代码 67
5.6.1 主引导扇区有效标志 67
5.6.2 代码的保存和编译 68
5.7 加载和运行主引导扇区代码 68
5.7.1 把编译后的指令写入主引导扇区 68
5.7.2 启动虚拟机观察运行结果 70
5.7.3 程序的调试 70
本章习题 71
第6章 相同的功能,不同的代码 72
6.1 代码清单6-1 72
6.2 跳过非指令的数据区 72
6.3 在数据声明中使用字面值 72
6.4 段地址的初始化 73
6.5 段之间的批量数据传送 74
6.6 使用循环分解数位 75
6.7 计算机中的负数 77
6.7.1 无符号数和有符号数 77
6.7.2 处理器视角中的数据类型 80
6.8 数位的显示 82
6.9 其他标志位和条件转移指令 83
6.9.1 奇偶标志位PF 83
6.9.2 进位标志CF 83
6.9.3 溢出标志OF 84
6.9.4 现有指令对标志位的影响 84
6.9.5 条件转移指令 85
6.10 NASM编译器的$和$$标记 87
6.11 观察运行结果 87
本章习题 88
第7章 比高斯更快的计算 89
7.1 从1加到100的故事 89
7.2 代码清单7-1 89
7.3 显示字符串 89
7.4 计算1到100的累加和 90
7.5 累加和各个数位的分解与显示 90
7.5.1 堆栈和堆栈段的初始化 90
7.5.2 分解各个数位并压栈 92
7.5.3 出栈并显示各个数位 94
7.5.4 进一步认识堆栈 95
7.6 程序的编译和运行 96
7.7 8086处理器的寻址方式 96
7.7.1 寄存器寻址 96
7.7.2 立即寻址 97
7.7.3 内存寻址 97
本章习题 101

第8章 硬盘和显卡的访问与控制 102
8.1 本章代码清单 102
8.1.1 本章意图 102
8.1.2 代码清单8-1 103
8.2 用户程序的结构 103
8.2.1 分段、段的汇编地址和段内汇编地址 103
8.2.2 用户程序头部 106
8.3 加载程序(器)的工作流程 109
8.3.1 初始化和决定加载位置 109
8.3.2 准备加载用户程序 110
8.3.3 外围设备及其接口 111
8.3.4 I/O端口和端口访问 112
8.3.5 通过硬盘控制器端口读扇区数据 114
8.3.6 过程调用 116
8.3.7 加载用户程序 121
8.3.8 用户程序重定位 122
8.3.9 将控制权交给用户程序 126
8.3.10 8086处理器的无条件转移指令 126
8.4 用户程序的工作流程 128
8.4.1 初始化段寄存器和堆栈切换 128
8.4.2 调用字符串显示例程 129
8.4.3 过程的嵌套 130
8.4.4 屏幕光标控制 131
8.4.5 取当前光标位置 131
8.4.6 处理回车和换行字符 132
8.4.7 显示可打印字符 133
8.4.8 滚动屏幕内容 134
8.4.9 重置光标 134
8.4.10 切换到另一个代码段中执行 135
8.4.11 访问另一个数据段 135
8.5 编译和运行程序并观察结果 135
本章习题 136
第9章 中断和动态时钟显示 137
9.1 外部硬件中断 137
9.1.1 非屏蔽中断 138
9.1.2 可屏蔽中断 138
9.1.3 实模式下的中断向量表 140
9.1.4 实时时钟、CMOS RAM和BCD编码 141
9.1.5 代码清单9-1 145
9.1.6 初始化8259、RTC和中断向量表 145
9.1.7 使处理器进入低功耗状态 147
9.1.8 实时时钟中断的处理过程 148
9.1.9 代码清单9-1的编译和运行 150
9.2 内部中断 150
9.3 软中断 151
9.3.1 常用的BIOS中断 151
9.3.2 代码清单9-2 155
9.3.3 从键盘读字符并显示 155
9.3.4 代码清单9-2的编译和运行 155
本章习题 156
第3部分 32位保护模式
第10章 32位Intel微处理器编程架构 159
10.1 IA-32架构的基本执行环境 164
10.1.1 寄存器的扩展 162
10.1.2 基本的工作模式 162
10.1.3 线性地址 163
10.2 现代处理器的结构和特点 164
10.2.1 流水线 164
10.2.2 高速缓存 165
10.2.3 乱序执行 165
10.2.4 寄存器重命名 166
10.2.5 分支目标预测 167
10.3 32位模式的指令系统 168
10.3.1 32位处理器的寻址方式 168
10.3.2 操作数大小的指令前缀 169
10.3.3 一般指令的扩展 171
本章习题 174
第11章 进入保护模式 175
11.1 代码清单11-1 175
11.2 全局描述符表 175
11.3 存储器的段描述符 177
11.4 安装存储器的段描述符并加载GDTR 180
11.5 关于第21条地址线A20的问题 182
11.6 保护模式下的内存访问 184
11.7 清空流水线并串行化处理器 188
11.8 保护模式下的堆栈 189
11.8.1 关于堆栈段描述符中的界限值 189
11.8.2 检验32位下的堆栈操作 190
11.9 程序的编译和运行 191
本章习题 191

第12章 存储器的保护 192
12.1 代码清单12-1 192
12.2 进入32位保护模式 192
12.2.1 话说mov ds,ax和mov ds,eax 192
12.2.2 创建GDT并安装段描述符 193
12.3 修改段寄存器时的保护 195
12.4 地址变换时的保护 197
12.4.1 代码段执行时的保护 197
12.4.2 堆栈操作时的保护 198
12.4.3 数据访问时的保护 200
12.5 使用别名访问代码段对字符排序 201
12.6 程序的编译和运行 203
本章习题 203
第13章 程序的动态加载和执行 204
13.1 本章代码清单 204
13.2 内核的结构、功能和加载 205
13.2.1 内核的结构 205
13.2.2 内核的加载 206
13.2.3 安装内核的段描述符 208
13.3 在内核中执行 211
13.4 用户程序的加载和重定位 213
13.4.1 用户程序的结构 213
13.4.2 计算用户程序占用的扇区数 215
13.4.3 简单的动态内存分配 216
13.4.4 段的重定位和描述符的创建 217
附录1 本书用到的x86指令及其页码 
附录2 本书用到的重要图表及其页码 

20130409 購於成大若水堂 291NT, 這價錢真是便宜, 書中關於保護模式的內容我已經了解不少, 但我還是下手買了。

本書以 virtual box, bochs 等虛擬機來學習 x86 組合語言, 我覺得這是比較好的方式, 不侷限在 os 之下, 光是處理列印到螢幕這功能, 就不簡單。

藉由呼叫 os api 來達到某些功能, 那用 c 去 call 不就好了, 換成組合語言意義不大, 學組合語言就是要來做些 c 無法做得的事情才有趣。

這是以學習組合語言為主的書籍, 並講述 16/32 x86 模式, 就是 x86 真實模式和保護模式, 並沒有提及 long mode (64 bit mode)。

薄薄一本就能學到 x86 保護模式與中斷和 task switch, 實在值得。本書利用虛擬機來學習 x86 保護模式, 不只是架構的講解, 還提供程式碼, 這才是有用的學習方式。而透過模擬器可以追蹤整個程式流程和記憶體位址的內容, 可以降低學習曲線, 以前沒有模擬器的時代可以完成這樣的程式, 腦袋可得要很清楚, 才能把程式寫正確。

本書主要是學習組合語言, 以 nasm 為使用的組譯器。 第八章在介紹存取硬碟和顯示卡, 當然都是靠自己的程式碼, 不假外力, 從 stat port 設定要讀寫的資料/磁區, 完全自己親手打造, 成就感十足。

8.3.5 介紹 LAB28 來讀寫 PATA/SATA 硬碟, 可惜不是 LAB48, 不過已經足夠了, 有了基礎, LAB48 應該難不倒你, LAB 已經不用磁頭、磁柱、磁區編號了 (這稱為 CHS mode), 改用邏輯磁區編號, 透過讀取 0x1f0 ~ 0x1f7 一系列的 io 位址, 來存取硬碟。

根據我之前的學習經驗, 這不是容易看的一本書, 需要有毅力耐心和其拼鬥, 也需要有學習 x86 架構的熱情, 這樣的知識學習曲線不短, 又沒有馬上立即的功效, 很難吸引人們去學習, 通常也都是真的對這方面有興趣的人才願意花時間學習, 還不一定能成功。

作者網站: http://blog.163.com/leechung@126/
範例程式碼: http://ishare.iask.sina.com.cn/f/34697012.html
勘誤表: http://blog.163.com/leechung@126/blog/static/70525507201301803044445/

有了上述的書籍打底, 我相信在看 amd/intel 手冊時, 就不會有那麼艱難的感覺了。

台灣也曾經 (毫不意外的絕版了) 有一本在講保護模式的書籍 - 80486/Pentium 保護模式原理與實務

旗標曾經是我很喜歡的出版社, 我還曾經想去該出版社工作。不過目前似乎其技術性的書籍沒那麼多了。

作者:施威銘研究室
分類:電腦與網路網路叢書系列:組合語言系列
出版社:旗標出版日期:2000/1/5 民國 84 年 7 月
ISBN:957717129x書籍編號:sb0054415
 

不過深入的程度可差多了, 技術含量遠遠不及上述那幾本, 這本僅在介紹保護模式, 但沒有自己的程式碼來介紹如何切換進入保護模式, 而是使用廠商提供的 library 來使用保護模式資源 (dpmi 之類的東西)。

雖然本書分為原理和實務兩部份, 原理篇詳細介紹保護模式; 實務篇則以 dpmi 為主軸, 這不是目前時代的主流, 我懷著懷舊心情讀它, 不過我不覺得這是實作就是。

拿 2012 年的書和 1995 年的書相比也許不適當 (其中有本可是 1998 出版的), 不過我要指出這樣的書籍才有資格算是實務, 實務是很重要的, 有了實作的經驗, 才能證明自己對其原理已經真的了解。

書上的實務只的是使用 dpmi 這樣的方式來進入保護模式, 使用 1M 之後的記憶體, 深入程度和前面幾本書實在差太多, 和本篇介紹的其他書籍相比, 高下立判。

但是我比較習慣這本書的用語 (那是當然的阿, 我可是道地的台灣人, 我非常喜愛使用台灣術語, 對於中國術語的強勢入侵, 有股深深的無力感), 前半段講解保護模式非常的清楚詳細, 不過我懷疑你能否靠這樣的理解就寫出進出保護模式的程式嗎。

雖然專門討論 x86 保護模式的書台灣我只找到這一本, 但是侯捷的記憶體/windows 系列書籍或多或少都有提到 x86 保護模式, 只不過透徹程度大概都和這本一樣, 只是架構講解, 沒有實際的程式碼。

有些人似乎小看了程式碼的重要性, 要能從手冊直接把程式碼寫出來相當不容易, 這又會和你所使用的組譯器有或多或少的關係, 在早期的 gas 由於不支援從 16 bit 切換到 32 bit, 聰明的 hacker 直接將 machine code 寫入組合語言程式, 這可不是容易的事情。

當然, 後來的 gas 已經支援這樣的用法, 所以就方便多了。而使用別的組譯器, 可能又有不同的語法要注意。



80386 使用手冊, 民國 79 年 (1990) 12 月出版, 20140404 從 yahoo 賣家以 300/380nt 購得。得到這本書真是令我開心, 在 1990 年竟然有這種等級的書, 實在令我高興, 不知道是翻譯的還是作者自行完成, 但內容真的蠻深入的。

p441 ~ 416 有個範例程式, 將會切換到保護模式。



這本以 amd64 為主, 講述 amd 64bit 的相關技術。這是朋友的書, 我大略翻了一下, 似乎以理論說明為主, 沒有程式碼配合, 這樣在實務上似乎比較不足, 可能還需搭配其他相關書籍來配合。

ref link: 好用的組譯器:
http://radare.org/y/?p=examples&f=rasm 玩 machine code 的朋友一定要試試。
amd 手冊: http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/

Manuals

intel architecture software developer's manual:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

2017年7月30日 星期日

20170521 熊熊愛朵兒 la blancheru 活動

fig 1. 門票 70
這是由 la blancheru 舉辦的 bjd 市集活動, 很難得的南部 bjd 活動, 娃展似乎大多在台北, 南部的同好幾乎都要很辛苦的上台北參加, 勞心勞力又傷錢包, 一年能去個一次就很不錯了。

我總是晚到了那麼一點, 16:00 結束, 我 15:00 才到, 已經有不少賣家要打包了, 趕緊匆忙的環顧四周, 看看有什麼寶貝可以購入。

la blancheru (一般都稱為拉布) 是一間餐廳 + 烘培坊, 進入後首先購票, 如同 fig 1. 的票券, 70 nt, 到 4 樓後, 在手上蓋章後進入, 整個市集活動場所並不大, 應該只能容納 20 個攤位吧! 好像沒有男生, 更沒有像我超齡的男生, 我木訥的走向攤位, 看看有什麼好寶貝。

對於 DD 娃的服飾配件, 我其實是比較喜歡在現場購買, 可以仔細比對衣服大小、鞋子尺寸、穿起來的模樣, 尤其是頭髮, 有時候真的很難靠想像的買下來, 能實際試穿還是比較好的。

fig 2. 250nt
fig 3. 50nt
fig 4. 150nt
fig 5. 80nt
我很喜歡購買二手的娃物, 當然最主要的原因就是價錢, DD 娃的服飾可是比真人還貴, 要花上不少金額才能買到自己喜歡的東西, 二手娃物很搶手, 有時候稍微猶豫一下, 可就沒了, 很垂心肝的。

有一個攤位有很多頭髮, 可惜我已經有類似的了, 沒有下手, 不過也多看了不少髮型、各種不同的顏色。

有 6 分、4 分、3 分娃的種種配件, 我當然只著重在 3 分的配件上, 疑! 我還有一隻 6 分娃, 連我自己都忘了她的存在, 改天再介紹。

fig 2 的冬季背心看來普通, 但是它的袖子可以拆開, 變成無袖背心, 我很愛這種機能型的設計, 儘管覺得顏色不怎麼喜歡, 還是買回來。

fig 3 的鞋子看來已經非常老舊了, 攤主最後以 50 讓我購得, 我回家仔細看過後, 皮革屑真的很容易掉滿地, 我只不過讓娃娃穿上, 扣好綁帶, 皮革屑便掉滿地上, 還沾到娃腳踝上, 不過不打緊, 整體看來還是不錯的。

fig 4 的衣架真是可愛, 我很喜歡, 可以把娃娃衣服整齊的吊掛起來, 可惜還少了一隻曬衣竿, 這樣就完美了。

fig 5 的金色背包真是可愛, 之前買了一個登山用大背包, 這次買這個比較正常的配備, 一般的服飾就可以搭, 除了衣服外的額外裝飾。

沒買太多東西, 目前的衣服配件已經很多了, 不像剛買娃時那樣, 急著購入很多東西, 慢慢收即可。

fig 6

fig 6 展示了這次的鞋子, 和泡泡襪很搭。

2017年7月21日 星期五

DD 新頭 - DDH-07



從 Karasu Tanba 購入 DDH -07 的娃頭, 20170427 收到, 這是已經完妝的頭, 含運費 1600nt。我個人覺得很漂亮, 很喜歡。

fig1 ddh-07 fig2 官娃 candy

fig 1 的脖子洞和 fig2 官娃的有所不同, 多了一個凹處, 不知道是幹麻用的, 而且比較緊, 插到 candy 素體時不好插入, 我很擔心把 ddh-07 或是素體弄壞 (畢竟我目前只有一個素體), 最後還是大膽插上 ddh-07 頭, 看來沒什麼大礙。


沒有眼睛有點嚇人, 我知道, 所以想辦法來裝上眼睛, 之前購入一個雪初音的 22mm 的眼睛, 正好派上用場, 這個眼睛本來是要用來替換 candy 的眼睛, 不過官娃的眼睛用熱溶膠黏住, 我不想破壞官娃的眼睛, 一直等到購入這顆娃頭才裝上。



但問題來了, 我知道有種叫「眼泥」的東西可以用來黏眼睛, 但我不知道去那買, 最後得知有一種隨意黏的黏土可以用, 不用到娃店買, 一般的書局就有了, 知道這情報後, 我立刻飛奔某書局, 也如預期找到了隨意黏的貼土, 選了 40 元的那個, 來試試吧!



這是第一次黏眼睛, 果然不是很容易, 貼土黏的很醜, 眼睛對齊了很久, 總算順利黏上, 沒有像鬥雞眼, 過程還蠻有趣的。呵呵, 好可愛阿! 裝個頭髮一定更好看。



看起來很成功呢! 感覺這個 saber 的馬尾頭髮很搭, 再來看看完成體吧!

該搭配那個服裝造型呢? 選了冬天的水手服, 有馬尾、黑絲襪, 應該是滿足每個男人心目中完美女孩的點, 就這樣決定了, 翻出黑色版本的水手服, 換裝時間到了。

水手服算是蠻好穿的, 但是拔掉頭會比較容易穿上, 我第一次拔掉 DD 頭就是為了穿上手水服, 嚇死我了。目前的服飾是初音未來的官服, 脫掉也還蠻容易的, 長靴也不難脫 (穿上它比較難點), 在搭配最近獲得的小書包, 更有學生妹的樣子了。



果然有了眼睛之後就不再那麼恐怖了呢! 不過還是和我想像中的水手服學生有點差距, 到底是哪裡不對了呢?

最後換上雪初音的服飾, 果然有了藍眼睛之後, 和官娃相比, 有了七分像, 這是自製娃頭的好處, 官娃娃頭的眼睛用熱融膠黏上, 不好卸掉, 我也不打算動官娃娃頭的眼睛, 以後在補足所有娃頭, 就有更多不同造型。



雪初音果然還是要搭藍色的眼睛, 看起來又漂亮多了, 這次的造型先穿上阿麼衣 (防染衣), 其實有點來不及了, 整個娃體嚴重的被染成黑色, 哪有被染色才穿防染衣的, 不過遮住圓形關節球讓 DD 娃看來又有不同的風格, 也很不錯, 可以搭配這麼多的配件是 bjd 娃的魅力所在。

2017年7月14日 星期五

[DD] Hatsune (初音) Candy

裝扮後第一眼看上去, 哇! 還蠻可愛的嘛! 「初音未來」的造型真是有一套, 連不是初音的 DD 官娃, 整起造型也很好看。

既上次 cos 雪初音後, 這次要來 cos 初音未來, 就是黑黑的那隻。這隻也是在 DD 界很受歡迎的角色, 我想就算沒有買初音的娃友, 可能也都有雙馬尾的這頂頭髮吧!

講到這頂頭髮, 很長, 很難整理, 還蠻麻煩的, 上次那雪初音那頂, 我幾乎都要天天梳, 真的累人。

如果你很熟悉初音, 應該會覺得 fig 1 的圖哪裡怪怪的, 我太大意了, 沒看清楚就購入, 不過也還好, 整體看來效果並不差。

fig 1.
  1. 上衣: 99 rmb, 【SEN】BJD/SD/DD娃娃/娃衣/女裝/洋裝/淑女裝/裙子/初音COS裝
  2. 除了上衣的初音服飾: 2500, 從娃圈社團購入。
  3. 頭髮 (非官方頭髮): 800, 從娃圈社團購入。
我沒那麼喜歡初音, 不想為了這套衣服就購入 "初音 DD"。「只要有官服就好了。」我是這麼想的, 但並不總是會有那麼好的運氣, 有娃友願意釋出, 而且價格可能不便宜, 以及會有很多人一起搶標, 這些都充滿了不確定性, 要買到官服, 難如登天, 我抱著隨緣的心態, 等待機會的到來。

item 2 不知道為什麼沒有我想像中的搶手, 可能是沒有附上耳機和頭髮, 或是很多人都有了, 所以我目前還缺耳機, 這個我猜想應該是很難單獨收到了, 隨緣隨緣。

先把衣服穿上, 初音的服飾算是單純, 很輕鬆就換上, 麻煩的是那個頭髮。

花了不少時間整理頭髮, 總算看起來沒有那麼糾結了, 如何把頭髮戴好對我來說一直是個問題, 在我笨拙的雙手下, 總算把這頂頭髮戴好了。

這種雙馬尾的還有一種是用夾的, 也就是得用雙馬尾的部份是和頭髮分開的, 雙馬尾上會有夾子, 夾上後就變成雙馬尾的樣子, 我有一頂雪初音的頭髮就是這樣, 但我一直沒辦法好好的夾住, 直到我看到娃友提供的方法。

官方的服飾據說會有染色的情形, 甚至還順便賣起防染色的衣服, 對於染色問題我早已看開, 染就染了吧, 不過套上黑色絲襪還蠻搭的, 也間接提供防染色的功能。

對於 DD 要怎麼擺出好看的姿勢一直沒有頭緒, 通常我就是找找官方的圖, 然後試著擺擺看, 其實還蠻難的, 擺出來的姿勢通常沒有官方的好看, 也不知道其中訣竅在那, 只得慢慢嘗試。

而我的拍攝技巧也不算高明, 通常只要看起來還可以我就接受了, 沒像有些娃友們有那麼高品質的傑作, 我也不會修圖把腳架去掉, 對我而言那太麻煩, 我還沒要求到那樣的地步。

搭配可動手, 總算可以有比較豐富的姿勢, 不再是呆板的基本手勢, 雖然沒辦法很完美的比出任何手勢, 但也豐富了整體造型。



放上一張雪初音的服飾做對照, 有不同的風格, 突然覺得, 應該來買第二顆頭了, 而在這之後過了不久, 我也如願買到上妝的 ddh-07 的頭, 下一篇再來分享這顆新頭。