2017年6月27日 星期二

沉默的樂章—日本動畫作曲家列傳(2): 大野雄二

 (原載於開拓動漫情報誌)

從《太空突擊隊》談起

這個名字應該會勾起很多三四十歲男性讀者的回憶,這是在1980年(民國69年)時台灣電視台播出的一部科幻動畫,沒記錯的話,應該是在台視播出的。

為什麼印象深刻?有別於之前《科學小飛俠》和《無敵鐵金剛》那種「主角在每集裡不斷地對付來犯的同一個反派」的固定模式,《太空突擊隊》的故事設定在未來,人類已經進入太空的時代,主角「鐵船長」是有名的科學家跟太空冒險者,帶領著他的團隊:科學家「活腦」田教授、力大無窮的機械人克拉,以及能變形成各種容貌的生化人小胖,駕駛著太空船彗星號,解決宇宙中一個又一個的神秘事件,每個事件大概是三到四集,而且有著堪稱精細的科技設定,這些都對當時的動畫觀眾造成很大的衝擊,但是那時候很少有人知道這部動畫真正的來歷。

這部《太空突擊隊》其實原名叫做《未來船長》(キャプテン・フューチャー, CAPTAIN FUTURE),由東映動画和NHK製作,1978年11月到1979年12月在NHK綜合頻道播出,所以在台灣播出其實是隔年的事情;而這部片本身的原作來自一套1940年代美國的古典科幻小說,作者是艾德蒙·漢彌頓(Edmond Moore Hamilton,1904年11月21日~1977年2月1日),小說的原名就是Captain Future;片中的主角鐵船長其實原名是克提斯‧牛頓(Curtis Newton),活腦則是賽門‧萊特教授(The Living Brain - Professor Simon Wright),機器人克拉其實是葛瑞格(Grag),生化人小胖則是奧圖(Otho),那艘太空船彗星號的原名就是コメット(Comet)。



當時在台灣播出的《太空突擊隊》,因為國情的關係,主題曲是由台灣這裡作詞作曲演唱,配音也全部換為國語配音,但是裡面優美卻又帶點成熟風味的配樂卻令人印象格外深刻,直到後來才知道,這些配樂,以及當時我們沒能聽到的日文片頭曲,都是同一個作曲家的作品,這位作曲家就是大野雄二。

自學的爵士音樂家

大野雄二先生出生於1941年,慶應義塾大學法律系畢業,從中學開始就玩音樂,大學時加入校內的爵士樂社團,主要擅長的樂器是鋼琴,附帶一提,大野先生是靜岡縣熱海市出身,老家是熱海有名的溫泉旅館「ホテル大野屋 」。

其實是否要稱呼大野先生為「動畫音樂家」是個很傷腦筋的問題,因為他大部分的作品都是電影和電視連續劇配樂,嚴格來說,除了《未來隊長》以外,他其實只作過幾部動畫以及一部特攝片《星雲假面》(星雲仮面マシンマン)的配樂,但是其中有一部動畫,從1977年一直到現在都還是由大野先生擔任配樂,也幾乎可以說是他的代表作,那就是《魯邦三世》。


《魯邦三世》(日語:ルパン三世,英語:Lupin lll),是日本漫畫家モンキー・パンチ(Monkey Punch)的漫畫系列作品,借用了法國小說家莫理斯‧盧布朗的小說《怪盜亞森羅蘋》為底子,塑造出一個繼承祖父亞森羅蘋的高超竊盜技巧,但卻對美女束手無策的怪盜,與他愉快的夥伴:神槍手次元大介、居合斬高手十三代石川五右衛門,以及神秘女盜峰不二子,一面逃避緊追不捨的警探錢形幸一,一面偷遍世界的冒險故事。

《魯邦三世》最初的漫畫連載於雙葉社的「 WEEKLY漫画アクション 」,從1967開始,到1969年結束,1971年10月到1972年3月播映第一部魯邦三世電視動畫,一共23集,但是第一部魯邦三世的音樂並不是大野先生所作,而是另外一位山下毅雄先生;五年後,也就是1977年,第二系列的魯邦三世電視動畫開始播出,這次一播就播了三年,從1977年10月播到1980年10月,一共155集,這個系列也是魯邦三世動畫中最為人所知的系列,而大野雄二先生也是從這個系列開始擔任魯邦三世的配樂,不僅如此,1984年3月到1985年12月的魯邦三世Part III,以及之後大部分的魯邦三世電影版以及電視特別版,都是由大野先生負責配樂,包括由宮崎駿導演的《魯邦三世‧卡里奧斯特羅城》(日語:ルパン三世 カリオストロの城),而且,這麼多部魯邦三世動畫,真正的主旋律其實只有一組,這個主旋律被稱為「魯邦三世主題曲」(ルパン三世のテーマ),被稱為日本最有名的動畫主題曲之一。

講到這裡先稍微岔個題,在前幾期的日本動畫作曲家列傳中,我們曾經提到過,日本動畫的片頭片尾曲通常都是由歌手演唱的歌曲,另外像是電視連續劇等等通常也都是如此,不過日本的電視劇中,有某些類型電視劇的傳統上不使用人聲,而使用純樂器演奏的曲子作為片頭,像是以刑警或警察為主角的「刑警劇」(刑事ドラマ)就是其中一種,為什麼要提這點呢?因為「魯邦三世主題曲」一開始在魯邦三世電視版第二系列時,就是以無人聲純演奏形式作為片頭,這在日本動畫中非常少見,所以值得特別提出來。

根據大野先生自己的說法,在創作「魯邦三世主題曲」時,主要考慮到的是能表現出魯邦三世「行動」、「竊盜」與「快樂的場景」,同時也要能配合「孤獨憂傷的景象」,也顧及了曲風的普遍性和復古的感覺,所以這首「魯邦三世主題曲」呈現出近似於義大利式西部片(Spaghetti Western)式的爵士曲風,以二部曲式中的「AABA樂式」(Thirty-two-bar form),以這首主題曲為基礎,大野先生譜出了無數的變奏形式,魯邦三世中各種不同的場景,都可以用主旋律各種不同的變奏來表現。

「魯邦三世主題曲」除了用於魯邦三世動畫以外,日本高中棒球聯賽裡面,有不少學校也用這首曲子作為自己學校隊伍的加油歌( 応援歌 );另外日本職業足球隊「 FC東京 」也用這首曲子當作他們的「 Chant」(戰歌)。

《未來船長》的音樂與歌曲

以年代來說,《未來船長》跟魯邦三世(電視版第二系列)其實是同一個時期,但是大野先生為《未來船長》編寫的配樂呈現出完全不同的風格,為了表現出《未來船長》那種「太空冒險劇」的氣氛,大野先生以各種不同的配器和音樂風格來表現不同的氣氛與場景,宇宙空間的深邃與神祕、遇到危機時的緊張,機器人跟生化人之間鬥嘴吵架的逗趣場景等等,而其中最能表現出主題的,莫過於本片的主題曲「搭乘夢之船」(夢の舟乗り)以及片尾曲「白楊街的家」(ポプラ通りの家)可惜這兩首曲子當時台灣的觀眾都聽不到。




