→ HuangJC:C under OS 是不行;但 C 本身倒不會不行,要換 compiler.. 11/14 01:31
推 jphant:我也是這樣想所以才會問要怎麼去寫這個程式... 11/14 02:40
→ jphant:要換成甚麼compiler才可以直接access RAM的物理位置? 11/14 02:42
和 compiler 沒有關係
重點在於你的程式要能夠安裝在開機磁區 或是做成開機光碟之類的
讓 BIOS 去呼叫你的程式
然後要自行進入 protected mode 以存取整塊記憶體空間
相當於自己寫一個小型的 OS
推 HuangJC:下一篇有提到,OS cache 你可以避過但 H/W cache 卻不好避 11/14 02:48
→ HuangJC:所以不只換 Compiler,還得懂硬體配置;那已經相當於寫組合 11/14 02:48
→ HuangJC:語言了;用 C 不會省你多少事 11/14 02:51
因為這支測試程式本身就是個小型的 OS
所以沒有所謂 OS cache 的問題
hardware cache 可以用下篇文章講的方式去避免它的影響
而且它本身其實是可以關閉的
關不掉的是 memory buffer
推 jphant:所以如果是這樣說 像樓上po的那些用C寫一個迴圈去一個bit 11/14 05:13
→ jphant:一個bit去跑的solution 還算是solution麼? 11/14 05:14
算是不好的 solution
可能偵測不到某些錯誤這樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.108
→ HuangJC:因為這種程式早就存在了,所以我假設原PO不是想要公認最省 11/14 11:05
→ HuangJC:事的做法,而是類似學習,挑戰.如果以這點出發,又對C情有獨 11/14 11:06
→ HuangJC:衷,那說實話,不見得要寫OS;就是盡其所能搞懂關鍵就對了 11/14 11:07
→ HuangJC:以我只熟C不熟組合語言來說,約略可理解這種情懷.. 11/14 11:08
推 sitos:我不太確定純 C 不加 asm 是否可能做到,我認為是不行。 11/14 13:46
→ sitos:應該需要某些 machine-dependent 的動作 C 是不支援的。 11/14 13:46
推 HuangJC:unix-like os 就是用 C 寫的,但又避不了組合語言,人家還是 11/14 13:56
→ HuangJC:盡可能的用C提高可攜性,可讀性;混入 asm 的部份可以用最有 11/14 13:57
→ HuangJC:'效率'的方式去寫(我想那不是執行效率),老實說已經讓我這 11/14 13:57
→ HuangJC:種人很滿足了.我寫單晶片都用C.. machine-dependent 有就 11/14 13:58
→ HuangJC:有吧..但C已經用順手了;當然我的程式效率不會太好. 11/14 13:59
→ HuangJC:compiler 要換用 real mode 版本的,比如 VC 1.5版 11/14 14:00
→ littleshan:你要測整個 physical memory 怎麼可能會用 real mode 11/14 18:19
→ littleshan:real mode 只能定址到 1MB,不可能讓你測完全部 11/14 18:23
推 HuangJC:沒錯,既然你知道這個,那知道 DPMI 吧! 簡單說,重點仍然在 11/15 01:35
→ HuangJC:直接物理定址,而不在一定要佔用 BOOT 時機;但我不否認BOOT 11/15 01:35
→ HuangJC:時很容易直接存取物理位址.如果我利用任何外部硬體,比如 11/15 01:36
→ HuangJC:DMA,而不用 CPU..只要我存取到某物理位址就好了;那我又可 11/15 01:37
→ HuangJC:以同時測試 0x10001,0x20001,x030001 的位址(舉例),為什麼 11/15 01:38
→ HuangJC:呢?因為CPU一次出現一個位址沒錯,但不代表分開的RAM顆粒也 11/15 01:38
→ HuangJC:必需輪流測..利用外部DMA我就可能玩出這把戲..記憶體刷新 11/15 01:39
→ HuangJC:就有玩過這招..;我沒說目前的電腦是這樣,一切看硬體到底怎 11/15 01:40
→ HuangJC:麼佈線. 11/15 01:40
推 HuangJC:所謂 real mode 版本 compiler 是指 loader 部份,接下來就 11/15 01:49
→ HuangJC:和你講的自行進入 protected mode 是一樣的;我們講同件事 11/15 01:50
→ littleshan:loader 是 OS 在做的,和 compiler 有什麼關係? 11/15 13:00
→ littleshan:現在一般的 PC 幾乎沒人在用 dos 之類的 real mode OS 11/15 13:03
推 HuangJC:一般基礎 RD 的確不知道其關係,但如果去翻查 data sheet就 11/15 18:00
→ HuangJC:有,否則 C 是無法用來寫 OS 的 11/15 18:00
推 HuangJC:現在整合化 compiler 不去探討 c compile to asm 這塊,但 11/15 18:04
→ HuangJC:一開始先是有這種東西,所以有些不全的資訊事實上是 asm 本 11/15 18:04
→ HuangJC:身的基礎.因此我也會同意'C做不到'的講法,因為根本要對asm 11/15 18:05
→ HuangJC:很熟,C是當成'產生 asm'的工具;那怎麼還有人致力於用 c 寫 11/15 18:05
→ HuangJC:OS 呢?挺沒效率的.大概大家早就猜測電腦遲早夠快不去計較 11/15 18:06
→ HuangJC:倒是弄一堆工具再改用 C來寫(為了可攜性?)就成為另一個重 11/15 18:07
→ HuangJC:點.的確 unix like 的 OS可以移植,應該是挺有收獲的.. 11/15 18:07
→ HuangJC:C compiler 可以置換一些 obj 以達到配合不同 loader的效 11/15 18:09
→ HuangJC:果,但除了寫 driver,常駐程式 這種人之外,沒事不必熟這塊 11/15 18:09
→ HuangJC:所以我們平常也不能 compile 出 driver 來.. 11/15 18:10
→ littleshan:別扯開話題,memtest 之類的程式用一般的 gcc 就可以編 11/15 20:14
→ littleshan:我不認為你一定要用 VC 1.5 才能編出這種程式 11/15 20:14
→ littleshan:更何況 就算你用 VC1.5 你還是要編成 32bit 程式 11/15 20:15
→ littleshan: 不然根本無法定址 11/15 20:15
推 HuangJC:你說的對,你回頭看我說的是'比如VC1.5',而不是'一定要' 11/15 20:23
→ HuangJC:基本上一個會自己思考的人,我們給建議不管有多少漏洞,他會 11/15 20:23
→ HuangJC:自己補完.所以VC1.5能不能用?如果不補完我也懶得教了.. 11/15 20:23
→ HuangJC:那為什麼我要扯去 1.5版呢?因為它和時下搞 DLL 之類的無關 11/15 20:24
→ HuangJC:只是很快讓人知道有不同的東西可運用.但要補完的還很多.. 11/15 20:25
→ HuangJC:不過你討論的態度實在不錯,值得推一下;不會因為沒補完的部 11/15 20:27
→ HuangJC:份沒講完,且自己有正確的一整套,就直接說別人全錯了 :) 11/15 20:27
→ HuangJC:你那一整套都是對的,先確認;我只是在談'想學習'的心態.. 11/15 20:27
→ HuangJC:所以,我一個熟C的人,該如何一點一滴探索過來呢? 11/15 20:28
→ HuangJC:既然你講gcc,我之前想到的是,碰 linux 吧,它完全公開.. 11/15 20:29
→ HuangJC:學這一段不會被微軟絆手絆腳的.. 11/15 20:29
→ HuangJC:'如何用C做到絕對物理定址',若這樣描述,問題就快速轉到必 11/15 20:31
→ HuangJC:需學習硬體相關的知識,搞懂 cache怎麼關閉,搞懂暫存器,旗 11/15 20:31
→ HuangJC:標如何設定. 11/15 20:31
→ HuangJC:DPMI 就是以前 DOS 時代但又想存取32位元位址發展出來的 11/15 20:33
→ HuangJC:簡單說,它不能把程式放上去執行;但能把資料放上去存取.. 11/15 20:33
→ HuangJC:它的運作原理是CPU在真實/保護模式間快速切換..很詭異 11/15 20:34
→ Cayman1021:bootloader on MDR ? 11/22 15:44