91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

系統(tǒng)調(diào)用具體是如何實現(xiàn)的

Linux閱碼場 ? 來源:Rand ? 作者:Rand ? 2021-09-29 11:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

系統(tǒng)調(diào)用就是調(diào)用操作系統(tǒng)提供的一系列內(nèi)核功能函數(shù),因為內(nèi)核總是對用戶程序持不信任的態(tài)度,一些核心功能不能直接交由用戶程序來實現(xiàn)執(zhí)行。用戶程序只能發(fā)出請求,然后內(nèi)核調(diào)用相應的內(nèi)核函數(shù)來幫著處理,將結果返回給應用程序。如此才能保證系統(tǒng)的穩(wěn)定和安全。本文采用 的實例來講解系統(tǒng)調(diào)用具體是如何實現(xiàn)的。

系統(tǒng)調(diào)用是給用戶態(tài)下的程序使用的,但是用戶程序并不直接使用系統(tǒng)調(diào)用,而是系統(tǒng)調(diào)用在用戶態(tài)下的接口。這個用戶接口就是操作系統(tǒng)提供的系統(tǒng)調(diào)用 ,一般遵循 標準。

的系統(tǒng)調(diào)用是用 INT n 指令實現(xiàn)的,INT n 的作用就是觸發(fā)一個 號中斷,中斷的過程應該很熟悉了吧,不熟悉的可以看看前文:多處理器下的中斷機制。 里面系統(tǒng)調(diào)用使用的向量號是 , 里面使用的 (不同 版本可能不同)。只要這個向量號 不是一些異常使用的,一些保留的和一些外設默認使用的,用多少來表示系統(tǒng)調(diào)用其實無傷大雅, 要用 ,那就 好了。

上述說的用戶接口就會執(zhí)行 INT 64 觸發(fā)一個 號中斷,這里 做了簡化,按照以前版本的 ,用戶接口是調(diào)用一個宏定義 ,這個宏再來執(zhí)行 INT 指令觸發(fā)中斷。關于這部分可以看看前文:捋一捋系統(tǒng)調(diào)用

執(zhí)行 INT 64 之后, 會根據(jù)向量號 去 中索引第 個門描述符(從 0 計數(shù)),這個門描述符中存放的有系統(tǒng)調(diào)用程序的偏移量和段選擇子,再根據(jù)段選擇子去 中索引段描述符,段描述符中記錄的有段基址,與門描述符中記錄的偏移量相加就是系統(tǒng)調(diào)用程序的地址。拿到系統(tǒng)調(diào)用程序的地址,就可以執(zhí)行程序做相應的處理了。

可是系統(tǒng)調(diào)用是有很多的,雖然 中實現(xiàn)的系統(tǒng)調(diào)用沒多少,沒多少也還是有那么一些的,怎么區(qū)別它們呢?這就涉及了系統(tǒng)調(diào)用號概念,每一個系統(tǒng)調(diào)用都唯一分配了一個整數(shù)來標識,比如說 里面 系統(tǒng)調(diào)用的調(diào)用號就為 1。INT 64,表示觸發(fā)一個中斷向量號為 64 的中斷,而這個中斷表示系統(tǒng)調(diào)用,并沒有具體說是哪一個系統(tǒng)調(diào)用,所以還需要一個系統(tǒng)調(diào)用號來表示具體的系統(tǒng)調(diào)用。

系統(tǒng)調(diào)用通俗的講就是是用戶態(tài)下的程序托內(nèi)核辦事,既然是托人辦事那得告訴人家你要辦什么事對吧。這個告訴人家具體要辦什么事就是要給內(nèi)核傳遞系統(tǒng)調(diào)用號,問題是怎么傳呢?通常的做法就是將這個系統(tǒng)調(diào)用號放進 寄存器,當執(zhí)行到系統(tǒng)調(diào)用入口程序的時候就會根據(jù) eax 的值去調(diào)用具體的系統(tǒng)調(diào)用程序,比如說 中存放的是 1 那么就會去調(diào)用 這個系統(tǒng)調(diào)用的相關函數(shù)。這個系統(tǒng)調(diào)用的入口程序可以理解為在第 個門描述符中記錄的程序,因為肯定是要先根據(jù)向量號拿到總的中斷服務程序(在這兒就是總的系統(tǒng)調(diào)用程序),然后再根據(jù) 的值去調(diào)用的具體的內(nèi)核功能函數(shù)。