這首「搭乘夢之船」由大野先生作曲及編曲,山川啓介作詞,前後有兩位歌手唱過,一位是秀夕樹(ヒデ夕樹),另一位是タケカワ ユキヒデ,這位ヒデ夕樹應該特別提一下,他唱過《海王子》(海のトリトン,1972年)、特攝片《快傑獅子丸》(快傑ライオン丸)和《人造人間キカイダー》的主題曲,他的唱腔很特殊,喜歡用黑人靈魂樂的唱法,但是在當時,這種唱法被認為是「不適合兒童」,所以找他唱動畫主題曲的不太多,加上1979年他因為持有大麻被逮捕,當時正在播映的《未來船長》製作群就把片頭曲從他的版本換成タケカワ ユキヒデ的版本(當然大野先生本來就是屬意後者來唱);其實後來到了90年代時,這種成熟的唱腔在當時的動畫音樂是很受歡迎的,可惜的是他在1998年12月因為心臟病過世。

至於片頭曲的另一位歌手タケカワ ユキヒデ,漢字名字是武川行秀,這位歌手也很有趣,他不僅是歌手,也是個作家,還是個模範好爸爸(他有一男五女,1999年還曾獲頒日本最佳父親獎),除了喜歡旅行、攝影、廚藝以外,還是個「非常重度」的漫畫迷,他有一棟專門用來放漫畫書的房子,裡面收藏了他三十年以來,超過七千五百本漫畫雜誌,到現在一周還是要看七本漫畫雜誌,作為業餘興趣來說,他的功力很可能超過一般專業的漫畫評論家。

片尾曲「白楊街的家」是由一個叫「躲貓貓」( ピーカブー, Peekaboo )的樂團演唱,這個樂團是由藤島新和黒沢裕一兩位歌手組成,他們還唱過NHK動畫《名犬雪莉》的插曲。

美式硬派與爵士:宇宙海賊眼鏡蛇


雖然作過的動畫配樂不多,不過大野經手的作品每部的風格都很特別,除了《魯邦三世》和《未來船長》外,另外有部《太空眼鏡蛇》(スペースコブラ)很值得一提,這部動畫也是電視版動畫,從1982年10月到1983年5月在富士電視頻道播出,原作是漫畫家寺沢武一的《宇宙海賊眼鏡蛇》(コブラCOBRA THE SPACE PIRATE),這是一部相當男性向,非常「硬派」的作品,而且寺沢武一本身的畫風就非常的「美漫」,也就是非常的美式漫畫風格,無論是漫畫本身或動畫,都是非常獨特的存在。


《宇宙海賊眼鏡蛇》的配樂並不是大野先生,而是曾配過《超時空要塞Macross》的羽田健太郎先生,大野負責的是片頭曲「コブラ」(眼鏡蛇)與片尾曲「シークレット・デザイアー」(祕密的渴望),這兩首歌都呈現非常強烈的爵士樂風,跟《宇宙海賊眼鏡蛇》中那個放浪不羈,叼根雪茄,一隻手上裝著威力強大的神經槍的主角Cobra,簡直是絕配;而片尾曲「シークレット・デザイアー」呈現出強烈的巴薩諾瓦(Bossa Nova)風格,浪漫慵懶的曲調,十分動聽。

2001年的時候,大野先生為NHK的電視動畫《学園戦記ムリョウ》配樂,其實從《ルパン三世 Part III》以後,大野先生就沒有替電視動畫配樂過,算一算已經是16年後的事情;除了配樂,這部動畫的片頭曲「Take」與片尾曲「begin」也是由大野先生作曲編曲,其實這在2001年來說是很稀有的事情,因為那時候大部分的動畫都已經是採用片頭片尾曲與配樂分開製作的形式。

前面提到過,大野先生其實大部分的配樂作品是電影和連續劇,在電影中,比較有名的就是1976年由角川春樹事務所製作,東寶發行,市川崑導演的《犬神家の一族》,改編自横溝正史的《金田一耕助》系列推理小說,也是石坂浩二主演的《金田一耕助》系列電影的第一部,創造了十五億六千萬的票房收入,是該年電影賣座紀錄的第二名;大野先生的配樂功不可沒,其中的主題曲「愛的抒情曲」(愛のバラード),完全表現出劇中玄秘而優美帶點哀傷的氣氛,堪稱是推理劇的名曲,而且因為這首曲子與《犬神家の一族》的連帶印象實在太過深刻,所以後來市川崑導演自己重拍一次《犬神家の一族》,全部演員包括配樂雖然都換掉,但是只有主角石坂浩二和這首「愛的抒情曲」還在。


從《犬神家の一族》之後,大野先生就經常擔任推理懸疑電影的配樂,像是1977年改編自森村誠一同名推理小說, 著名的《證明三部曲》之一 的《人間の証明》 以及1978到1979年,由村川透導演的《遊戲三部曲》等等;而在電視劇方面,像《大激闘マッドポリス'80》以及後面的續集《特命刑事》也是代表作,事實上大野先生配樂最多最久的其實就是電視劇,從1970年就開始,到2012年都還有作品。



除了劇伴音樂,大野先生也為很多歌手的專輯作曲或編曲,近年也有為視訊遊戲配樂,不過數量不多,只有一部1991年光榮的「歐洲戰線」(ヨーロッパ戦線)和PS2上的《魯邦三世 魔術王的遺產》(ルパン三世 魔術王の遺産)。

作曲之外,大野先生本身也是爵士樂手,主要是擔任鋼琴演奏,他的爵士樂團到目前為止都還有公開演出,而且還有自己的部落格跟推特,相當跟得上時代。


不過大野先生跟動畫音樂的緣分就這樣結束了嗎?並沒有!2015年播映的新魯邦三世電視版,配樂再度交給了大野雄二先生,他有名的「魯邦三世主題曲」以新的變奏陪伴著魯邦繼續冒險。

至於《未來船長》,東映克服了眾多版權上的種種困難,終於在2016年發售了經過畫質強化處理過的全套藍光光碟版,但是國內沒有代理,所以也沒有中文字幕,日文聽力夠好又有興趣的不妨買一套回去收藏,不過如果只是懷念過去那個國語版《太空突擊隊》的話就不用了,這套並沒有收錄中文主題曲,也沒有國語配音。

沉默的樂章--日本動畫作曲家列傳(1):川村榮二

(原載於開拓動漫情報誌)

寫在前面

如果你愛看動畫,應該會記得一些名字;如果很愛看動畫,你會記得很多名字。
你應該會記得宮崎駿,如果多看過幾部宮崎駿的動畫,可能還會記得久石讓;好吧,這樣也許太低估你了,你記得川井憲次、田中公平、也許還有菅野洋子和和田薰,他們正在日本動畫音樂的舞台上發光發熱,有些來過台灣,有些還沒有,但也只是遲早的事。
我想要介紹的不是他們。

我要介紹的是一些在台灣甚至在日本也不太出名的動畫音樂人,他們有的可能已經退休,甚至過世了;他們經手配樂的動畫,你可能只聽過片名,甚至可能一點印象都沒有,有的是因為年代太久,也有的是因為不盡理想導致收視率普普,最後被腰斬,畢竟日本是動畫大國,即使是1980年代,每年也製作至少30到40部動畫,除了少數幾部之外,大部分都被埋沒在日本五六十年來生產的無數動畫下。

