亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 一幅圖讓你徹底明白虛擬地址與物理地址的映射關(guān)系 [打印本頁]

作者: ywf851207    時(shí)間: 2011-01-05 20:29
標(biāo)題: 一幅圖讓你徹底明白虛擬地址與物理地址的映射關(guān)系

這是今天在一本書上面看到的的圖,以前就是不明白虛擬地址和物理地址是什么關(guān)系,后來是看了內(nèi)核情景分析才弄明白。要是早看到這么形象的圖,就容易理解多了。所以馬上自己照著畫了一遍,跟大家分享。
作者: ywf851207    時(shí)間: 2011-01-05 20:30
圖看上去有點(diǎn)不清楚,點(diǎn)擊放大了以后就比較清楚了。
作者: scutan    時(shí)間: 2011-01-05 21:24
呵呵,樓主看的哪本書?
作者: wzypunk    時(shí)間: 2011-01-05 23:35
宏觀圖,呵呵,感覺微觀圖比較復(fù)雜
作者: dreamice    時(shí)間: 2011-01-06 09:02
這是今天在一本書上面看到的的圖,以前就是不明白虛擬地址和物理地址是什么關(guān)系,后來是看了內(nèi)核情景分析 ...
ywf851207 發(fā)表于 2011-01-05 20:29



    沒太看明白。
沒讓大家看你頭像的這幅圖就好了
作者: wloveg    時(shí)間: 2011-01-06 09:15
本帖最后由 wloveg 于 2011-01-06 09:18 編輯
呵呵,樓主看的哪本書?
scutan 發(fā)表于 2011-01-05 21:24



    應(yīng)該是《ARM嵌入式系統(tǒng)開發(fā)-軟件設(shè)計(jì)與優(yōu)化》這本,第14章479頁,我看了一些,還不錯(cuò)!
作者: wsw1wsw2    時(shí)間: 2011-01-06 09:52
“虛擬存儲器件”如果改成“虛擬地址空間”我覺得更加能表達(dá)意思。因?yàn)椤捌骷笨偸亲屓擞X得是物理實(shí)在的東西,而“空間”更加傾向于邏輯思想。
作者: amarant    時(shí)間: 2011-01-06 10:25
挺好的,只是有點(diǎn)不足的是。。這會(huì)讓讀者誤解認(rèn)為每個(gè)任務(wù)的物理存儲地址是獨(dú)立的
作者: jerometao    時(shí)間: 2011-01-06 11:23
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: Godbach    時(shí)間: 2011-01-06 11:35
沒太看明白。

LZ 這里的三個(gè)任務(wù)是同時(shí)再進(jìn)行嗎?
作者: wzypunk    時(shí)間: 2011-01-06 13:01
樓主應(yīng)該是想說每個(gè)進(jìn)程都有自己的虛擬地址空間和頁表吧
作者: L_kernel    時(shí)間: 2011-01-06 13:26
“虛擬存儲器件”如果改成“虛擬地址空間”我覺得更加能表達(dá)意思。因?yàn)椤捌骷笨偸亲屓擞X得是物理實(shí)在的東 ...
wsw1wsw2 發(fā)表于 2011-01-06 09:52
我一直認(rèn)為的都是虛擬地址空間,怎麼又搞出了一個(gè)虛擬存儲器件來了?這個(gè)寫出的,哎~~
作者: L_kernel    時(shí)間: 2011-01-06 13:27
圖看上去有點(diǎn)不清楚,點(diǎn)擊放大了以后就比較清楚了。
ywf851207 發(fā)表于 2011-01-05 20:30
即使這樣子,還是看得不太明白的。
作者: vivisunjianwei    時(shí)間: 2011-01-06 19:03
這個(gè)圖里的虛擬存儲器件就換成虛擬地址

物理存儲器件就換成物理地址
作者: ywf851207    時(shí)間: 2011-01-09 17:15
求樓主頭像大圖
jerometao 發(fā)表于 2011-01-06 11:23



