Linux內核的學習(一)

来源:http://www.cnblogs.com/liangwc/archive/2017/12/12/8028354.html
-Advertisement-
Play Games

Linux內核里mmu已經啟動,不能直接訪問物理地址。 mmu,全稱Memory Manage Unit, 中文名————存儲器管理單元。 地址範圍—— 電腦上的地址集合。(大小是由CPU的位數決定)32位——0 ~ 0xFFFFFFFF(4G), 64位——0~0xFFFFFFFFFFFFFFF ...


Linux內核里mmu已經啟動,不能直接訪問物理地址。

mmu,全稱Memory Manage Unit, 中文名————存儲器管理單元。

  • 地址範圍—— 電腦上的地址集合。(大小是由CPU的位數決定)32位——0 ~ 0xFFFFFFFF(4G), 64位——0~0xFFFFFFFFFFFFFFFF(64T)。地址範圍也叫虛擬地址空間,該空間的某一個地址我們稱之為虛擬地址。
  • 物理地址———真實地址空間。

  MMU是如何工作?

進程X開始運行時,訪問到VPRN0,是虛擬地址。VPFN0是指向頁表(頁表分為page index(頁號索引),offset(偏移位)。頁表的詳細說明 http://blog.csdn.net/seanyxie/article/details/5728772)。通過頁表,會發現該部分的虛擬記憶體實際上是位於PFN0區域,所以程式實際上訪問的就是物理記憶體的PFN0區域。VPFN3----->PFN4。 當我的Y進程也在運行時 Y的虛擬記憶體VPFN1——>PFN4。

由此,我們得出以下結論:

  1. 物理地址,和虛擬地址沒什麼關係。
  2. 不同進程會被分配同一個物理記憶體
  3. 不同的進程的虛擬記憶體,其對應的物理記憶體實際上沒有多大關係

////////////////////////////////

Linux內核的MMU已經啟動,我們如何去直接訪問物理地址?

 #include <asm/io.h>
void
*ioremap(cookie,size) //該函數用於把指定的物理地址映射到一個虛擬地址上
//cookie 指定物理地址, size表示映射的大小範圍
//返回值為映射得到的虛擬地址

iounmap(void *addr) //用於取消虛擬地址的映射關係。
 ioread8(地址)/readb() // 讀地址上的8位值, readb是比較老的函數
 ioread16(地址)/readw()// 讀16位
ioread32(地址)/readl()//讀32位

iowrite8(值,地址)/writeb//寫8位,writeb是比較老的函數

iowrite16(值,地址)/writew//寫16位

iowrite32(值,地址)/writel//寫32位
 1 #include <linux/init.h>
 2  #include <linux/module.h>
 3  #include <asm/io.h>
 4 
 5 #define BADDR 0x01c20800
 6 u8 *vaddr; //用於記錄映射的虛擬地址
 7 
 8 static int __init myinit(void)
 9 {
10     u32 val;
11     vaddr = ioremap(BADDR, SZ_4K);
12     
13     printk("myinit.......");
14     return 0;
15 }
16 
17 static void __exit myexit(void)
18 {
19     printk("myexit");
20 
21     iounmap(vaddr);
22 }
23 
24 module_init(myinit);
25 module_exit(myexit);
26 
27 MODULE_ILCENSE("GPL");

Linux 內核提供gpio口的操作的函數

linux內核里有標準的GPIO操作方法. 其中有對晶元廠商的要求,晶元廠商需要在內核里實現相關的GPIO控制器的驅動配置, 讓內核里的gpiolib(drivers/gpio/目錄下)可以統一管理整個晶元的gpio口, 讓我們驅動人員可以用內核提供的gpio標準操作函數通過gpiolib來調用控制晶元的io口.

#include <linux/gpio.h>

int gpio_request(unsigned gpio, const char *label);//用於io口申請,每個io只能一次
void gpio_free(unsigned gpio); //釋放已請求的io口
 
int gpio_direction_input(unsigned gpio);//把io作為輸入功能
int gpio_direction_output(unsigned gpio, int value);//作輸出,並根據value的值輸出高低電平

int gpio_get_value(unsigned gpio);//獲取指定io的電平
void gpio_set_value(unsigned gpio, int value);//設置io的電平

int gpio_to_irq(unsigned gpio);//獲取到gpio的中斷號

如何在內核里找到GPIO口的定義。有兩種方法:

  • 一般情況下, io口的定義是在內核源碼arch/arm/mach-xxxx/include/mach/gpio.h.(mach-xxxx是和板有關)
  • 我們可以反著來,查找誰在用GPIO口。例如:我們查gpio_request,看看GPIO口的定義。

我們可以不用看CPU的晶元手冊,直接控制GPIO。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章屬於原創,轉載請聯繫本人。有參照兩個博客(http://blog.csdn.net/jiangtongcn/article/details/13509633 http://blog.csdn.net/liyong314159265/article/details/40979853) vs2010 ...
  • 本文為原創文章、源代碼為原創代碼,如轉載/複製,請在網頁/代碼處明顯位置標明原文名稱、作者及網址,謝謝! 開發工具:VS2017 語言:C# DotNet版本:.Net FrameWork 4.0及以上 一、為了演示使用程式讀取控制台數據,現在需要編寫一個控制台程式,代碼如下: 這段代碼的作用是: ...
  • 1. useradd -s /bin/bash -m 用戶名 , 創建用戶,自動創建家目錄 , 設置登錄shell 2. echo 用戶名:密碼 | chpasswd ,非互動式設置密碼 3. echo -e "userlist_deny=NO\nuserlist_enable=YES\nuserl ...
  • RAID英文全稱為Redundant Array of Inexpensive Disks,中文譯為廉價磁碟冗餘陣列。它實質是使用多塊物理硬碟組成一個具有加速、自動備份、數據損毀恢復等功能的邏輯硬碟。 為了滿足不同工作環境的需要,RAID技術分為了以下RAID 0-7計合8種。每種陣列都各自有其自身 ...
  • 1.ls ls命令主要是顯示列印出目錄下的檔案或者目錄等,常用的參數如下: -a:全部的檔案連同隱藏檔案一起輸出 -l:完整的顯示檔案的信息,包括許可權,屬性 -d:僅顯示目錄本身,不顯示目錄中的文件 顯示用戶家目錄的信息: 顯示目錄本身: 2.cd cd命令主要是改變目錄的功能 3.pwd pwd命 ...
  • 一、uptime命令 這個命令可以快速查看機器的負載情況。在Linux系統中,這些數據表示等待CPU資源的進程和阻塞在不可中斷IO進程(進程狀態為D)的數量。這些數據可以讓我們對系統資源使用有一個巨集觀的瞭解。 命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負載情況。通過這三個數據,可以瞭解伺服器負 ...
  • 系統參數檢查: df -h [enter] 檢查硬碟空間 TIP: 使用 man df 可查看該命令使用說明 ; q 退出. free檢查記憶體使用情況: free [enter] TIP: 使用 man free 可查看該命令使用說明 ; q 退出. top命令檢查線程的cpu負載情況: top [ ...
  • 命令彙總系列 1. "Linux企業運維人員最常用150個命令彙總" 2. "如何用九條命令在一分鐘內檢查Linux伺服器性能?" 未完待續 ... ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...