但是這並不表示這些作品一無可取,至少就我看來,它們的音樂值得一提,但是因為作品本身不具知名度,連帶的它們的音樂與音樂製作人也隨之沒沒無聞,就我看來這是很可惜的事情。

所以我希望盡我所能找出這些動畫、這些動畫的音樂,以及這些動畫音樂人的背景,根據我能收集到的資料來介紹他們和他們的音樂,不管他們是不是還在世,我希望他們知道,這個世界上至少還有一些人不願遺忘他們,也不願他們被人遺忘。
當然,我相信我一定會遺漏掉很多作品,如果各位知道哪些作品值得一提,也請不吝提供。


飛影、冥王、葉小釵

這個飛影不是《幽遊白書》的那個飛影,這裡的冥王也不是哈帝斯,但是葉小釵的確是霹靂布袋戲那個「刀狂劍癡」葉小釵。

這三個名字代表了兩部動畫與一位音樂家,但是要介紹這位音樂家,我想應該先介紹這兩部動畫,首先從這部「不是幽遊白書」的飛影開始,這部作品全名叫《忍者戰士飛影》(忍者戦士 飛影 にんじゃせんし とびかげ)。

《忍者戰士飛影》是一部機器人動畫,從1985年10月6日到1986年7月13日在日本電視網週日早上10:30播映,全長43集,由小丑社(スタジオぴえろ)製作,這個工作室後來也製作了火影忍者的全系列動畫;導演是案納正美,他曾經待過龍之子,當時是小丑社的總監督;原作與腳本則是由渡邉由自撰寫,渡邊先生在此之前多半是為SUNRISE公司的動畫撰寫腳本,比較有名的是《重戦機エルガイム》。

除了導演和劇本(以及一定會提到的音樂家)以外,《忍者戰士飛影》的製作班底有三個人特別值得一提:擔任機械設定的森木靖泰、機械作畫監督的大張正己、以及擔任人物設定的平野俊貴(當時還叫平野俊弘);這三位都是後來赫赫有名的日本動畫工作者,不過當時都還很年輕,大張正己那時候還不到二十歲;森木靖泰那時候也不過二十出頭,這兩位當時還算是初出茅廬的動畫人替《忍者戰士飛影》帶來極為精緻的機器人設計,主角機器人「飛影」參考了日本傳統忍者的造型以及武器,可以跟另外三台非人形機器人:四足步行的「黑獅子」、鳥形的「鳳雷鷹」以及龍形的「爆龍」分別合體;敵方的機器人也參考了日本古代的武士以及步兵造型。

而平野俊弘和《忍者戰士飛影》就有點小八卦了,原本《忍者戰士飛影》的人物設定只有一位加藤茂先生,但是因為他所設定的人物造型,特別是女主角們比較沒那麼有吸引力(簡單的說就是不夠漂亮),所以找來擅長畫美少女的平野俊弘幫忙,那時候他也才三十出頭;1982年因為擔任《超時空要塞馬克羅斯》的人物作畫監督兼原畫一戰成名,平野俊弘畫的女孩子有多漂亮?這裡先舉三部作品就好:1985年的《戰鬥吧!!伊庫薩1》(戦え!!イクサー1)、1987年的《破邪大星彈劾凰》(破邪大星ダンガイオー)以及1988年的《吸血姬美夕》,而且不是只有臉部,整體身材線條都非常勻稱而充滿魅力。


《忍者戰士飛影》的劇情一開始大致是這樣的:西元2200年,人類在火星上已經建立了殖民地,在殖民地上的主角三人,無意中遇到從銀河另一邊薛瑪星系(シェーマ星系)拉德里歐星(ラドリオ星)逃到火星來的宇宙船エルシャンク(Ellshanc)與其中的羅米娜(ロミナ)公主,以及追殺羅米娜公主而來的紮崩軍(ザ・ブーム軍),エルシャンク逃來太陽系的理由,是因為他們的祖上過去曾經遇到地球上的「忍者」,並以其為藍本製造了三具戰鬥機器人,而主角等三人是唯一能夠操作這三具機器人幫助他們對抗紮崩軍的人類,儘管如此,面對紮崩軍的數量優勢,這三人與エルシャンク還是陷入苦戰,就在此時,一台神秘的人形機械人「飛影」突然出現解救了他們的危機又神秘消失。

隨著劇情的進展,謎底也逐漸的解開,故事的舞台從火星到了地球,總之,到了最後,他們終於打敗了企圖連地球一起征服的紮崩遠征軍,並且準備跟著エルシャンク回去收復拉德里歐星。

然後?沒有然後,整部《忍者戰士飛影》有43集,41集時就演到這裡,接下來兩集是過去的回顧總集篇,然後就結束了,沒有任何後續;以一般觀眾的角度,總是會覺得這樣的結束方式是不是有留甚麼伏筆,可能以後還會有續集甚麼的,但是沒有,《忍者戰士飛影》沒有任何後續的故事,如果真的要猜的話,有可能是因為劇本本身很難收尾,收視率不盡理想,製作團隊就被迫草草收尾了事。
這是很可惜的一件事,因為《忍者戰士飛影》的機械與人物設定都是一時之選,更不用說稍後介紹的配樂;但是因為收視率不佳,這部作品從此就被埋沒,其實這不是第一次,甚至也不是最後一次;日本動畫史上的確有很多這樣的腰斬動畫,當然《忍者戰士飛影》並沒有完全被埋沒,後來在電玩遊戲《超級機器人大戰》又撿回了這顆遺珠。

終於要提到本文的主角了,《忍者戰士飛影》的背景配樂作曲家名叫川村榮二(川村栄二),1946年在日本北海道小樽市出生,北海道大學肄業,除了作曲以及編曲外,也是個吉他手,介紹完畢。

就這樣?

是的,除了他作過或編過的曲子以外,有關川村先生本人的資訊少得可以,一方面因為他最活躍的年代網際網路還不是很發達,很多資料都沒有上網;另一方面這位作曲家本身也很低調,我們只能找到他曾經作過的作品;川村先生主要是為動畫、特攝以及時代劇配樂,另外也幫不少歌手的歌謠曲編曲;像1987到1988年的特攝劇《仮面ライダーBLACK》全系列(包括RX和電影版)、五星戦隊ダイレンジャー(1993年)、忍者戦隊カクレンジャー(1994年)也都是他擔任配樂,另外1996年的怪醫黑傑克電影版也是川村先生配樂。

《忍者戰士飛影》的原聲帶有兩種版本,早期的黑膠唱片和錄音帶,以及後來的CD,除了川村先生的配樂以外,還有兩首片頭與片尾曲,片頭曲「LOVEサバイバー」與片尾曲「一世紀めのエンジェル」 都是由小田裕一郎作曲編曲,青木久美子作詞,一個叫「HIT BOY」的樂團主唱,但是HIT BOY這個團體沒有任何其他資料,原聲帶裡面沒有說明,只有他們出過的唯一一張單曲唱片上面有成員的照片,如果各位認得他們是誰,歡迎跟我們聯絡。



既然是以「忍者」為主題,《忍者戰士飛影》的音樂當然要能夠表現出「忍者」的感覺,一般而言「忍者」給人的感覺是,神秘、快速、以及戰鬥,由於是日本獨有的產物,音樂表現手法上會用到日本傳統的五聲音階,以日本箏或笛等樂器,演奏快速的連續輪音來表現,這樣的音樂常常出現在日本的古裝時代劇中,如果要具體地給個例子,可以參考1980年的「服部半蔵 影の軍団」片頭曲的部分,更典型的例子,像是1985年Taito的電玩遊戲《影子傳說》,整部遊戲的背景配樂就是典型的忍者意象。