呵呵 看來還是腿比較有誘惑力啊。。。。
作者: jcz37489    時(shí)間: 2011-01-09 22:00
回復(fù) 1# ywf851207


    不明白啊,各自進(jìn)程的虛擬地址一樣的,所對應(yīng)的物理地址不一樣,是這意思吧,這圖也分得太開了吧。
作者: wenny198561    時(shí)間: 2011-01-10 09:51
Ding
作者: omycle    時(shí)間: 2011-01-10 11:21
LZ LOGO很好。

感謝lz分享學(xué)習(xí)的快樂。雖然這個(gè)圖說明不了問題,但是你的心意哥哥們還是懂得的。
作者: ywf851207    時(shí)間: 2011-01-11 18:41
回復(fù) 16# jcz37489


    呵呵 就是這個(gè)意思,呵呵。我是初學(xué)者呵呵,比較菜。賺點(diǎn)人氣,以后多多向哥哥們學(xué)習(xí)。。。。{:2_168:}
作者: ywf851207    時(shí)間: 2011-01-11 18:42
回復(fù) 14# vivisunjianwei


    有道理 真是誤人子弟了啊 呵呵
作者: ywf851207    時(shí)間: 2011-01-11 20:19
本帖最后由 ywf851207 于 2011-01-11 20:25 編輯
  1. #define DEVICE_NAME "GPIO-Control"

  2. #define IOCTL_GPIO_ON        1
  3. #define IOCTL_GPIO_OFF        0

  4. static unsigned long gpio_table [] =
  5. {
  6.         S3C2410_GPB5,
  7.         S3C2410_GPB6,
  8.         S3C2410_GPB7,
  9.         S3C2410_GPB8,
  10. };

  11. static unsigned int gpio_cfg_table [] =
  12. {
  13.         S3C2410_GPB5_OUTP,
  14.         S3C2410_GPB6_OUTP,
  15.         S3C2410_GPB7_OUTP,
  16.         S3C2410_GPB8_OUTP,
  17. };

  18. static int tq2440_gpio_ioctl(
  19.         struct inode *inode,
  20.         struct file *file,
  21.         unsigned int cmd,
  22.         unsigned long arg)
  23. {
  24.         if (arg > 4)
  25.         {
  26.                 return -EINVAL;
  27.         }

  28.         switch(cmd)
  29.         {
  30.                 case IOCTL_GPIO_ON:
  31.                         s3c2410_gpio_setpin(gpio_table[arg], 0);
  32.                         return 0;

  33.                 case IOCTL_GPIO_OFF:
  34.                         s3c2410_gpio_setpin(gpio_table[arg], 1);
  35.                         return 0;

  36.                 default:
  37.                         return -EINVAL;
  38.         }
  39. }

  40. static struct file_operations dev_fops = {
  41.         .owner        =        THIS_MODULE,
  42.         .ioctl        =        tq2440_gpio_ioctl,
  43. };

  44. static struct miscdevice misc = {
  45.         .minor = MISC_DYNAMIC_MINOR,
  46.         .name = DEVICE_NAME,
  47.         .fops = &dev_fops,
  48. };

  49. static int __init dev_init(void)
  50. {
  51.         int ret;

  52.         int i;
  53.        
  54.         for (i = 0; i < 4; i++)
  55.         {
  56.                 s3c2410_gpio_cfgpin(gpio_table[i], gpio_cfg_table[i]);
  57.                 s3c2410_gpio_setpin(gpio_table[i], 0);
  58.         }

  59.         ret = misc_register(&misc);

  60.         printk (DEVICE_NAME" initialized\n");

  61.         return ret;
  62. }

  63. static void __exit dev_exit(void)
  64. {
  65.         misc_deregister(&misc);
  66. }

  67. module_init(dev_init);
  68. module_exit(dev_exit);

  69. MODULE_LICENSE("GPL");
  70. MODULE_AUTHOR("www.embedsky.net");
  71. MODULE_DESCRIPTION("GPIO control for EmbedSky SKY2440/TQ2440 Board");
