日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux驱动中地址空间转换

發布時間:2023/12/10 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux驱动中地址空间转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在linux kernel 中,物理地址是不能直接使用的,必須通過轉換才可以。

轉換分為兩種, 靜態和動態。
靜態就是下面那種,不過,靜態的地址轉換,還需要在kernel 初始化的時候作映射。?
動態映射是使用 ioremap 函數

[cpp] view plaincopy
  • #define?SL2312_GPIO_BASE??0x4D000000????
  • ????
  • #define?IO_ADDRESS(x)??(((X)&0x0fffffff)+(((x)>>4)&0x0f000000)+0xf0000000)?????
  • ????
  • #define?GEMINI_GPIO_BASE1??IO_ADDRESS(SL2312_GPIO_BASE)?????

  • ?
    linux 有內存保護機制,無論是內核態還是用戶態。?
    靜態映射 :是在物理地址上加一個偏移量, 所以虛擬地址是固定的。?
    動態映射 :系統會生成一個虛擬地址對應到物理地址上,虛擬地址不是固定的

    linux在初始化運行時會根據一個map_desc的數組中的物理地址進行靜態映射,0x4D000000地址應該就是這樣映射的。
    靜態映射的地址無須使用icoremap函數,只要知道在map_desc數組中物理地址與虛擬地址的移仿就可以了。?
    于驅動程序中關于物理地址是不是都要轉換呢,這個是當然的,linux是運行在虛擬地址的
    任何程序不能訪問物理地址,都必須轉換為物理地址才能訪問只不過,在內核空間已經是轉換好了的(如前所述),可以隨便的訪問。?

    動態映射是由Linux內核統一管理,當使用kmalloc(分配在內核空間)和malloc函數申請時,內核會找到一塊空余的物理內存,并在頁表中動態地添加一項其與虛擬地址對應的表項。?
    靜態映射那應該就是LINUX在初始化階段讀取map_desc數組進行的地址映射,map_desc中包括了一對對的物理地址和虛擬地址的對應關系,這個可以根據硬件修改,其中的虛擬地址必須是內核空間的,例如,SDRAM的物理是0x30000000 那么可以將其映射為0xe0000000. 通過靜態映射后的地址一般之后就不會更改了的,除非你想辦法改掉。

    ?

    注:以上均摘自論壇,僅供參考,不對的請指正,謝謝!

    總結

    以上是生活随笔為你收集整理的linux驱动中地址空间转换的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。