川村先生為《忍者戰士飛影》作了18首曲子,編曲上多半是以銅管,小提琴獨奏以及少部分的電子音樂,在這些曲子中,川村先生表現「忍者」的音樂手法可以用這首「飛影 見参!」為代表,音樂的一開始,首先由法國號以日本風格的五聲音階吹出如同戰鬥號角般的前奏,跟著後面幾聲重節奏後猛然停止,隨後又用法國號吹出更高音的號角聲,接著是典型、如同忍者腳步般快速的十六分音符,「詭秘」、「迅捷」、「戰鬥」的忍者風格充分地在這首表現出來,而其他的曲子,只要是跟忍者主題有關,也都會出現類似的元素。

「飛影 見参!」這首主旋律的後半段,其實是片頭曲「LOVEサバイバー」的演奏版;這裡要稍微岔題一下,談談日本動畫音樂與片頭片尾曲的演進,日本動畫發展的初期,片頭、片尾和劇中的配樂通常都是同一個作曲者,所以在配樂裡面聽到主題曲的旋律是很正常的,到了1980年代後期,大多數的動畫都會使用獨立的片頭和片尾曲和配樂,也就是劇中配樂跟片頭片尾曲的作曲家不是同一個,《忍者戰士飛影》剛好是介於中間的一個例子,雖然片頭片尾曲是由其他作曲家負責,但是在配樂的作曲家中還是會把片頭片尾曲用到部分配樂中,到了90年代或更後期,這樣的情況就很少出現了。

除了表現出「忍者」的風格外,《忍者戰士飛影》的音樂對其他情境的表現也一樣優秀,川村先生以高昂的銅管表現出戰鬥以及勝利等情境,弦樂與鋼琴表現出憂傷的氣氛以及女主角們的特質,其中特別值得一提的一首「出逢いは期待あふれて」(充滿期待的相逢),這首一開始以高亢的銅管和定音鼓表現出如陽光般的勝利氣氛,隨後很快地以鋼琴聲接續著弦樂表現出女性般優美的曲調,最後近似於忍者主旋律的的幾聲銅管號角卻又呼應了隱藏的忍者主題,氣氛的轉折在同一首曲子中,卻不會覺得突兀,川村先生的功力可見一斑。

雖然川村榮二先生為《忍者戰士飛影》作了極為優秀的配樂,但是非常可惜的是,因為這部作品草草結束,知名度不是太高,加上那時候也很少針對作曲家特意的加以宣傳,所以《忍者戰士飛影》的原聲帶很久以前就已經停止發行,在台灣知道的人就更少了,不過,好的音樂不會永遠埋沒,有時候因為一些奇特的契機,會讓這些音樂以令人意外的方式重新為人所知,接下來要介紹的這部動畫,同樣是由川村先生配樂,而這部動畫的音樂對台灣的聽眾來說就不是這麼陌生,雖然大部分聽眾也都不知道作曲者真正的名字。

昭和最後的機器人動畫《冥王計畫》

《冥王計畫》(冥王計画ゼオライマー)是動畫國際公司AIC(株式会社アニメインターナショナルカンパニー, Anime International Co., Inc.),從1988年11月26日 到1990年2月21日,以「原創動畫錄影帶」(OVA,Original Video Animation)形式發售,也就是說,這部動畫原本就是以錄影帶形式發售,並不是在電視頻道或是電影院播映;原作是ちみもりを的漫畫,你可能沒聽過這位漫畫家?沒關係,他的另外一個筆名是高屋良樹,目前連載中(而且已經連載了快30年)的《強殖装甲卡巴》(強殖装甲ガイバー)就是他的作品,而且這位漫畫家就只畫了這兩部作品,不過這部動畫只使用了原作漫畫中的部分設定,其他大部分都是動畫製作者的原創,所以跟漫畫關聯不大;對了,因為這部作品發售的期間剛好遇到日本天皇駕崩更改年號(1989年日本年號由昭和改為平成),所以這部也被稱為「昭和最後的機器人動畫」。

導演與分鏡是平野俊弘,對!就是剛剛你看到《忍者戰士飛影》的美形人物設定大師平野俊弘,但是這次的人物設定與作畫監督不是他,而是菊池通隆,這位大師也很值得一提;1963年出生,因為《宇宙戰艦大和號》而讓他成為動畫迷,後來就進入動畫界工作,從宮崎駿的《風之谷》原畫開始,在多部作品中擔任原畫;在此同時,有位筆名麻宮騎亞的漫畫家也同時以《神星記》神星記ヴァグランツ、《魔法陣都市》サイレントメビウス出道,很快有人發現,這位麻宮騎亞老師的畫風跟菊池通隆先生極為相似,有很長一段時間,大家紛紛猜測他們到底是同一個人還是夫妻關係,但是當事者也沒有出面闢謠,有時候甚至還聯名發表作品,上面還有各自的履歷(出生年月日還故意不一樣),到2001年才承認他們是同一個人。

既然也是機器人動畫,當然少不了機械設定,《冥王計畫》的機械設定不是別人,正是剛剛提到《忍者戰士飛影》的機械設定森木靖泰先生;如果說飛影是森木靖泰初試啼聲之作,《冥王計畫》就可以說是他代表作的開始;在冥王計畫中包含主角在內的八台機體,各具特色的設計,卻又一致的充滿銳利洗練線條與厚重的裝甲感,展現出完美的機械美感。

不像《忍者戰士飛影》長達四十多集;因為是OVA的關係,《冥王計畫》只有短短的四集,而且是每半年發售一集,所以作畫品質極高;不過當初發售的時候主要是用錄影帶(Beta和VHS,有人記得嗎?)和雷射影碟(LD),後來才改出DVD,2008年為了慶祝發售20周年,有推出畫質加強修正的藍光光碟,另外也有在超級機器人大戰中出場。

《冥王計畫》的大致劇情如下:隱藏在國際電子大企業底下的秘密組織「鐵甲龍」,在蟄伏了多年後,將要以本身超科技製造的八具機器人「八卦眾」征服世界,而他們的頭號目標,就是奪回藏在日本祕密機構「最終守護者」內,八卦眾中最強的機器人「天之ゼオライマー」,而唯一能駕駛ゼオライマー的,是一個15歲的少年秋津マサト與一個神秘的少女氷室美久,然而少年所不知道的是他本身也會成為毀滅世界的關鍵。

基於不破壞觀眾的樂趣,劇情透露就到此為止;整體而言,《冥王計畫》是一部相當黑暗的作品,所以川村先生為《冥王計畫》所作的配樂也多半是表現出陰謀、哀傷與恐怖,在戰鬥的情境上則是以強烈的重低音電子音樂配合銅管表現,與《忍者戰士飛影》不同,《冥王計畫》的弦樂是標準交響樂團的演奏規模,而不是使用小提琴獨奏,這當然也有成本與效果的考量,效果上也較為豐富。