復(fù)制代碼
我在這個(gè)LED驅(qū)動(dòng)程序中怎么沒有看到虛擬地址到物理地址的映射啊,我覺得應(yīng)該有一個(gè)ioremap()才對啊,怎么沒有呢?為了不耽誤大家逛MM論壇的時(shí)間,先發(fā)張MM圖。。。。
作者: ywf851207    時(shí)間: 2011-01-11 21:44
從線性地址到物理地址的轉(zhuǎn)換,實(shí)際上是一種映射。所有進(jìn)程的3~4G的線性地址實(shí)際上是映射到相同的物理地址的。這一點(diǎn)不多說了。為了方便起見, 3~4G的線性地址與對應(yīng)的物理地址基本上是呈線性關(guān)系的。即線性地址=物理地址+3G。但是如果把這1G的線性地址都簡單地處理為對應(yīng)物理地址+3G,就會(huì)有新的問題產(chǎn)生。例如,如果物理地址大于4G,那么內(nèi)核就沒法訪問這些地址了。所以,內(nèi)核必須要從這1G的線性空間中預(yù)留一部分,作其它用途,(例如,映射高端物理地址)。經(jīng)過實(shí)踐,發(fā)現(xiàn)128M線性地址夠用了。所以,3~4G的線性地址中896M映射到物理地址中的0~896M,剩下的128M挪作它用,例如,內(nèi)核空間的非線性映射(在vmalloc中使用)以及高于4G的物理地址的映射。
        我曾經(jīng)產(chǎn)生過的疑問:
        1.如果物理內(nèi)存小于896M,那不是所有的物理地址都被內(nèi)核用完,沒有內(nèi)存留給用戶空間了么?
        事實(shí)上,小于896M時(shí),同一塊物理內(nèi)存可能同時(shí)被映射到用戶空間和內(nèi)核空間,從數(shù)學(xué)的角度來講,也就是所謂的“雙箭一雕”。我們相信內(nèi)核是沒有bug的,所以不用擔(dān)心因此產(chǎn)生的內(nèi)核對用戶空間數(shù)據(jù)破壞的可能性。
        2.如果物理內(nèi)存小于896M,所有物理內(nèi)存地址都與內(nèi)核線性地址相差3G,那vmalloc不是沒有內(nèi)存使用了么?
        不使用vmalloc當(dāng)然是不可能的,因?yàn)槟K裝載時(shí)就會(huì)用到vmalloc。原理與問題1一樣,即使在內(nèi)核空間,也可能多個(gè)線性地址映射到同一個(gè)物理地址,也就是“雙箭一雕”。所以vmalloc仍然能獲得相應(yīng)的物理內(nèi)存。
        對以上兩個(gè)問題的小結(jié)。系統(tǒng)在啟動(dòng)時(shí)會(huì)把前896M物理地址映射到3G以上的線性空間。但是映射不等于使用。事實(shí)上內(nèi)核只使用了很小一部分(一般才幾M)。只要有足夠的未使用的物理內(nèi)存,用戶進(jìn)程和vmalloc都不會(huì)有問題。
        3.如果物理內(nèi)存大于896M。那對內(nèi)核而言不是無法在同一時(shí)刻訪問所有的物理內(nèi)存了么?
        是的,雖然內(nèi)核可以通過臨時(shí)映射和永久映射來訪問所有的物理內(nèi)存,但是用到的線性地址很有限,即一次只能訪問一小部分物理內(nèi)存。當(dāng)無法訪問到更高地址物理內(nèi)存時(shí),只能通過修改內(nèi)核頁表來達(dá)到目的。但是,這對內(nèi)核就足夠了。因?yàn)樯厦嬲f過,內(nèi)核所需要的內(nèi)存很少。內(nèi)核只是偶爾會(huì)訪問一下高端內(nèi)內(nèi)存。而對于用戶進(jìn)程而言,只要頁表開啟了PAE,就可以訪問64G以內(nèi)的物理內(nèi)存(雖然只有4G的線性空間,但是也足夠了。)
        4.內(nèi)核頁表是如何共享的呢?
        我們知道所有的進(jìn)程共享內(nèi)核空間,所以共享內(nèi)核頁表是很自然的事。理論上內(nèi)核只有一個(gè)頁表,對應(yīng)的內(nèi)核全局頁目錄swapper_pg_dir,所有進(jìn)程的頁目錄的最高256項(xiàng)與swapper_pg_dir相同?上У氖,每個(gè)進(jìn)程有自己的頁目錄,共1024項(xiàng)。其中最高的256項(xiàng)指向的是內(nèi)核空間。盡管這些頁目錄項(xiàng)可以指向同樣的內(nèi)核頁表,但是一旦內(nèi)核頁目錄改變了,所有進(jìn)程的頁目錄都需要同步。這種情況是存在的。比如內(nèi)核調(diào)用vmalloc時(shí)。
        幸虧有了頁錯(cuò)誤,我們可以從容地處理頁目錄的同步。如果內(nèi)核調(diào)用了vmalloc,內(nèi)核只修改內(nèi)核全局頁目錄。當(dāng)其它進(jìn)程訪問vmalloc產(chǎn)生的線性空間時(shí),會(huì)產(chǎn)生頁錯(cuò)誤。頁錯(cuò)誤處理程序可以判斷當(dāng)前的頁錯(cuò)誤是由于vmalloc產(chǎn)生的,于是修改對應(yīng)的頁目錄,使它們與內(nèi)核全局頁目錄保持一致。
