應用程式如何訪問驅動
應用程式主要是通過系統呼叫來訪問驅動程式圖。
接下來我們以read.c應用程式來分析:
原始碼:
1 #include 2 #include 3 #include 4 #include 5 #include 6我們知道read.c是個系統呼叫函式,系統呼叫之前,他是在我們的應用程式當中。實現是在核心當中,但是read.c是怎麼找到核心的實現**的呢:7int
main()
8
一、進入**分析階段
1.1使用靜態編譯編譯並且反彙編
[root@localhost lesson1]#arm-linux-gcc -static -g read.c -o read接著開啟dump: vim dump[root@localhost lesson1]# arm-linux-objdump -d -s read >dump
使用底行模式搜尋:main函式:/main(一般來說我們搜尋的是main這裡我直接搜尋sizeof)
我們主要是看read方法是如何實現的:
這個**主要做了兩件工作:
第一件是把我們read的三個引數傳到我們的r0-r2裡面去,儲存起來。我們都知道在arm系統中,當引數小於4個時是採用通用暫存器來儲存引數。第二件就是去呼叫libc_read.
這裡最重要的是兩行**:
mov r7,#3 ;0x3
svc 0x00000000
從上面看到,read的主要的工作是把3傳給r7,然後使用svc這個命令,叫做系統呼叫指令。當我們使用了這個指令之後。我們的pc指標會從使用者空間進入到核心空間,而且入口是固定的,其次就是核心如何處理的問題了。
1.首先是pc指標進入核心的固定入口。
2.其次,核心回去取這個number,就是3.(3代表的是,從統一的入口進入後,我要去呼叫read的實現**)。
3.第三是根據number去查這個表,查出來的3是read所對應的核心系統的實現**sys_read.
首先找固定的入口:
這就是入口的系統**,我們從注釋可以清楚的看到。這是獲取系統呼叫的編號。接著就是根據這編號去查表了,接著往下找,就可以看到sys_call_table.
接著往下檢視可以看到
裡面包含了call.s檔案因此我們支架跳入call.s檔案中
這是乙個包含了很多函式的一張表,然後系統根據我們的number=3,去找到對應的函式。上面知道,我們傳進來的number是等於3的。利用3這個標號找這個表,找出來的正好是sys_read這個函式。
接下來就是分析sys_read是咋實現的啦,該函式是在read_write.c中。
通過巨集定義的替換,就會變成sys_read.最重要的是呼叫vfs_read函式。
其中最重要的是上面這個函式。當我們初始化驅動程式的時候,就會給裝置指定乙個file_operation結構,然後使用read這個裝置指標來呼叫。這個裝置指標就是我們在驅動程式實現的裝置方法。
總結:
驅動原理 應用程式訪問驅動程式
以read為例 read是乙個系統呼叫,系統呼叫之前在應用程式當中 或者叫使用者空間當中 read的實現 在核心中,read是如何找到核心的實現 呢?filename read mem.c include include include include intmain 這個應用程式就是開啟字元裝置檔...
資料訪問應用程式塊
模組名稱 1.概述 是乙個.net 元件,包含優化的資料訪問 2.功能說明 2.1.可以幫助使用者呼叫儲存過程以及向 sql server 資料庫發出 sql 文字命令。它返回 sqldatareader dataset 和xmlreader 物件。2.2.可以在.net 應用程式中 將其作為構造塊...
如何編寫應用程式
每次要編寫嵌入式應用程式的時候總是不知道該如何入手,於是簡單的研究了下現在普遍的掃碼支付模組的sdk開發結構。拿到乙個專案需求時,我們需要看下該專案分為幾個模組,每個模組之間又是以什麼形式連線的。模組化會使程式結構清晰,維護也會方便很多。比如說掃碼支付模組就分為三個部分,底層core部分,mqtt功...