《冥王計畫》配樂中的主旋律只有一組,也是整部配樂中唯一比較沒有這麽負面情境的,就是主角機器人ゼオライマー出場的配樂,這段主旋律出現在兩段中,第一段是「覚醒、ゼオライマー」,在這段配樂中,川村先生首先是以很長的一段快節奏與鼓聲電子音樂來鋪陳敵方機器人戰鬥的優勢,接著加入逐漸玄秘詭譎的高音,在幾聲銅管漸升的音階後突然完全無聲,隨後以一段大提琴後引入以銅管演奏,氣勢雄壯的主旋律。

而在最後的戰鬥配樂「ゼオライマー、暁に出撃す」中,川村先生以完全不同的手法來處理這段主旋律,這首配樂以定音鼓低沉的鼓聲為開始,隨後在同樣的定音鼓伴奏下以弦樂演奏出這段主旋律,表現出沈重、悲壯而優美的氣氛,到了中段後一樣是一段無聲的暫停,接著是在高亢的銅管前奏下,改以小軍鼓的密集鼓聲伴奏下,同樣以弦樂演奏主旋律,而到了最後以弦樂加銅管的合奏完成整段旋律。

《冥王計畫》的主旋律對某些台灣的同好,尤其是會看布袋戲的同好應該不會太陌生,原因是從80年代後期開始,台灣有部分業者引進日本動畫的原聲帶,那時候台日雙方並沒有版權協議,取得的成本與售價也就相對低廉,那時候剛好也是霹靂布袋戲起飛的年代,很可能是其中有工作人員注意到這些配樂,所以在1989年霹靂布袋戲,刀狂劍癡葉小釵出場時,就使用了《冥王計畫》的這段主旋律,平心而論,這段旋律悲壯優美,與葉小釵還真的頗合,所以風行一時,只是當時除了少數人以外,大部分都以為是霹靂的原創音樂。

筆者並不想批評或辯護這樣的行為,畢竟時空背景不同,事過境遷,如今霹靂布袋戲也已經脫離過去低成本製作的年代,成為完整的台灣自製文創產業的代表作品,也希望在知道這些優美音樂背後故事的同時,能激勵台灣有更多更好的本土情境音樂創作者出現。

2017年6月16日 星期五

淺談古代CPU:副處理器的故事(3)

前情提要:
淺談古代CPU:副處理器的故事(1)
淺談古代CPU:副處理器的故事(2)

Intel在1980年公布了8087,隔年,也就是1981年八月,IBM PC問世,上面特別留了一個空的40 pin IC插座給8087,從此個人電腦終於跟以前那些「大型主機」一樣,擁有浮點運算的能力,也就在這一年,一家叫做Weitek的公司成立。

中文版的Wiki對Weitek的介紹有不少錯誤,首先,所謂「 三位自Intel公司離職的台灣工程師 所共創 」就錯了, 這三位都是HP Lab(Hewlett Packard Central Research Lab)出來的,Chi-Shin Wang( 王繼行 )是1967年台灣大學物理系畢業,後來到Standford念電機博士,台大物理學會在民國56年出版的《時空》第五期有他的文章,他後來在1987年自己開了一家IC設計公司叫IIT,後來改名叫8x8;IIT是頭幾個不靠逆向工程做出387相容浮點副處理器的廠商之一;Edmund Sun (孫燕生) 台灣出生,國立交通大學電子物理系58級畢業,1974年Caltech加州理工學院畢業,後來開了C-Cube,是硬體影像壓縮的先驅,後來還投資設立不少公司;Godfrey Fong (方端) 是總裁兼CEO, 1961-66 上海復旦大學半導體物理碩士,在Weitek之前,1974年他在Fairchild,,1981到HP Lab,這三位都沒待過Intel;另外有紀錄的還有G. Leonard (Len) Baker, Jr.,他是投資董事之一。

真正待過Intel的是這兩位:Stephen (Steve) Farnow,他在1979-1985是Intel DRAM部門的Manager , 1986 年到1990年擔任Weitek的VP;另外就是Everett Roach,他在1987到1991年擔任Weitek的Marketing Manager,在進Weitek之前,他是Intel的Marketing Manager,後來還擔任過Cyrix和NS(美國國家半導體)的VP,現在是Qualcomm的資深PM。

Weitek的創立目的本來是想做電腦繪圖,主要是CAD(電腦輔助設計)的相關系統,但是CAD需要強大的浮點運算, 於是他們從同樣是HP Lab找來一批設計浮點運算電路的專家,比較有名的是Fred Ware,美國專利局還有他們在Weitek時申請的浮點運算專利紀錄;結果系統還沒做,浮點運算器晶片已經先有了生意。

Intel推出8087只比8088晚了一年,剛好趕上IBM PC問世;1983年的80287也只比80286晚了一年;1985年80386問世,1986年Compaq就搶先推出了DeskPro 386,成為第一台相容IBM PC的386個人電腦,可是....80387到了1987年才出來,Weitek就趁這個時候搶先推出了可以搭配Deskpro 386的Weitek 1167,而且宣稱浮點運算速度是387的2-3倍。

1167其實是三顆晶片加上一片很大的電路板,然後再用一塊轉接板插到主機板的插座上,這三顆分別編號是WTL1163、1164和1165,1163是負責介面轉換的晶片,1164是浮點乘法器,1165是ALU;隔年Weitek就把這塊大板子縮成一顆IC,推出同樣用於386系統的3167,再隔一年,也就是1989年,當Intel推出80486DX時,Weitek同時推出Weitek 4167。
雖然同步推出,又號稱是387的幾倍速度,但是這是有代價的;首先,Intel不會這麼佛心的直接讓Weitek使用387的指令集,所以Weitek的副處理器指令集完全是獨立的,這表示軟體要另外修改;第二,Intel也不會讓Weitek使用386和387的專屬介面,怎麼辦呢?


Weitek 的工程師想出了一個絕妙的方法,首先,他們讓Weitek的副處理器同時接上386的位址和資料線(和287/387不同,他們不需要接位址線,但是跟8087很像),讓它變成386記憶體位址上的一個裝置;然後最妙的來了,Weitek把這32條位址線分成兩個部分:高位址A31-A25用來分辨自己跟其他記憶體位址的區別,低的16位元直接當作指令!

這是甚麼意思?意思是Weitek直接把比較高的記憶體位址佔下來,386的定址線是32bit,如果高位址是0xC000(其實就是A31-A25=1100000),Weitek就認定這是給它的指令,就會把低位址的16bit當作指令,另外資料線的32 bit就當作是資料;換句話說,在386來看,一個Weitek FPU 的指令其實就是一個記憶體的存取動作,也就是「mov addr , data」,mov的位址上半部是0xC000,下半部是FPU的指令編碼,而資料就是從暫存器過去。

可是這樣不就表示沒辦法裝4G的記憶體?別傻了,在那個時代,大部分主機板能夠裝到8MB記憶體已經是偷笑了,換句話說整個記憶體定址空間根本絕大部分都是空的,Weitek當然是老實不客氣的佔地為王。

不過Weitek的光輝年代並沒有太久,Intel在486時把浮點運算器整合到CPU裡面,所以速度變快,可是在CPU外面的4167就沒辦法享受到這個好處,另外,像Intel後來推出只有24條定址線的386SX,Weitek的架構就完全沒辦法使用;1989年的4167之後,Weitek就完全沒有在PC上推出新的浮點運算器;在其他平台上也遭遇到同樣的問題:當其他處理器都內建FPU時,外接FPU就毫無優勢可言,雖然到了90年代初開始轉做繪圖晶片,但是這時候為時已晚,1996年被Rockwell收購下市。