作者: duanius    時(shí)間: 2011-01-12 10:19
求樓主頭像大圖
jerometao 發(fā)表于 2011-01-06 11:23



    同求,最好是仰視角度
作者: sky-鵬    時(shí)間: 2011-01-14 12:00
沒整明白
作者: stoneyzjw    時(shí)間: 2011-01-25 13:30
看看操作系統(tǒng)原理就明白了。
作者: amarant    時(shí)間: 2011-01-25 14:22
22樓的總結(jié)非常好啊。好多問題我也困惑了很久。
作者: amarant    時(shí)間: 2011-01-25 14:40
我在這個(gè)LED驅(qū)動(dòng)程序中怎么沒有看到虛擬地址到物理地址的映射啊,我覺得應(yīng)該有一個(gè)ioremap()才對啊,怎么 ...
ywf851207 發(fā)表于 2011-01-11 20:19



    你看看S3C2410_GPB5_OUTP的定義吧。

    我拿一個(gè)我這里的定義,不知道跟你是不是一樣,我覺得應(yīng)該有一個(gè)地方把這里映射到了寄存器上了。我再仔細(xì)看看arm啟動(dòng)分析去


#define S3C64XX_GPCCON                  (S3C64XX_GPC_BASE + 0x00)
#define S3C64XX_GPC_BASE        (S3C64XX_VA_GPIO + 0x0040)
#define S3C64XX_VA_GPIO         S3C_ADDR(0x00500000)
#define S3C_ADDR(x)     ((void __iomem __force *)S3C_ADDR_BASE + (x))

/* Fit all our registers in at 0xF4000000 upwards, trying to use as
* little of the VA space as possible so vmalloc and friends have a
* better chance of getting memory.
*
* we try to ensure stuff like the IRQ registers are available for
* an single MOVS instruction (ie, only 8 bits of set data)
*/

#define S3C_ADDR_BASE   (0xF4000000)
作者: shenyanxxxy    時(shí)間: 2011-02-01 17:03
宏觀上可以這么理解吧。言簡易懂
作者: mi_zy    時(shí)間: 2011-02-02 17:26
回復(fù) 1# ywf851207


   
作者: 東方云濱    時(shí)間: 2012-06-27 17:08
怎么看不見圖啊啊
作者: lelee007    時(shí)間: 2014-08-28 18:18
22樓講解很到位




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2