顯示具有 computer book 標籤的文章。 顯示所有文章
顯示具有 computer book 標籤的文章。 顯示所有文章

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:

2021年12月21日 星期二

[books] 程序员修炼之道: 通向务实的最高境界 (第2版)

程序员修炼之道:通向务实的最高境界(第2版)

THOMAS, DAVID; HUNT, ANDREW (作者) 
  • 书  号:978-7-121-38435-6
  • 出版日期:2020-03-26
  • 页  数:344
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: The Pragmatic Programmer: your journey to mastery, 20th Anniversary Edition (2nd Edition)
  • 原书号:9780135957059
  • 维护人:张春雨


纸质版 ¥89.00

第1章 務實的哲學
第2章 務實的方法
第3章 基礎工具
第4章 務實的偏執
第5章 寧彎不折
第6章 並發
第7章 當你編碼時
第8章 項目啟動之前
第9章 務實的項目

The Pragmatic Programmer: From Journeyman to Master 本文以 tpp 簡稱。

這本台灣有出第 2 版的繁體中文版, 由於之前看過簡體中文第一版的翻譯, 不知所云, 我很擔心台灣的版本也會有翻譯不佳的問題, 在沒親自翻過一次之前, 不敢購買。

後來看到簡體中文也出了第二版, 而且有電子版本, 平常電腦專業書籍可能不太適合看電子版本, 不過這本書的內容算是很適合用電子書看, 我看了一下譯者, 是雲風, 比較有信心, 他也是程式開發人員, 之前也看過其文章, 文句通順, 下載了試看的版本, 還不錯, 可以看的很流暢, 在綜合考量之下, 最後我買了簡體中文的電子版本, 花了 45.34 rmb, 過沒幾天降到 36.3 rmb, 垂心肝中 ...

台灣的書籍現在要面對中國簡體版本的競爭, 處地更是不利。

英文版本是用 markdown 寫的, 簡體中文譯本也是, 不知道繁體中文譯本是不是也是用 markdown 製作的。

簡體中文術語有些會看不習慣, 不過台灣人應該在慢慢適應中, 討論區的文字可以看到這些中國術語的出現。

另外比起簡體中文第1版的翻譯, 第2版拿掉了英文術語, 這是我覺得很可惜的一部份, 例如: 軟體腐爛 (software rot), 熵 (entropy), 少了這些術語的對照, 覺得有點失落。

這本書是一位強者朋友推薦的, 2011 年我因為翻譯問題沒有購買簡體中文版, 20200907 才購入, 來看看這本書是不是真的寫的那麼好。

雲風的翻譯果然不錯, 行雲流水般的看完第一章, 沒有詰屈聱牙之感, 讀來順暢。

fig 3 2021/12/12 拿到, 350nt,
購於讀冊二手書
看完簡體中文電子版本之後, 過了很久, 我收到了二手繁體中文版本, 350nt 算是不錯的價錢。

這本書我是歸類於你懂的話才能看懂裡頭的描述, 但很吊詭的是, 如果你已經懂了, 何必看這本書呢? 那不該看這本書嗎? 也不是這麼說, 總之身為程式員的你, 應該可以體會我想表達的想法 (如果你看過了的話)。

這是本很容易引起程式員共鳴的書籍, 程式員一定會對裡頭相關的描述點頭稱道, 沒錯, 就是這樣, 也針對軟體開發提出相關的建議, 讓我們開發出來的軟體品質向上提昇。

第1章 - 務實的哲學

和一般很常聽到的技術債不同, 本書用了「熵」來比喻軟體的混亂, 自然現象通常會傾向於「無序」, 請看影片氣體分子的例子即可理解, 程式碼也是一樣, 如果不特別做什麼事情, 你的程式碼是不是也會傾向於「無序」呢? 否則就不會有本書, 或是其他軟體工程的書籍在討論這個問題了。

書中提到「熵」, 如果不知道「熵」是什麼, 可能看不懂書中的描述, 請參考以下影片「熵」的說明:



看這本書沒多久前, 我剛好看了這影片, 知道了「熵」是什麼, 再看到書中描述, 會心一笑。

使用「破窗理論」來形容軟體, 真的貼切。是的, 我看到這邊的 code 就寫成這鳥樣, 自然也不會特別要求自己的 code 要好好的處理, 沒人想撿碎玻璃; 反之, 如果這包 code 的架構良好, 我一定會小心翼翼自己加入的程式碼, 不要搞砸前人設計精良的部份。

第2章 - 務實的方法

這章在說明怎麼樣設計軟體可以用來抵抗未知性的變化, 坦白說, 我覺得很難, 當然還是有一些方法可以讓這樣的混亂降低, 但以我自己的經驗, 通常在現實專案中, 有時程壓力、有上級壓力、有豬頭的決策、有公司的考量、有資金的壓力、有人員素質的問題 ... 很難有書上那樣的完美環境, 只能說做多少算多少。

我對於書中說的更換資料庫的例子有所感觸, 一般都是使用間接層來處理 (或是大家習慣的術語抽象化), 但你怎麼知道要怎麼設計這個抽象化呢? 要是你設計的抽象化這層根本無法順利接上另外一個資料庫 api, 那該怎麼辦? 白做了嗎?

也許有人會說資料庫操作就那些, 大同小異; 是的, 大同中有小異, 就這麼剛好中了這些小異, 我的意思不是說不做這些, 而是就算知道要這麼做, 在實際專案中, 可能還是會碰壁。

書中很多比喻都很傳神, 例如:「在黑暗中發光的程式碼」, 這是曳光彈的比喻, 在打靶時, 曳光彈的軌跡可以讓我們修正瞄準方向, 下次的擊發更容易打中目標, 發光的程式碼就類似曳光彈的效果, 但重點是, 怎麼寫出發光的程式碼。提示 20 在說明這件事情。

第3章 - 基礎工具