雖然Weitek的時代結束,但是這套直接使用CPU位址和資料線的招數倒是活了下來,在486出現後,ISA介面卡的速度和CPU差距越來越大,剛好那時候視訊繪圖對於頻寬的需求日益增加,有人就想到了同樣的招數,直接從CPU的位址和資料線下手,這就是後來的VL(Vesa-Local) Bus。

淺談古代CPU:副處理器的故事(2)


前情提要:淺談古代CPU:副處理器的故事(1)

8087並不是第一顆浮點運算器,甚至也不是第一顆浮點運算「微處理器」;早在1977年,AMD(別驚訝,AMD 1969年成立,只比Intel晚一年)就做了Am9511和Am9512算數運算器,Intel還跟AMD拿了這兩顆的授權,做了8231和8232,當作8080的副處理器,不過這幾顆運算器跟8087不太一樣,對於主CPU來說,它們只是一個單純的輸出入裝置,CPU只是把資料單純的送進去或讀出來,裡面做甚麼對CPU來說是完全無關的。



但是8087就不同了,作為8086的副處理器,8087基本上被看成是CPU的延伸,原則上,8087等於是「擴大」了8086的指令集,我們先花一點篇幅,提一下這個算是基本計算機概論的小常識:指令集。

之前在介紹32bit與4G的時候,我們曾經用黑盒子來概略描述CPU的行為,一個CPU如果當作一個黑盒子,它的行為基本上就是:向外界(基本上就是記憶體)輸出位址,然後存取資料。
現在這個黑盒子要再複雜一點:雖然還是一樣輸出位址給記憶體,從記憶體存取資料,但是對黑盒子內部來說,記憶體存取的東西分成兩種,分別是「指令」和「資料」。

電腦的另外一個名字叫「電子計算機」,顧名思義,電腦是用來計算的,要計算,需要告訴電腦兩件事:第一,做甚麼計算;第二,要被計算的數字;前者稱為指令,後者稱為資料。
很多人都用過算盤或是那種只有數字和加減乘除的掌上型計算機;當你要計算很多數字,例如把幾十個數字各自照公式計算然後平均等等,會怎麼做呢?首先,你要有張紙,上面記錄要計算的數字,以及計算的公式,你看一眼公式,把數字打進計算機或算盤,根據公式計算,然後把計算結果寫回那張紙,完成工作;恭喜你,你做的事情就是現代電腦所做的事情;那張紙就是記憶體,你和算盤或計算機做的事,就是CPU做的事。

電腦與過去那些簡單的計算機最大的不同,在於電腦可以把「如何計算」這個資訊變成一種可以存放在記憶體裡面的資料,這種資料有個特別的名稱叫「指令」,CPU就是從記憶體讀進指令,根據指令再從記憶體裡讀取資料,進行運算,或是把運算結果寫進記憶體,一個CPU可以接受的指令格式,稱為這個CPU的「指令集」。

