看板 ask-why 關於我們 聯絡資訊
※ 引述《sitos (麥子)》之銘言: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.84
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