上面只是說的一般的大致情況,如果看過前文多處理器下的中斷機制應該知道, 對所有中斷(包括系統(tǒng)調(diào)用)的處理是先執(zhí)行共同的中斷入口程序,主要就是保護現(xiàn)場壓棧寄存器,然后根據(jù)向量號的不同執(zhí)行不同的中斷處理程序。在這里就是執(zhí)行系統(tǒng)調(diào)用入口程序,然后再根據(jù) 的值調(diào)用具體的內(nèi)核功能函數(shù)。

這個具體的內(nèi)核功能函數(shù)咱們就不討論了,內(nèi)核中的表現(xiàn)形式就是一個個不同的函數(shù),咱們這兒只討論兩件事:

一是參數(shù),有些系統(tǒng)調(diào)用的是需要參數(shù)的,用戶接口不真正干活,真正干活的是內(nèi)核功能函數(shù),但是需要的參數(shù)在用戶態(tài)下,所以需要在用戶接口部分向內(nèi)核傳遞參數(shù)。傳參有兩種方法:

直接傳給寄存器,寄存器是通用的,在用戶態(tài)將值傳給寄存器,進入內(nèi)核態(tài)之后就可以直接使用,這可以使用內(nèi)聯(lián)匯編來實現(xiàn)。

壓棧,壓棧有個問題,系統(tǒng)調(diào)用使用中斷/陷阱來實現(xiàn),這期間會換棧,在用戶態(tài)下壓棧的參數(shù)對內(nèi)核來說似乎沒什么用處。所以要想使用用戶態(tài)下棧中的參數(shù),必須要獲得用戶棧的地址,這個值在哪呢?沒錯,在內(nèi)核棧中的上下文保存著,從內(nèi)核棧中取出用戶棧的棧頂 值,就可以取到系統(tǒng)調(diào)用的參數(shù)了, 就是這樣實現(xiàn)的。

二是返回值,函數(shù)的調(diào)用約定中規(guī)定了返回值應該放在 寄存器里面。而在系統(tǒng)調(diào)用的一開始我們將系統(tǒng)調(diào)用號傳進了 寄存器,然后中斷時保存上下文,將 壓入內(nèi)核棧,系統(tǒng)調(diào)用處理程序?qū)⒆詈蠼Y果放到 寄存器中。下面注意了,如果不對上下文中的 作修改的話,中斷退出的時候恢復上下文彈出 ,彈出的值是啥?是系統(tǒng)調(diào)用號,也就是說將結果放到 寄存器中放了個寂寞,所以肯定會有一個步驟修改上下文中 為結果這么一個步驟,這樣回到用戶態(tài)的時候這個結果才會在 寄存器中。

上述差不多將系統(tǒng)調(diào)用的一些理論知識說完了,下面用 的實例來看看系統(tǒng)調(diào)用具體如何實現(xiàn)的。

首先便是用戶接口部分,用戶接口是操作系統(tǒng)提供的系統(tǒng)調(diào)用 函數(shù),一般是 標準, 關于這用戶接口定義在 中,來隨便看兩個:

int fork(void);

int write(int, const void*, int);

這只是對函數(shù)原型的聲明。具體做了什么事呢?這個定義在 中:

#include “syscall.h”

#include “traps.h”

#define SYSCALL(name)

.globl name;

name:

movl $SYS_ ## name, %eax;

int $T_SYSCALL;

ret

SYSCALL(fork)

SYSCALL(write)

SYSCALL(getpid)

這是用匯編來寫的,而且使用了宏定義,我們來仔細閱讀一下這段代碼

.global name 聲明了一個全局可見的名字,可以是變量也可以是函數(shù)名,這里就與用戶接口的函數(shù)名。函數(shù)名就相當于一個地址,name: 后面的代碼就是這個函數(shù)具體要做的事,就像 c 語言編寫函數(shù)時的函數(shù)體,只不過這里是用匯編寫的而已。

所以這個函數(shù)做了什么事?應該一目了然啊,就三條指令:

movl $SYS_ ## name, %eax 將系統(tǒng)調(diào)用號傳到寄存器

int $T_SYSCALL 觸發(fā) 號中斷

ret 函數(shù)返回

這里還使用了一些宏定義,首先是系統(tǒng)調(diào)用號,定義在 當中,隨便看幾個意思一下:

#define SYS_fork 1#define SYS_getpid 11#define SYS_write 16

這個號就是自定義的,能夠?qū)⒚總€系統(tǒng)調(diào)用唯一區(qū)分開就好。