怎麼才算遊刃有餘的使用編輯器。這裡有一個挑戰列表, 你能完成多少?

  1. 當編輯文本時, 以字元、單詞、行、段落為單位移動光標及進行選擇。
  2. 當編輯程式碼時, 在各種語法單元 (配對的分隔符、函數、模組......) 之間移動。
  3. 做完修改後, 重新縮進程式碼。
  4. 用單個指令完成程式碼塊的註釋或取消註釋。
  5. Undo 並 Redo變更。
  6. 把編輯窗口切割成多個面板, 然後在它們之間跳轉。
  7. 跳轉到特定的行號。
  8. 對選出的多行進行排序。
  9. 搜索普通字元串, 或用正則表達式搜索, 然後重複上一次的搜索。
  10. 基于框選或某個模式匹配的結果, 臨時創建多個光標, 並行地在多個光標處編輯文本。
  11. 顯示當前項目的編譯錯誤。
  12. 跑一下當前項目的測試。
  13. 能不能不用滑鼠/觸控板完成上面所有的任務?
用 vim, 上述的要求大概可以做到八成; 如果用 emacs, 大概只能達到一成。我完全可以感受作者們說的這項好處, 但我懷疑多少人看了本書之後會照做, 畢竟比起編輯器, 其他事情更重要多了, 學習新的電腦技術、程式語言、新的 framework、學習版本控制 ... 在怎麼看來都比學習編輯器重要多了。

第4章 務實的偏執

第5章 寧彎不折
第6章 並發
第7章 當你編碼時
第8章 項目啟動之前
第9章 務實的項目
ref:

2017年8月25日 星期五

[books] 哥德尔、艾舍尔、巴赫 - 集异璧之大成

20160219 訂購於淘寶, 20160306 收到
原文名稱是 Gödel, Escher, Bach: an Eternal Golden Braid, 看不懂書名吧, 就算是中文書名也一樣摸不清這本書是幹嘛用的吧, 比 Code: The Hidden Language of Computer Hardware and Software 還奇怪吧!

你很難念出這本書的名字吧, 直接提 GEB 就可以了, 簡單、輕鬆、不明瞭; 中文則是簡稱《集异璧》。

這本書中國之前有部份的翻譯《GEB:一条永恒的金带》, 由四川人民出版社出版, 沒全翻譯也能出書, 真奇怪, 更奇怪的是還有兩間出版社來出版。不過這本就是全譯本了, 可以放心的閱讀。

忘記在哪裡看到這本書的推薦, 大概是那種「你一定要讀的十本書」之類的文章。通常裡頭介紹的書當然不會是一定要讀的書, 沒有哪本書是一定要讀的, 找自己讀得下去、讀得來、讀得快樂的才是對自己好的。

據說這是本奇書, 有多奇呢? 看到書名你有沒有莫測高深的感覺, 這是在寫什麼阿?

這本書介紹了數理邏輯、可計算理論、人工智慧 (最近很紅的電腦 AlphaGo 和南韓棋士下圍棋的那個)。

作者 Douglas Richard Hofstadter 有個中文名字 - 侯世达, 很重視這本書的翻譯, 不管是翻譯成哪國語言, 他都要插上一手, 德、法、西班牙的翻譯本是這樣, 簡體中文譯本也是, 他和這本書的簡體中文翻譯教授有了一些對翻譯上的對話, 所以這本書被翻譯成了中國味很濃厚的翻譯書了, 這也是作者本身想要的翻譯方式。