為什麼要談這麼多基本常識?因為8086「認得」8087的指令;在8086的指令集中,8087的浮點運算指令開頭的第一個byte是11011xxx(xxx表示不固定),這個11011被稱為是ESC code(其實二進位11011就是ASCII code裡面的ESC代碼),8086讀取指令時,看到這個ESC就會知道「不是自己可以處理的指令」(x86的指令格式其實很複雜,如果想要了解全貌,可以參考http://ref.x86asm.net/ 這個網站)。

可是問題來了,8086是讀取了8087的指令後,才會知道「這不是我可以處理的」,問題是8087在8086「外面」,這時候該怎麼辦?再送出去給8087?
8086和8087的工程師想出了一個非常巧妙的方法,簡單的說,8086的接腳除了位址和資料線以外,還有一些額外的訊號線,8086用了一部份訊號線來表示「現在8086的行為」,例如「正在讀取指令」、「正在讀取資料」或是「寫資料到記憶體」等等。

如果各位去看8087的資料,會發現8087的腳位跟8086很像,實際上。8087跟8086大部分訊號線都接在一起,換句話說。8087可以「看」到8086大部分訊號,當8087看到8086正在讀取指令,而且指令的最前面是11011,它就知道這個指令是給它的,不需要另外再送訊號給8087,更妙的是,8086接到8087的指令後,如果這個指令的後段是要8087存取記憶體,8086收到後會把腳位訊號切換為記憶體存取(就是告訴記憶體「我要存取記憶體了」,然後停止動作(這有個專有名詞叫Dummy Read),讓8087接管這些訊號完成存取動作。

不過後來的80287和387就沒有像8087這樣的設計,而是完全等主CPU(286/386)讀進指令,解碼完畢後,再從資料線傳到副處理器,主CPU解碼完畢會再啟動一個I/O動作,286會對I/O位址0xF8、0xFA、以及0xFC輸出資料給287,而386則是0x800000f8 和0x800000fc,手冊裡還會特別聲明,希望程式不要自己去亂動這幾個I/O port位址,不過事實上287和387也不會去真的去看記憶體或是I/O的位址線(事實上它們的接腳裡面沒有位址線)就是了;為什麼不像8087那樣做呢?有個原因是8087的運作方式必須跟8086完全同步,287/387是可以跟主CPU頻率不同,另外一個原因是8087這種設計如果遇到浮點指令本身格式有錯時,8087解碼不出來,8086會一直等待下去,也就是會當掉,一般來說遇到這種情況,應該是CPU解碼後會丟出一個「例外狀況」,附帶一提,如果一個系統沒有裝浮點運算器,卻讀進浮點指令,也是要丟出一個「例外狀況」。

不管怎麼設計,在486之前,因為浮點運算器都是外接的,所以總是會有一些專用的訊號線讓這兩顆IC互相通訊,但是到了486,因為一開始就把浮點運算器和CPU整合成一顆,所以根本就沒有這樣的預留線路,可是後來(1991年中)Intel出了486SX(沒有浮點運算器的便宜版486)後,有些買了486SX的用戶發現沒有浮點運算很不方便要求升級方案時,這個問題就顯得很棘手,怎麼辦呢?Intel的辦法是:出一顆「完整的」486,但是腳位稍微改一下(其實只是多加一根腳),改個名字叫「487 SX」,當這顆晶片裝到主機板預留的腳位時,有一根線會把旁邊那顆486SX「整顆關掉」。

但是這還不是最機車的設計,大概在同一段時間前後(1990-1991),Intel為了應付某些386的用戶需要升級卻不想換主機板的需求,推出了一種稱為RapidCAD的處理器升級方案。

簡單的說, RapidCAD是一種「裝在386腳座上面的486」,晶片本身其實是個拿掉內建cache的486DX,但是對外的腳位完全是386,問題來了,386的浮點運算器80387是外接的,可是486DX的浮點運算器是內建的,怎麼辦呢?

Intel想出來的方法是:多做一顆「假的」387,事實上賣出來的RapidCAD一套有兩顆晶片,一顆稱為RAPIDCAD-1,腳位和386一樣,另外一顆稱為RAPIDCAD-2,腳位跟387一樣;那顆RAPIDCAD-2唯一的用途,是針對某些用來偵測「387存不存在」的腳位(精確一點的說,是FERR這隻腳),送出正確的訊號,讓主機板和處理器都「以為」387在上面,實際上卻是在CPU那邊。

 RapidCAD的整數效能其實並不好,受限於386匯流排的限制以及拿掉了那8K cache,整數效能大概只比同頻率的386高個10%而已,可是浮點運算就很威了,因為跟CPU在同一顆晶片,RapidCAD的浮點運算可以比387高70%,所以這顆其實是為急需浮點運算又不想花錢買整台486系統的386客戶量身打造的,這也是它名字的由來:Rapid"CAD",那個年代,最需要浮點運算的,除了科學研究以外,大概就是電腦輔助設計(CAD)了。


下次我們會來談談「傳說中的」Weitek 3167/4167。

淺談古代CPU:副處理器的故事(3)

淺談古代CPU:副處理器的故事(1)

很久很久以前,有個「寸gate寸金」的時代,一顆IC如果有上萬個電晶體,會被冠上「 超大型積體電路( VLSI)」的神聖稱號;在那個時代之前,一台電腦是一個房間裡的一堆機櫃,「一個CPU」是一塊甚至好幾塊電路板,直到1971年,有家公司叫Intel,把很多元件都塞在一個有2300顆電晶體的IC裡面,做出了史上第一個微處理器4004。

在那個年代,能夠把基本的整數運算功能放到CPU晶片裡,已經是很了不起的成就,不過隨著微處理器的演進,很快的,有很多客戶希望這些新一代的微處理器為中心的系統,可以把本來是「大型電腦」才有的運算能力放進去,問題是,買微處理器的客戶中,有這種需求的可能只有一小部份,可是又不能為這一小部份把這些要耗費大量電晶體的電路做進去,畢竟一片晶片做好以後是沒辦法加裝的,所以唯一的方法,就是另外做一種專用的元件,但是這種元件不能自己獨立運作,必須配合一般的微處理器,這種元件稱為副處理器,不需要的客戶不用多花錢,需要副處理器的客戶可以另外花錢加裝,兩全其美。

首先被規劃做成副處理器功能的是浮點運算,這裡先簡單的解釋一下,所謂的浮點數是一種特別的數字表示法,用來在一定的資料長度內,表示出精確度有限,但是大小範圍很大的數字,在科學運算上常常被用到,在微處理器出現前,很多大型電腦都有浮點運算的能力,不過大家各自有其浮點表示方式;1976年,Intel發表8086之後,就著手設計一款可以跟8086/88搭配的浮點運算器,這個計劃的主持人John Palmer 提議將這顆浮點運算器的數字格式和運算規則公開出來變成一個標準,於是Intel聘請加州大學柏克萊分校的教授William Kahan 作為顧問,向IEEE提交了第一個浮點運算標準,就是現在的IEEE-754,William Kahan教授也因為對於浮點運算標準化的貢獻,得到1989年的Turing Award。

Prof. William "Velvel" Morton Kahan
IEEE-754背後的八卦頗為精采;一開始制定時,主要成員都是當時開始做微處理器的新秀,除了主角Intel以外,Zilog、Motorola也都趕快過來參一腳,另外還有一個做「小型電腦」的 迪吉多(Digital Equipment Corporation,簡稱DEC) ,但是當時幾家大型和超級電腦的巨頭,像是Cray、CDC,根本看不起這些小角色,所以缺席了;雖然草案是Intel提議的,但是當時擁有廣大電腦市場的DEC也不是省油的燈,也根據他們現有的VAX上的浮點運算機制提出了一套草案,兩方以及其他搖擺不定的小廠就這樣開始大亂鬥,從1977年一直吵到1981年,最後剩下一個主要的爭論焦點: Denormal number。

一個「正規」浮點數基本上分成三個部份,首先是1 bit的正負號,接下來兩個部份稱為指數和尾數,指數用來表示數字的大小範圍,尾數則是數字的精確度,如果這兩個欄位都是0,就是「絕對0」,指數部份如果全部是1,表示是無限大或者「不是數字」,其他狀況下,指數基本上最小就是1(0x01),問題來了,有時候計算時會出現這種情況:指數是0,後面尾數卻不是0,這種情況稱為underflow,其實意思是:運算出來的這個數字非常接近0,近到無法用正規的浮點數來表示,這時候該怎麼處理呢?DEC的方法是直接當作0,Intel則是提出了一個很麻煩的方案:把這類數字特別處理,讓它可以表示比正規浮數字更接近0的範圍,這樣的數字就稱為Denormal number。(underflow會有什麼麻煩呢?明明 A>B,但是 A-B卻是0,這樣了解嗎?)

32 bit 浮點數格式


DEC的方法稱為abrupt underflow,而Intel的提案稱為gradual underflow,當時大部份電腦其實都用DEC的方法,因為比較快,但是Intel這方覺得這樣讓0到最小非0浮點數之間的差距太大;雙方各持己見,最後是在1981年,DEC聘請一位馬里蘭大學的錯誤分析專家 G.W. (Pete) Stewart III 教授替他們的方案辯護,但是仔細研究後,Stewart教授認為gradual underflow是較好的方法,勸DEC放棄,爭論總算平息下來,於是在1985年,IEEE-754-1985正式通過,成為浮點運算標準,但是在此之前Intel其實就已經先偷跑, Intel在1980年發表了8087,1983年發表了配合286的80287,這兩款浮點運算器其實還不是完全符合IEEE-754,直到1987年的80387才是第一個真正完全符合IEEE-754-1985標準的浮點運算器。


淺談古代CPU:32bit與4G?(2)

32位元與4GiB的太平歲月從386問世(1985)開始,差不多有10年的時間,直到Pentium Pro問世,Pentium Pro有36條定址線,所以最大可以存取的記憶體範圍是64GiB,這下子又回到了暫存器小於定址線的老問題,更麻煩的是,當初因為8086/286「本來」暫存器就比定址小,所以對應的機制是一開始就設計好的,問題是Pentium Pro的36 bit定址是後來加上去的,如果改動原來的存取機制,前面十年來為386、486寫的眾多程式還要不要活命?所以Intel的決定是:不改動原來程式的定址方式,麻煩的事情交給作業系統搞定。

在介紹Pentium Pro對付4G問題的機制前,我想應該先解釋計算機結構和作業系統都會提到的兩個名詞:「虛擬記憶體位址」和「實體記憶體位址」。

上次提過,如果把CPU當作一個抽象的黑盒子,這個黑盒子對外的行為就只有「存取記憶體」而已,不過實際的狀況下,一顆CPU會輪流跑很多獨立的程式,這時候出現一個問題,對記憶體來說,它只知道對應送來的位址,準備好要存取的資料,但是不會分辨是哪個程式的,換句話說,整個記憶體對這些程式來說是完全一樣的,你的資料我看得到,我的資料你也可以改,這樣不太好。

所以後來有人想出一種解套的方法,簡單的說,就是在黑盒子外面再包上一層黑盒子,把裡層黑盒子放出來的記憶體位址「攔截」下來,經過另外轉換後才變成真正去存取記憶體的位址,對裡層黑盒子執行的程式來說,並不會感覺到有什麼不同,而控制外層黑盒子的程式,可以對每個裡層程式的位址做出適當的轉換,讓它們每個都覺得自己才是記憶體的唯一擁有者。

在這種機制下,每個程式自己所存取的記憶體位址,叫做「虛擬記憶體位址」,而實際上真正的記憶體位址當然就叫做「實體記憶體位址」,負責轉換這兩種位址的,是CPU裡面一個特別的單元,通常稱為Memory Management Unit,記憶體管理單元,簡稱MMU,不是每個CPU都有這種機制,舉個例子,Intel 8088/86就沒有;另外有些CPU是把MMU當作另外一種「副處理器」,要另外安裝或是當作選項;另外,控制MMU的相關程式,通常是作業系統的一部份,所以兩個名詞在作業系統教科書上也看得到。

為什麼要談這個?因為Intel在32位元系統上企圖解決4G問題時,並不是讓程式「直接」就可以定址超過4G記憶體,而是去修改MMU轉換位址的機制;換句話說,對「單一程式」來說,直接可以存取的記憶體定址空間還是只有4GBytes,但是作業系統可以讓多個程式在一個比4G大的記憶體空間上並存,所以虛擬記憶體位址還是只有4GBytes,但是實體記憶體位址擴大了。

Intel有提供兩套擴展記憶體定址的機制,一套叫「實體位址擴展 」(PAE,Physical Address Extension),另外一套叫PSE-36 (36-bit Page Size Extension),因為是淺談,所以詳細的機制就省略不提,有興趣的可以直接找維基百科或是Intel的官方文件;目前的作業系統多半支援PAE,支援PSE-36的比較少;32位元的ARM上面有類似的機制,稱作LPAE(Large Physical Address Extension)。

剛剛的MMU還有後續,回想上面提過的黑盒子,我們一直假設只有CPU會去存取記憶體,其實不一定,聽過「DMA」(Direct Memory Access)和「Bus Mastering」嗎?一般來說,CPU與I/O裝置溝通有兩類方法,一類是「CPU主動」,也就是程式主動去存取I/O裝置,就像是存取記憶體一樣;另外一類是「I/O裝置主動」,這時候I/O裝置就跟CPU一樣,可以主動存取記憶體;不過古早以前,I/O裝置在存取記憶體的時候是當作「實體記憶體定址」來做的,以前是沒有什麼問題,但是當大家引入「虛擬化」的時候就成了大問題,因為虛擬化的時候。這些I/O裝置一樣要被虛擬化,可是它們存取資料的時候就露餡了,所以後來AMD才提出IOMMU這個機制,其實也就是讓I/O裝置跟CPU裡面一樣,存取記憶體時另外有MMU轉換位址。

其實關於32bit和4G還有不少有趣的故事,不過現在大部分都進入64位元時代,只能當作考古,至於64 bit以後還會不會出現類似的狀況,我想有點難,畢竟64位元定址空間並不是32位元的兩倍,而是一個很大的天文數字,不過....誰知道呢?

所以回到一開始那個問題「 在 32 位元 CPU 中,如果單純以 CPU 做記憶體定址時,4GiB 為其極限。 」在x86上,這個敘述的確不能算錯,但是這不是因為「32位元 CPU做不到」,而是Intel和AMD不想做。

淺談古代CPU:32bit與4G?(1)

在 32 位元 CPU 中,如果單純以 CPU 做記憶體定址時,4GiB 為其極限。 」這是某個網站對新處理器「深入分析」文章中出現的敘述。

這句話倒底對不對呢?這就是以下要討論的,其實這些都是很基本的計算機結構常識;首先我們從定義開始:什麼是CPU的「bit數」?CPU的「記憶體定址」又是什麼?

雖然幾十年前對這個定義有不少爭論,不過現在一般來說,一個CPU架構裡的「bit數」,通常從程式觀點來看,指的是「整數暫存器的bit數」,也就是一個整數指令能夠運算的最大位元長度,舉例來說,以前8088/8086和286,整數暫存器最大就是16位元。所以是16位元處理器,80386/486暫存器可以到32位元,所以是32位元處理器,沒有任何問題。

可是「記憶體定址」是另外一回事, 什麼是「記憶體定址」?如果把裡裡外外所有繁瑣的細節都省略,當作一個抽象的個體來看,CPU就是一個可以輸入或輸出(為了方便,以下把輸出和輸入簡稱為讀寫,讀是輸入,寫是輸出)資料的黑盒子,而這個黑盒子從「哪裡」讀寫資料?這個「哪裡」就是記憶體,當然這是個抽象的描述,有些人可能會爭辯還有I/O等等,但是對程式或CPU來說那還是一種「記憶體」。

CPU讀寫資料的大小是有限的,更進一步來說,CPU能夠「從多大的範圍讀寫資料」也是有限制的,回到剛剛的黑盒子,CPU如何決定從「哪裡」存取資料?答案是:CPU會先寫出一串資料,這串資料稱為「位址(address)」,這串資料是有大小限制的,如果是32bit,表示CPU只能從2^32這麼大的範圍內選一段讀寫,一段的基本單位通常是byte(當然,也會有例外),古早的CPU通常會特別有一組訊號線來表示這串資料,這組訊號叫「定址線」,所以32條定址線,基本單位byte,表示這顆CPU只能從2^32 = 4 giga byte = 4GiB大小的空間中讀寫資料,也就是說記憶體定址空間是 4 GiB。

所以32位元CPU的記憶體定址就是4 GiB?

回答這個問題之前,請先容我反問一下,如果上面的敘述成立,請問16位元的CPU,記憶體定址應該是多大?2^16 = 64K byte?

別傻了,就拿剛剛舉過的例子,Intel 8088/8086有20條定址線,80286有24條定址線,所以一個是1MB,一個是16MB,隨便哪一個都超過64K。

問題出在哪裡?問題在於,整數暫存器的大小,跟記憶體定址線的大小,這兩個本來就是互相獨立的參數,上面的8086和286就是個例子,只是x86進入32位元時代後,剛好386、486到Pentium都是位元數等於定址線數,也就是暫存器32位元,定址線也剛好是32位元,如此而已。

問題又來了,如果一顆CPU的整數運算大小比定址線還小,那程式怎麼存取記憶體?這也是個好問題,答案是:看指令集怎麼規定;拿8086來說,它有幾個特別的暫存器,牽涉到記憶體存取的指令時,CPU真正計算位址的方法是:把這些暫存器的值,跟你的指令裡面指定位址的值拿來一起計算,最後產生的才是20位元的記憶體位址;到了286時比較複雜,某個暫存器會指到某張表,表裡面的數字跟暫存器的數字一起計算等等等等,其他處理器可能有其他方法,但是總而言之言而總之,有太多太多方法可以讓程式在存取記憶體時,可以不用受限於一個整數暫存器的大小。

所以一切的謎底都解開了嗎?也不盡然如此,在386之前,這種不太直觀的記憶體存取機制,對程式設計師來說其實很麻煩,所以從386開始,暫存器和定址線就一樣是32位元,程式可以擺脫那些麻煩的機制,就這樣過了很長的一段太平日子,因為太平日子過太久,所以大家都忘記了過去那段苦日子,以為32位元就等於4G記憶體定址。

不過太平日子其實也是會過去的,故事還沒完,我們下期待續。