上面的宏定義中還涉及了 # 的用法,# 一般有兩種用法:

#define STR(x) #x#define CAT(x, y) x##y

一個 # 表示字符串化,如果 為 abc,則結果為 “abc”

兩個 ## 表示連接符,如果 為 ab, 為 cd,則結果為 abcd

所以上述 SYS_ ## name,如果 為 ,那么結果就是 SYS_fork,表示 的系統(tǒng)調(diào)用號。

代表的系統(tǒng)調(diào)用的向量號, 版本不同,這個數(shù)可能不同,我這兒是 ,所以 int $T_SYSCALL 相當于觸發(fā)了一個 號中斷。

接著就應該是中斷的處理過程,這一塊在前文多處理器下的中斷機制已經(jīng)講述的很詳細了,而且還有過程圖,本文就不再贅述。本文重點講述執(zhí)行了通用的中斷入口程序之后如何執(zhí)行系統(tǒng)調(diào)用分支的,如何獲取用戶棧的參數(shù),如何修改上下文中的 使其返回正確的結果。

問題很多,咱們一個一個來解決,首先從 IDTGDT 中獲取到中斷入口程序的地址之后,執(zhí)行中斷入口程序壓棧寄存器來保存上下文,這個上下文中包括了向量號。

保存了上下文之后跳到 這個總的中斷處理程序,這個程序中會根據(jù)向量號不同去執(zhí)行不同的中斷處理程序,如果向量號表示的是系統(tǒng)調(diào)用的話,就會進行如下操作:

