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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: ywf851207
打印 上一主題 下一主題

一幅圖讓你徹底明白虛擬地址與物理地址的映射關(guān)系 [復(fù)制鏈接]

論壇徽章:
0
21 [報告]
發(fā)表于 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ù)制代碼
我在這個LED驅(qū)動程序中怎么沒有看到虛擬地址到物理地址的映射啊,我覺得應(yīng)該有一個ioremap()才對啊,怎么沒有呢?為了不耽誤大家逛MM論壇的時間,先發(fā)張MM圖。。。。

論壇徽章:
0
22 [報告]
發(fā)表于 2011-01-11 21:44 |只看該作者
從線性地址到物理地址的轉(zhuǎn)換,實際上是一種映射。所有進程的3~4G的線性地址實際上是映射到相同的物理地址的。這一點不多說了。為了方便起見, 3~4G的線性地址與對應(yīng)的物理地址基本上是呈線性關(guān)系的。即線性地址=物理地址+3G。但是如果把這1G的線性地址都簡單地處理為對應(yīng)物理地址+3G,就會有新的問題產(chǎn)生。例如,如果物理地址大于4G,那么內(nèi)核就沒法訪問這些地址了。所以,內(nèi)核必須要從這1G的線性空間中預(yù)留一部分,作其它用途,(例如,映射高端物理地址)。經(jīng)過實踐,發(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)存留給用戶空間了么?
        事實上,小于896M時,同一塊物理內(nèi)存可能同時被映射到用戶空間和內(nèi)核空間,從數(shù)學(xué)的角度來講,也就是所謂的“雙箭一雕”。我們相信內(nèi)核是沒有bug的,所以不用擔心因此產(chǎn)生的內(nèi)核對用戶空間數(shù)據(jù)破壞的可能性。
        2.如果物理內(nèi)存小于896M,所有物理內(nèi)存地址都與內(nèi)核線性地址相差3G,那vmalloc不是沒有內(nèi)存使用了么?
        不使用vmalloc當然是不可能的,因為模塊裝載時就會用到vmalloc。原理與問題1一樣,即使在內(nèi)核空間,也可能多個線性地址映射到同一個物理地址,也就是“雙箭一雕”。所以vmalloc仍然能獲得相應(yīng)的物理內(nèi)存。
        對以上兩個問題的小結(jié)。系統(tǒng)在啟動時會把前896M物理地址映射到3G以上的線性空間。但是映射不等于使用。事實上內(nèi)核只使用了很小一部分(一般才幾M)。只要有足夠的未使用的物理內(nèi)存,用戶進程和vmalloc都不會有問題。
        3.如果物理內(nèi)存大于896M。那對內(nèi)核而言不是無法在同一時刻訪問所有的物理內(nèi)存了么?
        是的,雖然內(nèi)核可以通過臨時映射和永久映射來訪問所有的物理內(nèi)存,但是用到的線性地址很有限,即一次只能訪問一小部分物理內(nèi)存。當無法訪問到更高地址物理內(nèi)存時,只能通過修改內(nèi)核頁表來達到目的。但是,這對內(nèi)核就足夠了。因為上面說過,內(nèi)核所需要的內(nèi)存很少。內(nèi)核只是偶爾會訪問一下高端內(nèi)內(nèi)存。而對于用戶進程而言,只要頁表開啟了PAE,就可以訪問64G以內(nèi)的物理內(nèi)存(雖然只有4G的線性空間,但是也足夠了。)
        4.內(nèi)核頁表是如何共享的呢?
        我們知道所有的進程共享內(nèi)核空間,所以共享內(nèi)核頁表是很自然的事。理論上內(nèi)核只有一個頁表,對應(yīng)的內(nèi)核全局頁目錄swapper_pg_dir,所有進程的頁目錄的最高256項與swapper_pg_dir相同?上У氖,每個進程有自己的頁目錄,共1024項。其中最高的256項指向的是內(nèi)核空間。盡管這些頁目錄項可以指向同樣的內(nèi)核頁表,但是一旦內(nèi)核頁目錄改變了,所有進程的頁目錄都需要同步。這種情況是存在的。比如內(nèi)核調(diào)用vmalloc時。
        幸虧有了頁錯誤,我們可以從容地處理頁目錄的同步。如果內(nèi)核調(diào)用了vmalloc,內(nèi)核只修改內(nèi)核全局頁目錄。當其它進程訪問vmalloc產(chǎn)生的線性空間時,會產(chǎn)生頁錯誤。頁錯誤處理程序可以判斷當前的頁錯誤是由于vmalloc產(chǎn)生的,于是修改對應(yīng)的頁目錄,使它們與內(nèi)核全局頁目錄保持一致。

論壇徽章:
0
23 [報告]
發(fā)表于 2011-01-12 10:19 |只看該作者
求樓主頭像大圖
jerometao 發(fā)表于 2011-01-06 11:23



    同求,最好是仰視角度

論壇徽章:
0
24 [報告]
發(fā)表于 2011-01-14 12:00 |只看該作者
沒整明白

論壇徽章:
0
25 [報告]
發(fā)表于 2011-01-25 13:30 |只看該作者
看看操作系統(tǒng)原理就明白了。

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達阿赫利
日期:2015-07-03 08:39:42
26 [報告]
發(fā)表于 2011-01-25 14:22 |只看該作者
22樓的總結(jié)非常好啊。好多問題我也困惑了很久。

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達阿赫利
日期:2015-07-03 08:39:42
27 [報告]
發(fā)表于 2011-01-25 14:40 |只看該作者
我在這個LED驅(qū)動程序中怎么沒有看到虛擬地址到物理地址的映射啊,我覺得應(yīng)該有一個ioremap()才對啊,怎么 ...
ywf851207 發(fā)表于 2011-01-11 20:19



    你看看S3C2410_GPB5_OUTP的定義吧。

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


#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)

論壇徽章:
1
天蝎座
日期:2015-02-04 15:40:37
28 [報告]
發(fā)表于 2011-02-01 17:03 |只看該作者
宏觀上可以這么理解吧。言簡易懂

論壇徽章:
0
29 [報告]
發(fā)表于 2011-02-02 17:26 |只看該作者
回復(fù) 1# ywf851207


   

論壇徽章:
0
30 [報告]
發(fā)表于 2012-06-27 17:08 |只看該作者
怎么看不見圖啊啊
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP