Notify sendEvent的實現過程

2021-06-09 20:01:53 字數 3312 閱讀 8210

首先是從使用者態的notify_sendevent

函式開始

int notify_sendevent (uint16              procid,

uint16              lineid,

uint32              eventid,

uint32              payload,

bool                waitclear)

進入此函式後會將上面的引數進行封裝,再呼叫

notifydrvusr_ioctl (cmd_notify_sendevent, &cmdargs);

其中引數封裝如下:

notify_cmdargssendevent cmdargs;

cmdargs.procid = procid;

cmdargs.lineid    = lineid;

cmdargs.eventid   = eventid;

cmdargs.payload = payload;

cmdargs.waitclear = waitclear;

再由ioctl

進入核心態

ioctl (notifydrvusr_handle, cmd, args);

再呼叫核心態的notify_sendevent函式

notify_sendevent (srcargs.procid,

srcargs.lineid,

srcargs.eventid,

srcargs.payload,

srcargs.waitclear);

進入notify_sendevent

函式後做了以下事:

inotifydriver_handle driverhandle;

notify_object *     obj;

obj = notify_module->notifyhandles [procid][lineid];

根據procid

和lineid

通過全域性變數

notify_module找到對應的notify_object 資料

driverhandle = obj->driverhandle;

再通過notify_object 

資料找到對應的

inotifydriver_handle

資料,該資料結構中包括的乙個重要的函式指標結構體

inotifydriver_fxntable。

然後呼叫inotifydriver_sendevent

函式繼續往下走

inotifydriver_sendevent (driverhandle,

strippedeventid,

payload,

waitclear);

進入此函式主要執行了下面兩步

inotifydriver_object * obj = (inotifydriver_object *) handle;

status = obj->fxntable.sendevent (obj->obj, eventid, payload, waitclear);

傳進來的driverhandle

(即obj

)中fxntable

的函式指標是初始化過了的,其中

obj->obj引數也初始化了的,她是struct notifydrivershm_object_tag

即(notifydrivershm_evententry)結構型別這兩個的初始化我將在後面介紹,暫不考慮。

即進入了下面這個函式

int  notifydrivershm_sendevent (notifydrivershm_handle handle,

uint32              eventid,

uint32              payload,

bool                waitclear)

在這個函式中有下面幾條重要的執行語句:

volatile notifydrivershm_evententry *  evententry;

obj = (notifydrivershm_object *) handle;

evententry = evententry (obj->othereventchart, obj->evententrysize, eventid)

evententry->payload = payload;

evententry->flag    = notifydrivershm_up;

archipcint_sendinterrupt (obj->remoteprocid,  obj->params.remoteintid,  eventid);

上面主要實現就是找到遠端對應eventid

的notifydrivershm_evententry

結構空間,並且將

payload

值存入該結構中,並賦相應的標誌位,再通過

archipcint_sendinterrupt 

函式將eventid

繼續往下發。

則進入int32 archipcint_sendinterrupt    (uint16 procid, uint32 intid, uint32 value)

這個函式很簡單主要有下面一條語句:

archipcint_object.fxntable->sendinterrupt(procid,  intid,  value); (

dm8168ipcint_setup)

這個主要就是通過乙個全域性變數archipcint_object下的函式指標實現的,這個初始化主要在dm8168ipcint_setup

這個函式中,這個

sendinterrupt

函式指標即對應的

dm8168ipcint_sendinterrupt 函式

然後進入

int32  dm8168ipcint_sendinterrupt (uint16 procid, uint32 intid,  uint32 value) 

主要實現了下面兩條語句

while (reg32(  dm8168ipcint_state.mailboxbase

+ mailbox_message_5_offset) == 4);  (這個作用是什麼?)

reg32(dm8168ipcint_state.mailboxbase + mailbox_message_5_offset)  = value;

即將enventid

寫入mailbox5

中並產生中斷通知

vpss.

瀏覽過的商品的簡單實現

listentities gservice.findall 通過 findall 方法查詢出所有商品 輸出顯示所有商品 for goods entity entities 顯示瀏覽過的商品資訊 宣告瀏覽過的商品的 value 值string value null cookie cookies req...

從head htm來看uchome的實現過程

head.htm 位於安裝目錄 template default 下,其基本用於每個應用頁面的頭部,用於顯示 title 頁面頂部以及頁面左側的應用鏈結,除了 title 之外的功能圖如下。由於每乙個應用頁面都將此檔案在開始時進行引用,這就確保上述內容在每乙個頁面中都有顯示。從使用者的角度來看,能夠...

基於zabbix實現監控Jenkins過程詳解

一 監控架構圖 二 實現思路 三 具體配置 1 安裝jenkins metrics外掛程式 外掛程式 位址 安裝 metrics 外掛程式,在系統配置中,會多出 metrics 的配置,如下圖 配置項不複雜。我們需要點選 generate.生成乙個 access key 生成後,記得要儲存 這個 k...