void trap(struct trapframe *tf

{

if(tf-》trapno == T_SYSCALL){ //如果向量號表示的是系統(tǒng)調(diào)用

if(myproc()-》killed

exit();

myproc()-》tf = tf; //當前進程的中斷棧幀

syscall(); //執(zhí)行系統(tǒng)調(diào)用入口程序

if(myproc()-》killed)

exit();

return;

}

/*******略略略略********/

}

可以看到,如果中斷棧幀中的向量號表示的是系統(tǒng)調(diào)用號的話,就會去執(zhí)行系統(tǒng)調(diào)用入口程序。

這個系統(tǒng)調(diào)用入口程序定義在 里面:

void syscall(void)

{

int num;

struct proc *curproc = myproc(); //獲取當前進程的PCB

num = curproc-》tf-》eax; //獲取系統(tǒng)調(diào)用號

if(num 》 0 && num 《 NELEM(syscalls) && syscalls[num]) {

curproc-》tf-》eax = syscalls[num](); //調(diào)用相應的系統(tǒng)調(diào)用處理函數(shù),返回值賦給eax

} else {

cprintf(“%d %s: unknown sys call %d

”,

curproc-》pid, curproc-》name, num);

curproc-》tf-》eax = -1;

}

}

這個系統(tǒng)調(diào)用的入口函數(shù)的作用就是根據(jù)中斷棧幀中的系統(tǒng)調(diào)用號去調(diào)用相應的內(nèi)核功能函數(shù),然后將返回值再填寫到棧幀中的 處。

這個流程整個邏輯應該是很清晰的,主要注意一點,調(diào)用內(nèi)核功能函數(shù)的方式:syscalls[num]() , 是系統(tǒng)調(diào)用號, 看形式應該是個數(shù)組,從這里其實應該就能猜出來了, 將所有具體的系統(tǒng)調(diào)用處理函數(shù)地址按照系統(tǒng)調(diào)用號的順序集合成了一個數(shù)組。事實也的確如此,同樣的來隨便看幾個:

extern int sys_fork(void);

extern int sys_getpid(void);

extern int sys_write(void);

static int (*syscalls[])(void) = {

[SYS_fork] sys_fork,

/**********************/

[SYS_getpid] sys_getpid,

/**********************/

[SYS_write] sys_write,

/***********************/

}

extern int sys_fork(void); 表示具體的 這個內(nèi)核的功能函數(shù),這個函數(shù)才是真正干事的,它在外面定義,所以用了 ,至于具體這個函數(shù)干了什么事,在本文不重要,本文主要事了解系統(tǒng)調(diào)用這個流程,后面講述進程的時候再具體講述這個函數(shù),或者前面寫過一篇關于 的文章:使用分身術變身術創(chuàng)建新進程

接下來是定義了一個函數(shù)指針數(shù)組,就是將上述函數(shù)地址填到數(shù)組相應的位置上。[SYS_fork] sys_fork 這種填充數(shù)組元素的方式似乎不太常見,但在這里就非常實用,表示將 這個函數(shù)的地址填寫到索引為 的位置上去。

關于系統(tǒng)調(diào)用還剩下最后一個問題,根據(jù)上述內(nèi)核中具體的系統(tǒng)調(diào)用函數(shù)原型可以看出,它們的返回類型都是 型且沒有參數(shù),但是有些系統(tǒng)調(diào)用是需要參數(shù)的,所以那些需要參數(shù)的系統(tǒng)調(diào)用就要去獲取參數(shù),去哪獲取呢?是的,去用戶棧獲取參數(shù),因為 沒有使用寄存器來傳參,而是將參數(shù)直接壓入用戶棧里面的。

回到系統(tǒng)調(diào)用的開頭,何時將參數(shù)壓棧的,參數(shù)是為被調(diào)用函數(shù)準備的,所以調(diào)用函數(shù)之前一定會將參數(shù)壓棧。這個被調(diào)用函數(shù)就是用戶接口,舉個例子如果調(diào)用 ,則在這之前一定會將參數(shù) 按照這個順序壓棧,再 調(diào)用函數(shù),只是在 語言中這個過程可能看起來不是那么真切,如果是用匯編來寫,或者查看編譯之后的程序,會有下面的大致過程:

push size

push buf

push fd

call write

在 call wirte 之后又會將下條指令地址壓棧當作放回地址, (用戶接口) 又做了三件事,傳系統(tǒng)調(diào)用號,int T_SYSCALL, ret 返回。int T_SYSCALL 之后換棧,用戶棧棧頂 保存在上下文中的 處。

捋清楚這個關系之后就知道怎么去拿參數(shù)了,直接去中斷棧幀中獲取用戶棧棧頂值 ,再根據(jù)參數(shù)返回地址的位置關系獲取一個個參數(shù),來看 中有關獲取參數(shù)的幾個函數(shù):

int argint(int n, int *ip) //獲取系統(tǒng)調(diào)用的第n個int型的參數(shù),存到ip這個位置

{

return fetchint((myproc()-》tf-》esp) + 4 + 4*n, ip); //原棧中獲取n個int型參數(shù),加4是跳過

}

int fetchint(uint addr, int *ip)

{

struct proc *curproc = myproc();

if(addr 》= curproc-》sz || addr+4 》 curproc-》sz)

return -1;

*ip = *(int*)(addr);

return 0;

}

這是獲取一個 t 型的參數(shù),(myproc()-》tf-》esp) + 4 + 4*n 表示第 個參數(shù)( 型) 的位置,多加了一個 是因為要跳過返回地址 字節(jié)。然后調(diào)用 ) 去取參數(shù),核心語句就一句:*ip = *(int*)(addr); 將這個地址轉(zhuǎn)化為 型再解引用放在地址 上,說著有些繞口,自己看一下應該還是很好明白的。至于這個函數(shù)中關于進程部分的一些條件檢查,現(xiàn)下可以不予理會。

int argptr(int n, char **pp, int size)

{

int i;

struct proc *curproc = myproc();

if(argint(n, &i) 《 0)

return -1;

if(size 《 0 || (uint)i 》= curproc-》sz || (uint)i+size 》 curproc-》sz)

return -1;

*pp = (char*)i;

return 0;

}

這個函數(shù)用來獲取一個指針,指針就是地址,地址就是一個 位無符號數(shù),所以調(diào)用前面的 來獲取這個數(shù)存到 中,這個 本身其實是個地址值,所以將其轉(zhuǎn)化 類型,然后賦值給 。

注意這里使用的是二級指針,為什么要使用二級指針,我們來看看如果使用一級指針會發(fā)生什么,如果這個函數(shù)是這樣:

int argptr(int n, char *pp, int size) //pp類型變?yōu)閏har*

{

int i;

/*********************/

if(argint(n, &i) 《 0)

return -1;

/*********************/

pp = (char*)i; //這里變?yōu)橹苯咏opp賦值

return 0;

}

如果這個函數(shù)變成這樣還對嗎,答案是不對的。舉個例子來說明,在 這個內(nèi)核功能函數(shù)中會調(diào)用 :

char *p;

argptr(1, &p, n);

/**如果用一級指針**/

argptr(1, p, n);

調(diào)用 的本意是獲取第一個參數(shù),也就是用戶接口 的 地址值,并將其賦給 。

假如 等于某個地址 ,如果使用一級指針:調(diào)用 argptr(1, p, n); int argptr(int n, char *pp, int size),這個 是實參, 是形參,,雖然 和 的值相等,但它們兩個是兩個不同的變量,所以如果修改 , 的值是不會變化的,因此使用一級指針就不對。

如果使用的是二級指針,調(diào)用 argptr(1, &p, n); int argptr(int n, char **pp, int size)。實參是 的地址, 本身就是個地址值,所以 ,修改 就是 。嗯這下就對了,所以這里要使用二級指針才對頭。

還有個獲取字符串的函數(shù),跟獲取指針差不了太多,只是多了一個算字符串長度的步驟,這里就不贅述了。

這是以 write 系統(tǒng)調(diào)用為例的系統(tǒng)調(diào)用過程圖,圖是丑了點,不過這條線應該捋得還是挺清晰的,好啦,本文就到這里,有什么錯誤還請批評指正,也歡迎大家來同我討論交流學習進步。

責任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:系統(tǒng)調(diào)用如何實現(xiàn)?

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    博世GTM IP模塊在車載系統(tǒng)中的具體實現(xiàn)方式與優(yōu)勢

    在汽車電子系統(tǒng)中,如何充分發(fā)揮 GTM IP的功能,以滿足復雜的系統(tǒng)級應用場景,是用戶實現(xiàn)高效控制與精確響應的關鍵。本文將聚焦幾個典型且核心的應用實例,探討GTM IP在車載系統(tǒng)中的
    的頭像 發(fā)表于 12-30 17:36 ?701次閱讀
    博世GTM IP模塊在車載<b class='flag-5'>系統(tǒng)</b>中的<b class='flag-5'>具體</b><b class='flag-5'>實現(xiàn)</b>方式與優(yōu)勢

    TQKIT開發(fā)板工具讓系統(tǒng)功能調(diào)用更簡單

    TQKIT開發(fā)板工具,將復雜的系統(tǒng)控制能力以接口形式開放給開發(fā)者,讓系統(tǒng)功能調(diào)用更簡單。
    的頭像 發(fā)表于 12-08 09:27 ?408次閱讀
    TQKIT開發(fā)板工具讓<b class='flag-5'>系統(tǒng)</b>功能<b class='flag-5'>調(diào)用</b>更簡單

    系統(tǒng)調(diào)用和API有什么區(qū)別呢?

    其實你已經(jīng)明白了,操作系統(tǒng)本身也是一堆代碼,它本身也有很多能力可以供我們使用,操作系統(tǒng)就像前面舉例中的發(fā)動機、餐廳、游戲或者一個代碼的功能模塊一樣,常說的系統(tǒng)調(diào)用system call
    發(fā)表于 12-03 06:52

    連載|開發(fā)工具,易安卓讓系統(tǒng)功能調(diào)用像寫應用邏輯一樣簡單

    通過自研系統(tǒng)封裝庫,易安卓將復雜的系統(tǒng)控制能力以接口形式開放給開發(fā)者,讓系統(tǒng)功能調(diào)用像寫應用邏輯一樣簡單。
    的頭像 發(fā)表于 11-27 11:40 ?87次閱讀
    連載|開發(fā)工具,易安卓讓<b class='flag-5'>系統(tǒng)</b>功能<b class='flag-5'>調(diào)用</b>像寫應用邏輯一樣簡單

    【Python 沃爾瑪接口調(diào)用調(diào)用沃爾瑪官方接口獲取授權access_token

    1、打開賣家的后臺,打開設置 2、將頁面翻到最底部,然后打開api密鑰管理 3、賬號分兩個,一個是生產(chǎn)環(huán)境,一個是沙盒環(huán)境(測試環(huán)境),切記,無論什么環(huán)境,都有調(diào)用的次數(shù)限制(有些接口沒有限制,比如
    的頭像 發(fā)表于 11-26 14:05 ?339次閱讀

    調(diào)用拼多多開放平臺 API 獲取店鋪列表

    pdd.mall.info.list.get (或類似名稱,具體名稱請以官方文檔為準) 接口用于查詢店鋪列表。開發(fā)者可以通過此接口獲取授權店鋪的基本信息。 主要功能: 查詢當前授權賬號下的店鋪列表。 獲取店鋪的核心信息,如店鋪 ID、店鋪名稱、店鋪 Logo 等。 2. 調(diào)用
    的頭像 發(fā)表于 11-10 15:30 ?585次閱讀
    <b class='flag-5'>調(diào)用</b>拼多多開放平臺 API 獲取店鋪列表

    深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層的關鍵接口

    ,也無法使用內(nèi)核函數(shù)。當用戶進程必須訪問內(nèi)核或使用某個內(nèi)核函數(shù)時,就得使用系統(tǒng)調(diào)用(System Call)。在Linux中,系統(tǒng)調(diào)用是用戶空間訪問內(nèi)核空間的唯一途徑。 什么是
    的頭像 發(fā)表于 11-03 09:20 ?703次閱讀

    Python調(diào)用API教程

    兩個不同系統(tǒng)之間的信息交互。在這篇文章中,我們將詳細介紹Python調(diào)用API的方法和技巧。 一、用Requests庫發(fā)送HTTP請求 使用Python調(diào)用API的第一步是發(fā)送HTTP請求,通常
    的頭像 發(fā)表于 11-03 09:15 ?887次閱讀

    數(shù)據(jù)濾波算法的具體實現(xiàn)步驟是怎樣的?

    ? 數(shù)據(jù)濾波算法在電能質(zhì)量在線監(jiān)測裝置中的具體實現(xiàn),需圍繞 “ 數(shù)據(jù)采集→預處理→算法執(zhí)行→參數(shù)適配→效果驗證→結果輸出 ” 的全流程展開,核心是結合裝置硬件特性(采樣率、ADC 精度)和干擾類型
    的頭像 發(fā)表于 10-10 16:45 ?822次閱讀

    GCC編譯器,怎么才能實現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯呢?

    GCC編譯器,怎么才能實現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯?有什么編譯選項可以設置嗎? 移植代碼,有些函數(shù)沒被調(diào)用的函數(shù)想留在代碼里,但不想被編譯,編譯的話報錯報警告啥的太多了,而且編譯起來也慢。 謝謝!
    發(fā)表于 09-28 12:25

    OMAP138 硬件QNX641 操作系統(tǒng)的DM9000網(wǎng)口驅(qū)動優(yōu)化

    手頭有產(chǎn)品是OMAP138硬件+QNX641的操作系統(tǒng),其自身帶的網(wǎng)卡,還有DM9000的網(wǎng)卡驅(qū)動程序都存在長期運行容易出現(xiàn)ping不通的情況,現(xiàn)在隨著甲方要求的增高,必須進行解決,因此需要找相關的項目經(jīng)驗的哥們能夠搞定,費用具體可以再談
    發(fā)表于 06-27 19:15

    RK3568驅(qū)動指南|驅(qū)動基礎進階篇-進階7 向系統(tǒng)中添加一個系統(tǒng)調(diào)用

    RK3568驅(qū)動指南|驅(qū)動基礎進階篇-進階7 向系統(tǒng)中添加一個系統(tǒng)調(diào)用
    的頭像 發(fā)表于 05-21 14:15 ?714次閱讀
    RK3568驅(qū)動指南|驅(qū)動基礎進階篇-進階7 向<b class='flag-5'>系統(tǒng)</b>中添加一個<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>

    [Actor] 通過actor創(chuàng)建控制中心與數(shù)據(jù)采集工作站來看操作者架構

    之間如何傳遞數(shù)據(jù)? 答案:方法有很多,選取“用戶事件”方法,原因是該方法與界面顯示數(shù)據(jù)的控件沒有關聯(lián)也稱耦合。 有了上述方法后,如何實現(xiàn)具體的傳遞呢:利用actor框架自帶的“獲取調(diào)用方帶入
    發(fā)表于 05-14 18:44

    verilog模塊的調(diào)用、任務和函數(shù)

    在做模塊劃分時,通常會出現(xiàn)這種情形,某個大的模塊中包含了一個或多個功能子模塊,verilog是通過模塊調(diào)用或稱為模塊實例化的方式來實現(xiàn)這些子模塊與高層模塊的連接的.
    的頭像 發(fā)表于 05-03 10:29 ?1569次閱讀
    verilog模塊的<b class='flag-5'>調(diào)用</b>、任務和函數(shù)

    在Vivado調(diào)用MIG產(chǎn)生DDR3的問題解析

    下面是調(diào)用的DDR3模塊的,模塊的倒數(shù)第二行是,模塊的時鐘輸入,時鐘源來自PLL產(chǎn)生的系統(tǒng)時鐘的倍頻。
    的頭像 發(fā)表于 05-03 10:21 ?1547次閱讀
    在Vivado<b class='flag-5'>調(diào)用</b>MIG產(chǎn)生DDR3的問題解析