葉落天落葉、A man, a plan, a canal: Panama, 並不是只有文學上有回文 (ref: http://www.lungteng.com.tw/LungTengNet/HtmlMemberArea/publish/Newpaper/012/english/p029-031.pdf), 音樂也是有回文這種東西, 叫作「螃蟹卡農」

螃蟹卡農:

A man, a plan, a canal: Panama
這句話如果翻成中文, 一定會失去其回文的意義。
翻譯之難一

speak of the devil 是 speak of the devil and the devil appears. 的壓縮。難怪語言真的不好學了。

應該翻成:
說到鬼,鬼就來。
還是
說曹操, 曹操就到。

翻譯之難二
作者希望的是《說曹操, 曹操就到。》這樣的翻譯, 聽說這叫作移 (迻) 譯。
目前就看這麼多了, 希望有吸引你去看這本書。

侯世达谈geb的中译

1985年,我在完全偶然的情况下得知有人准备把geb译成中文。我在密歇根大学的同事和友人亚瑟•伯克斯(Arthur Burks)刚从仍然沿用Peking拼法的Beijing大学回来,他无意中提到计算机系的吴允曾和马希文两位教授正在主持这项工作。

我惊喜交加,但不无担忧,因为之前在geb被译成西班牙语和德语的过程中,我都向译者提供了自己做的注解,这些东西花了我几百个小时,但最后不是没有到达译者手里,就是被他们直接忽视了。于是前者付梓之后很快泯然于世了,而后者粗糙乏味的译稿只能算勉强及格,所幸后来得到geb的荷兰语译者罗纳德•容克斯(Ronald Jonkers)等人的大力润色。

我首先想到的当然是尽快把注解送到中译者手里,但很快一个新的想法在脑海中闪现。戴维•莫泽(David Moser,geb的法译者之一。这个译本是侯世达最欣赏的。)当时正在苦学中文,准备去中国呆一段时间,何不让他去走一遭?戴维、罗纳德和我曾在巴黎一起探讨过翻译geb的策略,戴维的翻译哲学与我的不谋而合。

在当时的学界,网络还不是主要的沟通渠道,于是我给吴教授和马教授去了封信。很快,吴教授的亲笔回信就到了,他的英语非常棒。吴教授证实了一个我担忧已久的问题,他的翻译队伍中没有英语母语人士,但好在工作才开始不久,他非常欢迎戴维加入进来。吴教授还提到他计划亲自来美国一趟,希望与我见上一面。我高兴地回信邀请他来安娜堡小住几天。

于是1986年春天,戴维出发去了北京。在那里,他见到了吴教授和马教授,他们已经组织起一支高水平的翻译队伍,但实质性工作还未展开。他们向戴维介绍了队伍中两位关键成员:严勇,一位头脑敏捷,富有机智的计算机专业研究生;刘皓明,一位文学系研究生,同时也是出色的艺术家,推荐他的正是严勇,因为刘皓明善于用别出心裁的方式组织中文。三人很快成为好友和密切的工作伙伴。

就在戴维抵达北京几天后,吴教授也来到了美国。为了让他在底特律机场认出我,我在一块牌子上写了“吴允曾——欢迎你!”。我们没费什么劲就找到了对方,然后一起去了我在安娜堡的家。我们和卡罗尔以及梅拉尼•米切尔一起吃了意大利风味的晚餐,通心粉尤其对吴教授的胃口,因为他的牙都快掉光了。他发现我和梅拉尼会说一些中文,于是就用中文问了我们几个问题,可惜我们答得都不太好。从此,我们只用英语交流。

吴教授的英语相当不错,虽然口音很重,对此我们都很好奇。他解释说,自己小时候上学时都是英语授课,自己还有个英语名字“安德鲁”。虽然他让我们这样称呼他,但我们总觉得不自然,于是仍然称他“吴教授”。

为了让吴教授对geb中的一些疑难段落有更深的了解,我请来法译者之一的鲍勃•弗兰奇(Bob French)一起吃饭,选的当然还是一家意大利餐馆。我们谈到书中被称为“螃蟹卡农”的一段对话。“螃蟹卡农”原来是巴赫《音乐的奉献》中的一小段,它由两把小提琴演奏,但乐曲正向或反向演奏的效果都是一样的,只是两把小提琴或者说两个声部的角色互换了。因为据说螃蟹是逆行的(实际是横行),于是这类乐曲就被称为“螃蟹卡农”。

我刚描述了“螃蟹卡农”的特点,吴教授马上指出它很像回文,他举了“落叶天落叶”的例子。于是我们试着把它翻成英文:leaves fall season fall leaves,但fall既可以表示落下,也能指秋天,而leaves既有树叶的意思,也可表示离开,于是我们得到一句英语的回文:fall leaves as soon as leaves fall.

然后,我们也举了一句经典的英语回文,让吴教授把它翻成中文:a man, a plan, a canal, Panama!但吴教授脸上却显出疑惑之色,他认为这根本不是回文。原来,他是一个个单词来看这句话的!

最后,我们一致同意,由于两种语言在构成形式上的根本差异,想要把这句话翻成中文回文是不可能的。不过我提出,这句话的意义不在于它的内容,而在于形式上的对称性,如果硬要把它的内容翻译出来,就完全失去了它的存在意义,就像“没汽的汽水”。而一句形式上对称的中文回文,即使意思与之无关,在某种程度上却反而是“忠实”翻译。

正当我、鲍勃和吴教授在安娜堡一边吃着通心粉,一边谈笑风生的时候,半个地球之外也在进行一场类似的谈话。戴维刚到北京就一头扎进了已经完成的那部分geb译稿中。在一篇名为“the magnificrab, indeed”(与巴赫的magnificat in D谐音)的对话中,他发现“speak of the devil”被译作“说鬼,就来鬼!”戴维问刘皓明等人:“这句话是否中国谚语?”
他得到的回答是:“不,但读者很容易猜出它的意思。”

戴维又问:“那么有什么中文谚语能表达speak of the devil的意思吗?”

他们说:“当然,说到曹操曹操就到。”但他们随即表示,曹操属于中国文化,只有中国作者会用这个谚语。因为读者知道geb的作者是美国人,他们会无法接受的,美国人怎么可能知道曹操?

戴维顿时无语,想了一会儿他说:“但读者显然知道侯世达的原书不是用中文写的,他们知道这是翻译。侯世达想要的是把geb翻译得语句通顺,并且让中国读者感到自然。实际上,他正是要让读者感觉geb是用中文写的。”

对我和戴维来说,这是显而易见的。但严勇和刘皓明却表示强烈反对:“如果按照你的要求,用纯粹中文的风格来重建这本书,读者就会认为它不再是侯世达的作品了。”

后来的情况大家也知道了,戴维最终说服了严勇和刘皓明,以及翻译队伍中其他的两名成员王培和郭维德。在翻译“螃蟹卡农”时,我们收集了许多能表示不同意思的中文词组,比如“周末愉快”既是对话开始时的问候,又被用在结尾表示道别。整个团队完全接受了这种跨文化的翻译方式,有一天刘皓明甚至对戴维表示,他们原来的“忠实”翻译就像没有放辣酱的四川菜一样无味。虽然刘皓明没有听说过“没有汽的汽水”这句美国谚语,但他无意中又做了一次跨文化翻译。

很遗憾,吴教授于1987年在北京因心脏病去世,享年69岁。他不仅是翻译计划的发起人,还在整个过程中听取了各种意见。整个翻译团队忠实执行了他的意见,他们的成果离不开这位富有冒险精神的老人,我想吴教授自己也会这样认为的。

ref:
What is the single most influential book every programmer should read?

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

2016年12月3日 星期六

[books] 致命Bug:软件缺陷的灾难与启示

致命Bug:软件缺陷的灾难与启示 30.6/39
20160516 在中國亞馬遜訂購
20160530 到集運商結算貨品
20160531 集運商發送到台灣
20160603 收到貨品
這是一本在講軟體 bug 小故事的書, 和我平常在讀的電腦技術書籍比起來, 非常容易讀, 也很有趣, 讓我知道了不少事情, 有些事應該是需要被報導出來的, 可是我完全沒印象有聽過這些報導, 我對自己的孤陋寡聞感到哀傷。可惜這本書沒有電子版, 這是本很適合用電子閱讀器讀的書。

本書寫的淺顯、易懂、好讀, 就算不是相關的軟體專業人員, 也可以當作是一篇篇的故事來讀, 精彩度絲毫不遜於小說。

本書的原文是韓文, 這是翻譯重要的一種表現, 我相信有人英文一定很好, 看原文書沒問題, 但在這些人當中韓文也好的那可能就很少了。在我購買的書籍中, 有日文、韓文、英文這些翻譯本, 但事實上還會有德文、法文、俄文等的翻譯本, 不太可能把這些語言都學過一遍的。

翻譯工業應該要由政府來當領頭羊, 將整個人民的眼界帶到全世界才是, 人們眼界開了, 國家就會更進步才是, 因為語言隔閡而不能大開眼界, 真是太冤枉了, 要求每個人外文學的好的難度大於將翻譯工業好好的建構起來。

軟體在一般人的印象是不是網頁, 手機上的 app, 還有 windows 上的那些軟體、遊戲呢? 這本書提到的都是讓人很難想到的領域軟體, 書上有幾個很深刻的軟體 bug 想和大家聊聊。

chapter 4 在講停電的故事, 因為軟體的原因, 導致電力負荷不過來時, 接應的系統沒來幫忙, 就這樣, 像水管承受不了水壓而爆開, 電力系統最終癱瘓。

chapter 5 的約克城號是艘戰艦, 使用的是 ms windows 4.0, 它有一天突然不動了, 就這樣靜靜地停在海上, 任由海洋帶領, 漂浮了 2 小時 45 分鐘, 軟體的錯誤是 divided by zero。

chapter 9 的美國的文森號戰艦, 它擊落了伊朗航空 655 民航機, 因為文森號戰艦把他當成了伊朗的 F-14 戰鬥機, 至於為什麼伊朗會有美國的 F-14 那是另外一個值得探究的問題。

美軍當然不是傻蛋, 怎麼會搞不清楚是戰鬥機還是民航機呢? 但是可遇而不可求的巧合還是讓這場悲劇發生了, 總共要符合以下條件:
  • 文森號戰艦使用軍用無線電頻率警告對方, 對方是民航機, 收不到的。
  • 文森號戰艦後在使用國際救援無線電頻率警告對方, 但對方可能沒收到, 因為沒找到黑盒子, 無法確認。
  • 文森號戰艦查詢了民用客機的起飛時間, 可惜 655 民航機延遲 27 分鐘才起飛, 所以美軍不認為那個時間點有民航機。而文森號戰艦使用了 GMT+4 的時間, 但航班時間是 GMT+3.5, 更讓事情變得棘手。
  • 再來是雷達掃描系統, 655 民航機的識別代碼是 3, 但是掃到的代碼是 2 (軍用機), 不是軟體出問題, 而是掃錯區域, 本來應該掃民用機場的方向結果掃到軍用機場。
  • 最後, 終於來到最後, 研判系統出錯, 655 民航機在明明是在升高, 但文森號戰艦的軟體系統使得軍方人員研判 655 民航機在下降。
就是這以上幾點造成了這個悲劇, 但美國死不認錯也令人不齒, 不過有賠錢, 但強國就可以這樣鴨霸嗎?

但我覺得作者把這件事情也規到軟體 bug 倒是有點牽強了, UI 的結果不好研判或是警示系統不周全說是 bug 我實在不能接受。

chapter 12 的核子武器系統 bug, 知道的人應該都會覺得現在還有個好的地球可生存, 都會為此心存感謝。

美國/蘇聯的偵測系統會互相偵測核彈, 當對方發射過來時, 我方就反擊, 但如果誤判了呢? 對方明明沒有發射核彈, 但警示系統確認為有呢? 你會怎麼辦呢?

這樣的 bug 還一邊發生一次, 有夠公平。還好這些人果真都是菁英份子, 最後什麼都沒發生, 感謝這些研判正確的軍方人員。

chapter 13 的癌症治療系統, 這個很嚴重, 讓治療的病人接受了高於需要的放射線照射, 這是加拿大的 AECL Therac-25, 本來需要的能量是 200 rad, 但病人卻接收了 15000 ~ 20000 rad 的照射, 在怎麼沒概念的人也知道這差太多了, 造成許多人死亡。

這個軟體問題是算術溢出, 8 bit 整數, 只能存放 0 ~ 255, 超過就會繞回, 就是這問題倒置整個劑量數值出錯。

chapter 18 豐田暴衝, 原來日本人也是會騙人的, 和福斯的造假測試一樣, 令我驚訝, 原來德國人也是會騙人的, 他們把自己好不容易打造的形象搞砸了。

談軟體部份, 當機械結構改成電子加上軟體之後才發生這樣的事情, 有個 Barr Group 對豐田的軟體分析, 發現在某些情形下, 某些 reltime os tast 不會去執行該做的工作, 造成這樣的原因是, stack overflow, 而其程式有 11000 全域變數也令人驚訝, 日本人的軟體好像也不怎麼高竿是吧!

ref:
豐田問題車事件的經驗與教訓

2016年7月1日 星期五

Programming Principles and Practice Using C++ by Bjarne 兩個中文版


孟岩谈《C++程序设计原理与实践》這篇寫的真不錯, 真希望我也能寫出那樣的文字。

這是台灣繁體中文的版本, 定價 990, 不過我買的是簡體中文版本 - C++程序设计原理与实践。為什麼選擇簡體中文版本呢? 不單單是因為價錢的問題。

C++ 編程規範這本書一樣有簡體/繁體中文兩個版本, 我花了 414 nt 買了這本薄薄的小書, 而不是買 200 nt 的簡體中文版本。侯捷翻譯的版本讓我願意以較高的價錢購買 (我甚至沒去實體書店翻過書), 也相信碁峰製作書籍的品質。


那為什麼這本我要買簡體中文版本呢? 從價錢、厚度、書的品質上我做了這樣的選擇。

我雖然讀過不少大部頭書籍, 但還是對大部頭書籍心生畏懼, 對於大部頭書籍還是能免則免, 而且書架真的沒什麼空間了。

價錢/厚度 (比較薄) 都是簡體中文版本勝出 (108 rmb), 我實在沒空間擺那麼多大部頭書籍。中國的電腦書都會做得很薄, 台灣的書則會想辦法做的很厚, 書做的很厚大家都知道為什麼, 但做得很薄我就不清楚原因了。太厚或是太薄都不是好事, 兩個極端真是令人難以選擇。

本書的英文版出了第二版, 支援了 c++11/c++14, 所以我買的這版並沒有說明 c++11/c++14, 對這本有興趣的朋友可以再等一下, 書商會出新的版本 (應該吧)。

還真的出了:

C++程式設計原理與實務 第二版(Programming Principles and Practice Using C++)

本篇介紹的是我擁有的簡體中文版本 (第一版)。

繁體中文有很多漏詞的小錯誤, 譯者胡嘉璽的翻譯也算通順, 不過有些翻譯還是有點怪怪的就是, 不過那些漏詞的小錯誤讓我很不舒服, 上奇的品質應該不會這樣, 我有點失望, 定價 990 nt 的書應該要有 990 的嚴謹度 (其實就算是定價一元的書, 也應該要有相當的嚴謹度), 這定價並不便宜, 不能因為書厚就定這價錢, 我是買書不是買紙。不過以整體書籍的製作來說, 台灣的繁體中文版本還是比較好。

簡體中文版本是友人幫我從中國亞馬遜代購回來, 2013/12/26 從中國亞馬遜訂購, 20140116 拿到, 價錢 108*5 + 75 = 615 nt

但是簡體中文版本的附錄得從這裡下載, 沒有印在書上:
http://www.hzbook.com/Books/5129.html#download
這實在是欺負人, 怎麼不全本讓我下載就好。哦! 記得要先註冊。

Bjarne Stroustrup 不愧為大師, 不僅研究做得好, 連教學也很有一套。這本書是給初學者看的, 但我覺得裡頭很多主題不一定只對初學者有用。

chapter 6, 7 在談如何寫一個計算機, 你認為這很簡單嗎? 雖然幾乎每個平台都會有計算機, windows 的小計算機, linux 的 bc, 甚至連平版電腦都有計算機, 但要寫出計算機程式並不如想像中的容易, 基本上要靠自己想出來怎麼寫是很困難的。

一開始 Bjarne 會先用很直覺的方式來引導我們寫出計算機, 慢慢的告知我們這樣會有什麼問題, 在適當時機告知我們所謂的文法規則, 就是 compiler 課程上提到的 EBNF, 這是 50 年來的努力, 所以我們突破不了, 也是很正常的。

它牽扯到 compiler 理論, 這個部份很難無師自通。不過 Bjarne 是搞 c++ compiler 的, 這種幼兒程度的計算機當然難不倒他, 但對一般人的我們就沒那麼簡單了, 從這題目用了兩個章節來看就可以知道其難度。

chapter 12 ~ 16, 使用了 fltk 來介紹 GUI 程式設計, 這本書真是來得太慢, 比起聖經 The C++ Programming Language 實在親民許多。這些主題都是比較令人有興趣的主題, 不是只專注在 c++ 語言上。fltk 是一個跨平台的 framework, Bjarne 用它介紹了許多 GUI 觀念, 對我來說很是受用。

chapter 22 講述一些電腦語言的歷史, 可以使人耳聰目明, 有許多大師的照片, 很珍貴的。我幾乎就是因為這章而決定要買這本書。本章介紹了 fortran, cobol, lisp, alogl60, pascal, ada, simula, c, c++。Dennis Ritchie 為 c 的發明人, 提過 c 是強類型, 弱檢查的語言, 這是什麼意思? 不按照 type 定義的方式使用某個 type 是非法的, 但是 c compiler 不會去檢查它, 厄 ... 很奇怪吧!



原文是: C is a strongly typed, weakly checked language. - D. M. Ritchie

ACM 討論程式語言歷史的相關會議資訊

chapter 23 提到的 regular expression 在 c++11 已經是標準程式庫的一部份了 (書上使用的是 boost/regex.hpp), 放心的用他們吧! 這可讓 c++ 處理文字的能力提升不少。

ref:
官網 (已經更新為第二版的資訊, 繁體中文版也已經有了第二版): Programming -- Principles and Practice Using C++
書中範例: http://www.stroustrup.com/Programming/

2016年6月19日 星期日

图灵社区的码农電子雜誌

愛書人通常可以看的出來這是不是間用心的出版社, 图灵社区就是這樣用心的出版社, 看看「专家审读——《垃圾回收的算法与实现》」人家怎麼做書的, 台灣的出版社應該好好學習。

他們會這樣招募譯者:
英文當然不用說, 還有法文、日文、韓文的翻譯書籍, 這下你還會說學資訊就是要看原文嗎? 大部份的人說的原文是英文吧, 那遇到法文、日文、韓文、俄文時你怎麼辦呢? 找英文版對吧!而我英文不好, 只能找中文版了。翻譯工業是很重要的教育工程, 應該要有優渥的薪水來支持他們, 可惜你知道的。

那在图灵社区寫/翻譯一本書作者到底能拿到多少稿酬?

圖靈出版社大方了公開這樣的資料:

也是不多。政府也應該對這塊領域多加關照的, 教育可是國之根本。

图灵社区很用心的經營其圖書, 《码农電子雜誌》其實就是他們出版的書籍中的某些摘錄, 我一開始還以為怎麼這麼佛心的出版免費電子雜誌, 原來是行銷自己的書籍, 但就算是這樣, 也不讓人討厭, 這是讓讀者和出版社雙贏的策略, 台灣的書商應該得好好參考這樣的作法。码农電子雜誌也有其他的文章, 並不都是節錄其出版品。

大家来吐槽,《码农》给银子!」這是吐槽區, 把你對码农電子雜誌的想法寫出來, 還送類似折價券的銀子。

不過在還沒有 mobi 的版本時, 只下載 pdf 版實在難以讓我在電腦螢幕前觀看, 每篇文章幾乎都要盯上螢幕不少時間, 我無法這麼長時間盯著螢幕, 而這些內容又沒重要到印出來閱讀, 就這樣一直擱著, 直到有了 mobi 的版本, 我可以轉成 epub 到我的 sony t1 閱讀, 效果很好。

异步社区也是一個有出版電子書的社區, 和图灵社区的作法很雷同, 原來和图灵社区有關係的。

可參考:
图灵社区和异步社区什么关系?

中國連出版都壟斷, 這是必然的,要不然怎麼控制思想。別以為只有中國才這樣, 以前的台灣也是, 是很多人的犧牲和努力才換得現在的自由。

人民邮电都看到電子書的商機了, 台灣出版社還在硬撐嗎? 這需要很強的 web 技術, 可不是那種老是會洩漏會員資料等級的網站就可以完成, 除了 web 技術, 還有製作電子書的技術, 可不是 pdf 就可以了, 還得有 mobi, epub 這樣的格式才行, 图灵社区有這樣的技術而人民邮电才和其合作, 台灣出版社也應該嚴肅的來評估, 這可是擺脫博客來這樣實體通路的好機會。

至於電子書的格式以及販賣方式, 我只會買图灵社区這種作法, 請參考: 購買中國簡體中文电子书 - 初體驗, 《讀冊》那種販賣電子書的方式就算定價一元我也是不會買。

我很喜歡他們的一個單元: 图灵访谈, 會有一些有名的電腦名人的訪問, 不僅限於中國的名人, 還有國外的大師。ex:
Donald E. Knuth(高德纳):总有一些事超越我们的理解(图灵访谈)
http://www.ituring.com.cn/article/747

[英]Donald E. Knuth(高德纳):总有一些事超越我们的理解 (图灵访谈)
图灵访谈

還有聽書的作法:
发现极客听书计划为什么书呆子不受欢迎:他们的心思在别的地方(上)

2016年5月20日 星期五

[books] linux c 編程 一站式學習

linux c 編程 一站式學習 60 rmb, 20111212 購於台南若水堂, 60X6 = 360 nt。

市面上有好多好多的 C 語言書籍 (當然還有 c++, 而且很多內容都很類似), 我已經有了 The C Programming Language, 還需要其他的嗎? (還真的需要)

實際上我的 C 語言書籍不多, 大部份是 C++ 相關書籍。我大多是從 c++ 書籍上順便學習 c。這本書能吸引我的目光是因為作者提到了匯編 (組合語言) 與 C 關係, 詳細解釋了 crt.o 和組合語言之間的關係, 還有 linker 的東西, 這對我來說可是如獲至寶, 只因為三個章節的內容 (17, 18, 19), 我就買了, 書中應該超過一半是我已經知道的東西吧! 不過令一半的東西很重要, 我訝異我自己竟然不知道。這三章的內容是作者參考 programming from the ground up 來的。和程式設計師的自我修養內容很像, 當然程式設計師的自我修養比較詳細。

買回家細看之後, 比我想的更值回票價, 書中提到的 c99, 讓我對有些 c99 語法有了概念, 原來某些我不太理解的語法是 C99 的用法。

第 14 章在說明 c 語言複雜的轉換規則, 有 Usual Arithmetic Conversion, Integer Promotion, 再去看 c 規格書應該會容易些。你知道 0 - 1 的 0 和 1 是 int 還是 unsinged int type 嗎? c 語言規定了繁複的轉換規則, 0 和 1 會被轉成 int 再做減法, 所以結果是 -1 而不是 4294967295, 14.3 是這章的精華, 得花點腦筋才能吸收, 坦白說, 這對初學者實在太深, 有個印象就好, 知道有這回事, 儘量不要處碰到這些悔澀的的地帶。

我也寫了篇相關心得文: C 語言的 usual arithmetic conversion

p174 有個表在說明 IPL32, PL64 這個術語。
I: int
L: long
P: pointer

int i=5;
if (i < 123)

這個 123 是什麼 type 呢? 根據 p174 表 14.2 可以知道 123 是 int, 所以是 int 5 < int 123, 很單純。但有時候就不是這樣, 所以那些 Usual Arithmetic Conversion, Integer Promotion 才那麼複雜。

15.3 介紹了 side effect, sequence point, 就是 a = a++; 這種煩人的東西。

而第 17 章 - x86 匯編程序基礎 (組合語言基礎), 讓人受用, 藉由 readelf 讓我得知 obj 和 elf 執行檔案的內容, 雖然只是短短的一章, 需要不少腦力, 若在書店看, 得好好找張椅子慢慢消化, 買回家讀還是舒服些。內容和程式設計師的自我修養 - 連結、載入、程式庫很類似, 不過提到的東西比較少。若看的吃力, 那讀程式設計師的自我修養可能會難了點。

chapter 18 從 c runtime crt*.o 開始, 分析這些 .o, 當然要出動 objdump。在分析變數是怎麼儲存在記憶體、執行檔裡頭以及 bss, 我認為這個有點難, 看不懂對於學習 c 不成問題, 但搞懂會為你的功夫打下基礎, 再也沒有任何事情可以難倒你。

volatile 的解釋也很棒, 用反組譯來帶你理解這個關鍵字, 可不是沒感覺的文字描述而己。

chapter 19 詳細解釋 linker 的行為, 對於初學者這太難了。看不懂先跳過吧! 我都搞不清楚這到底是入門書還是進階書了。

chapter 21 講述 makefile 讓我對 make 有了另外的認識, 我覺得很受用, 書上提供了 gcc -MM 的 makefile rule, 在大型程式中很好用。

23.6 介紹了不定個數的參數, 就是 printf 的參數用法, 可不是單純講解 va_ 那 3 個 function, 還自己實作這三個 function, 又是有點難的小節。

chpater 24 介紹了 c 標準程式庫, 還介紹了 man page 的看法。

附錄 A 講述 unicode, utf8 編碼, 短短的篇幅卻給了很基本的觀念。

官網 (作者宋劲杉開放這本書, 本書可在這裡取得電子版本, 這真是不簡單): http://learn.akae.cn/media/index.html
http://songjinshan.com/akabook/zh/index.html

old version: http://akaedu.github.io/book/

2016年5月15日 星期日

購買中國簡體中文电子书 (图灵社區、異步社區、中國亞馬遜) - 初體驗

對於電子書的感覺是, 好像是個有用的東西, 又不是那麼的有用, 我覺得以目前的 e-ink 技術最適合小說類的書籍使用, 以及有以下特點的書籍/文字:
  • 純文字
  • 不含大量圖片
  • 不含長片斷程式碼
  • 不需要前後反覆交叉翻閱
  • blog 的長文章
而我閱讀的書籍通常會很需要前後翻閱, e-ink 的翻頁速度和閃爍完全不適合。目前的技術說實在要取代紙本書我覺得還差的遠。再來我覺得所謂的電子書並不是書, 而應該說是「電子內容」比較適合, 書可並不是只有內容, 還有裝定、排版、紙張的味道、撫摸書本的感覺, 這可都是實體書才會有的東西。

這篇文章和我有類似的見解: 不要買Kindle 的理由

再來是電子書的商業模式, 我喜歡的販賣方式是可以自己下載的, 而不是只能在書商特定的機器/環境/軟體中閱讀, 這種的書價就算是一元我也不會買, 《图灵社區》的电子书販賣方式正合我意, 在促銷的情況下 (每周半价, 電子書的售價也是很重要的一環, 和實體書的差價太少是沒人要買的), 我試著購買了一本 -《科学的极致: 漫谈人工智能》, 就是最近很紅的那個 alpha go。

不只電子書我是這樣的想法, steam 的遊戲也是這樣, steam 的遊戲是可以下載到自己的 pc, 而那些還有 drm 的遊戲, 不管如何便宜, 我也是不會買的; 另外電影也是, google movie 只能在自己的播放器播放影片, 我也不會買, 能下載到自己的 pc 的販售方式我才會買。原則就是我要有買的東西的主導權。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


图灵社區願意以這樣的方式出版電子書, 我們也應該要尊重其版權, 讓其他出版社跟進, 而更願意以這樣的方式出版電子書, 這本才 7.5 rmb, 完全沒必要去使用盜版的版本。

購買電子書可輸入優惠碼 Turing20, 會返回一些銀子, 可供下次購買時折扣用。

我的全部订单:
订单# ???
2016-04-22 14:35
已付款
科学的极致:漫谈人工智能 7.50
总计金额 7.50 元
优惠金额 -0.00 元
银子代替 -0.00 元
支付金额 7.50 元
返银 0 两


fig 1


fig 1 是購買前的畫面。

付款一樣是個難題, 我用了支付寶搞定這問題, 在台灣這不是一件容易的事情, 過了 20160520 就更難了。


結帳清單。



付款之後顯示的是已經購買的畫面。

付款後就會出現推送 mobi, 按下後就可以在信箱收到這本電子書了, 推送信箱要自己去設定, 和註冊信箱不一定要相同。


付款的時候就會自動推送到推送信箱, 不過似乎沒寄到, 我又自己按了推送一次才收到。

图灵社區的电子书格式是 mobi, 可以透過 calibre 轉成 epub, 放到我的 sony t1 閱讀。

有這樣不受保護的電子檔有什麼好處呢? 我可以自己做修改, 把簡體中文轉成繁體中文, 把看不爽的中國術語轉成台灣術語。

unzip a.epub 後, 使用 cconv 這個指令, 就可以把文字從簡體中文轉成繁體中文, 在 zip 回 a.epub 就完成了, 我寫了一個簡單的 script 來完成這件事情。

linux 簡繁轉換 script
1 #!/bin/sh
2
3 find . -name "*.html" -maxdepth 1  -exec cconv -f UTF8-CN -t UTF8-HK {} -o zh_tw/{} \;


ref:
linux 簡繁轉換





這個是賣錢的電子書, 品質相當好, 不論是程式碼還是圖片表格的排版, 都有良好的閱讀感受, 這在 6 吋的大小上並不容易。我買的這本還有提供 pdf 格式, 不過除非印出來, 要不然幾百頁的 pdf 不是很好在電腦螢幕上看, 而且也不能自由修改我看不順眼的術語。

异步社区也是一個有出版電子書的社區, 和图灵社区的作法很雷同, 原來和图灵社区有關係的。

可參考: 图灵社区和异步社区什么关系?

中國連出版都壟斷, 這是必然的,要不然怎麼控制思想。別以為只有中國才這樣, 以前的台灣也是, 是很多人的犧牲和努力才換得現在的自由。

後來在某天無意間發現《图灵的秘密:他的生平、思想及论文解读》有 3 折優惠, 雖然我已經有了實體書, 還是買下了電子版本 (實在太便宜了, 我都要替 Charles Petzold 抱屈了)。

20130303 訂購於 ruten 大享, 20130306 拿到 330+55 NT


2016-06-24 09:47 已付款
图灵的秘密:他的生平、思想及论文解读 9.99
总计金额 9.99 元
优惠金额 -0.00 元
银子代替 -0.00 元
支付金额 9.99 元
返银 0 两


買到便宜的書很開心, 不過悲劇是, 電子閱讀器剛好在這時候壞掉了。

图灵新书都带有刮刮卡, 刮開後註冊到圖靈自己的帳號上, 會有折扣, 像這本我就可以用 3.99 rmb 買他的電子版。



而發現書籍的錯誤, 寫在其頁面上, 也會得到銀子, 這是一個雙贏的勘誤策略, 既鼓勵了用心的讀者, 也增進了自己書籍的品質, 用心的出版社都應該這麼做。

而把讀後心得寫下, 也有「機會」得到銀子, 我寫的 2 篇心得就得到各 15 兩銀子。

ref:
圖靈社區的微博- 微博台灣站

異步社區:

201608 有五折電子書的優惠, 我趁機買了一些平常有在觀望的, 而且是我早已經有了紙本的版本的電子書。

异步社区特 别 优 惠 拿到本书目的读者专享:异步社区购书,满50元立减5元。 使用方法:注册为社区用户,在下单购书时输入“C3DPZ”,然后点击“使用优惠码”,即可享受优惠。 (订单满50元即可使用,本优惠券只可使用一次)

2016-08-26 19:37
书名 版本 数量 定价(¥)
C专家编程 电子版 1 27.00

总计金额27.00 元
总优惠金额-13.50 元
支付金额13.50 元






和圖靈社區一樣, 提供的是無 drm 的 epub, mobi, 可惜沒有 pdf 的格式。一樣可以轉成繁體中文和把看不順眼的中國術語換掉。ex: 指針、數組, 怎麼看怎麼不舒服。

最後我總共買了 4 本電子書, 其中有一本是學習 linux 的人都知道的知名繁體中文書籍:



我很佩服碁峰願意出版這本書 - 鳥哥的Linux私房菜--基礎學習篇(第四版), 因為鳥哥有開放這本書, 在其網站就可以找到, 碁峰也有出電子書版本: 鳥哥的Linux私房菜--基礎學習篇(第四版)(電子書)

真是棒阿! 不過似乎只有 pdf 版本, 沒有 epub 版本, 價錢是 675, 如果能有半價促銷, 有促銷、價格便宜、drm-free, 會更吸引讀者。epub 是很重要的, 希望碁峰可以出 epub 的版本, pdf 只能印出來才容易看, 但 epub 可以在 e-ink reader 觀看。希望碁峰可以成為中國的圖靈社區。

電子書下戴說明:
  注意: 請勿在非使用者之電腦下戴,電子書會記錄下戴時的ADOBE ID,請勿任意變更ID 。
這好像是一種 drm。我去查了一下資料, 要弄到 e-ink reader 很麻煩, 我還是買紙本就好, 不想折騰自己。

不過我這本是第三版。不知道為什麼在 2017 的時候, 這本書雖然我已經買了, 但已經不能下載電子版本了, 真奇怪。

電子書更好賣、更能吸引消費者去買, 我從第一本開始不知道買了多少我已經有了實體書的電子版本, 當然是買爽的, 而更多的電子書甚至只買下來而沒去看。

异步社区一樣有每周半价电子书

麻煩的是我的支付寶餘額已經不能使用 (無實名), 所以請朋友幫我代付款, 這真是討厭, 怎麼不學學中國亞馬遜可以用信用卡呢! 而目前 (2019 之後) 沒有實名, 也不能請朋友代付款, 買圖靈社區的書更難了。

异步社区客服

[中國亞馬遜]

20160826 我第一次在中國亞馬遜購買電子書, 原因很瞎, 只是為了知道《品悟C——抛弃C程序设计中的谬误与恶习》這是不是一本爛書, 沒親眼看過, 怎麼有辦法知道這書好還是不好呢?







因為我沒有 kindle, 就在 ipad 3 用亞馬遜的 app, 當然效果不好, 還是喜歡 e-ink 的畫面, 不過勉強可看。目前還有《Kindle电子书免费赠券5元- Kindle商店- 亚马逊》活動。《品悟C——抛弃C程序设计中的谬误与恶习》花了我 30.36 - 5 = 25.36 rmb。一樣用信用卡付款, 奇怪, 不是應該會擋台灣 ip 嗎? 怎麼這麼順利就買到了?

後來要買這本時: O'Reilly精品图书系列共21册(《Javascript权威指南》、《机器学习:实用案例解析》、《编写可读代码的艺术》、《算法精解》等) 49.99 rmb

我才知道有些特價電子書會需要中國在地 ip, 需要在《管理我的内容和设备/设置》將地址設定為中國地址, 還需要郵政編號和中國手機號碼, 怎麼弄到這些地址, 去淘寶集貨找就有很多了。

還需要用 vpn 設定到中國, 總算買到。

ref:
VPN Proxy 破解 YouTube、大陸視頻地區瀏覽限制(Hola Better Internet)

當然還是喜歡圖靈社區的販賣方式, 亞馬遜我只是試試水溫。

[美國 amazon]

買了中文版的 1984, 後來才知道 amazon 有些書是無法在 pc kindle 軟體上看的, 每本書有個裝置說明, 可以得知在那個平台可以觀看, 而這本 1984 中文版, 無法在 pc kindle 軟體上看, 我有一種上當的感覺。



亞馬遜有不同的檔案類型, 破解方法似乎也不同。

ref: 需要 把 DeDRM plugin 加到 Calibre, 重新啟動 Calibre, 再把 kindle 電子書拉近去, 就可以轉成 epub 了。

[kobo books]

20170203 我買了 "臺灣史上最有梗的臺灣史", 因為有折扣, 只花了 96 nt, 其實我不想買有 drm 的電子書, 這只是我測試用, 買買看台灣繁體中文的電子書。



kobo drm 破解一樣要 DeDRM。

我之前參考《 Kobo DRM Removal, Remove DRM from Kobo Vox EPUB PDF Files》但是沒有成功。

後來參考這作法: 日本乐天kobo去DRM实例

下載 pc/window kobo windows 應用程式, 然後把買的書下載下來。

需要搭配 Calibre DeDRM plugin 使用才能破解 kobo drm, 安裝 DeDRM 裡頭的 Calibre plugin, 按下該按鈕, 就會把 kobo 書籍列出來, 選擇之後就可以解除 drm。

DeDRM 目前已經沒有更新, 後續版本是 noDRM

目前最喜歡圖靈社區的電子書, 再來是異步社區, 再來才是亞馬遜。

我已經向圖靈社區、異步社區反應支付寶付款問題, 並說明中國亞馬遜可以用國際信用卡付款, 真希望他們可以增加使用國際信用卡付款的方式。

20171231 補充: 現在連代付款也要實名認證, 我已經無法購買圖靈社區、異步社區的電子圖書。

後來知道原來中國的電子書很多廠商, 例如多看, 台灣也該加油了。不過大部份還是要在廠商的私有軟體上才能看, 我就比較沒有意願購買。目前還是以圖靈社區、異步社區為主。

ref: