2017-06-05 115 views
-3

那麼,我試圖找到一個彙編指令,將整個指令移動到一個特定地址(與指令大小無關)。如果沒有這樣的指令,有沒有人可以給我一些關於如何在沒有系統調用或其他軟件的情況下實現多線程的想法?換句話說,讓我們假設我正在創建自己的操作系統,如何使用匯編中的高效代碼啓用多線程?Asm:將彙編指令移動到特定地址

+0

爲什麼你會認爲多線程*要求*指令已被移動到單個指令中? – EOF

+0

@EOF如何實現? –

+1

在一些具有固定大小指令的體系結構(如ARM(A32和AArch64),POWER MIPS等)上,這非常簡單。在這樣的體系結構中,您只需加載/存儲一個32位定點數。再次說明,這可能與多線程相關的原因尚不清楚。 – EOF

回答

0

重新討論如何在原始程序集中實現多線程:現代32位x86處理器支持任務切換的硬件。您可以使用它來實現多任務(具有不同地址空間的多個進程)和/或多線程(多個執行線程在一個進程中)。

此功能記錄在Intel 64 and IA-32 Architectures Software Developer's Manual第3卷第7章任務管理中。 注意:閱讀&瞭解這個可笑的密集4700頁文件可能需要12壽命。

使用此硬件支持是使某些內容運行的最直接的方式,但可能不是最有效的方式。早期的基於x86的操作系統已從此轉向手動任務切換。這使得系統可以實現非CPU提供的開關功能,並且在全開關過度消耗時執行優化的開關。該方法非常普遍,x86處理器的64位長模式降低了對硬件任務管理的支持。現代操作系統使用手動任務切換。


再移動指令的方式來實現多線程的想法,我想在這裏你的概念是走動的地址空間代碼時,切換到新的代碼是必要的。有兩種替代技術可以消除這種需要。

首先,代替移動代碼,您可以跳轉到不同位置的代碼。早期的多任務操作系統如PDP-11上的Unix使用了這種技術。您可以將所有活動的程序加載到不同位置的內存中,設置一個週期性中斷,以便每隔一段時間將控制權降至系統軟件,並在每次中斷時選擇下一個要跳轉到的程序。系統應該跟蹤每個程序停止的位置,以便它可以在同一個地方恢復。

第二種方法取決於虛擬內存。仍然有一個物理內存空間。最重要的是,定義了多個「虛擬」內存空間。在任何時候,只有1個虛擬內存空間處於活動狀態。只要訪問內存,系統就會將虛擬地址轉換爲某個物理地址。訪問內存的程序只能看到自己的虛擬地址空間。

每個任務都有自己的地址空間。當切換到新任務時,系統激活其專用地址空間,然後在專用地址空間中上次暫停的地方繼續執行。您不必在共享地址空間中移動任何東西,甚至不必在共享地址空間中從一個地方跳到另一個地方,而是實際定義一整組單獨的地址空間。必要時您可以進入新的空間。

現代多線程很大程度上依賴於這種方法。每個進程都有一個私有地址空間;系統會根據需要進行切換。一個進程將有1個以上的線程。進程中的每個線程共享相同的地址空間。然後,每個線程存儲的所有內容都是上次暫停執行的位置。在同一進程中切換到新線程會保留當前地址空間,並在其中跳至新線程上次暫停的位置。


關於如何移動指令的問題,彙編語言不提供這樣的能力。這不是一件常見的事情。如果你想在內存中使用機器代碼,你可能會想要使用像Intel X86 Encoder Decoder library這樣的庫。像這樣的庫具有存在的指令和機器碼的字節格式的知識。這使得它能夠將一系列字節解釋爲指令。

一旦您意識到以下指令有多大,移動該數量的字節在彙編中是一件容易的事情。在x86中,您可以使用mov指令。

+0

你提到了週期性中斷!我怎樣才能做到這一點?我的意思是如何讓CPU每5毫秒運行一組特定的代碼(例如中斷)? –

+0

@Anastassis適當地編程你的定時器芯片。 – fuz

+0

@fuz謝謝! –