2014-03-01 52 views
-4

假設一個系統有一個具有8-kb頁面大小的64位虛擬地址。寫一個C-程序 ,它在命令行中傳遞一個虛擬地址(十進制),並讓它輸出給定地址的頁數 數字和偏移量。舉個例子,你的程序將運行如下: ./a.out 8219986 程序將輸出: 地址8219986包含: 頁碼:1003 偏移= 3410 所有的計算必須以二進制形式進行。解釋發生了什麼(C程序)

#include <stdio.h> 
int main(int argc,char *argv[]) 
{ 
    unsigned long long int MappedAdress = atoll(argv[1]); 
    unsigned long long int page = MappedAdress; 
    unsigned long long int offset = MappedAdress; 
    //print long long address 
    printf("The MappedAdress %llu contains:\n",MappedAdress); 
    //shift to right 13 bit to retrive pages, then print 
    page = page >> 13; 
    printf("Page Number : %llu\n",page); 
    //since it's 64-bit opr. Add offset AND 1FFF , 
    offset = offset & 0x1FFF; 
    //print the offset 
    printf("Offset = %llu\n\n",offset); 
    return 0; 
} 

任何人都可以向我解釋剛剛發生的事情嗎?以及如果我沒有C語言背景,我該如何編寫這樣的程序,但是用Java編寫?

+0

該代碼沒有什麼奇特的事情發生。如果你根本不認識C,拿起一本書。至於翻譯爲Java:請首先嚐試自己實現這一點。如果卡住了,請顯示您擁有的Java代碼。 – Mat

+3

查看C中的>>和'&'運算符,以及'8-kb'或8192與'13'有什麼共同之處。然後,您應該能夠完成作業。提示 - Java中的操作符非常相似。 –

回答

0

任何人都可以向我解釋剛剛發生的事情嗎?

粗略地講,在轉換的地址的64位虛擬地址的虛擬頁號和偏移,使用右移位運算符(>>)和位AND運算符(&)。

只要我沒有C語言背景,我該怎麼做才能編寫這樣的程序,但用Java編寫?

你應該做的是閱讀您的Java教材或講義,以找出有關>>&運營商(整數操作數),和他們做什麼。然後用Java編寫相應的代碼。

提示:

  1. >>和位&運營商意味着幾乎在C和Java一樣的東西。
  2. 您應該也可以閱讀講師筆記,講解員講解虛擬地址及其工作原理。
0

LEt返回到問題陳述:給定一個64位數字,表示具有8K大小頁面的計算機上的字節地址,返回該地址的頁碼和偏移量。

這僅僅意味着你得到數字/ 8K來獲得頁面地址,餘數是偏移量。當然,這通常可以通過使用右移來獲得頁碼和掩碼來獲得偏移量(但是處理64位數字中的前導「1」位)來更快地計算。

您不需要C程序來弄清楚如何將64位數字分解爲兩個所需的部分。

相關問題