chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

Linux閱碼場(chǎng) ? 來(lái)源:Rand ? 作者:Rand ? 2021-09-29 11:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int fork(void);

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

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

#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)

這是用匯編來(lái)寫(xiě)的,而且使用了宏定義,我們來(lái)仔細(xì)閱讀一下這段代碼

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

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

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

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

ret 函數(shù)返回

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

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

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

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

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

一個(gè) # 表示字符串化,如果 為 abc,則結(jié)果為 “abc”

兩個(gè) ## 表示連接符,如果 為 ab, 為 cd,則結(jié)果為 abcd

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

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

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

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

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

void trap(struct trapframe *tf

{

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

if(myproc()-》killed

exit();

myproc()-》tf = tf; //當(dāng)前進(jìn)程的中斷棧幀

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

if(myproc()-》killed)

exit();

return;

}

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

}

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

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

void syscall(void)

{

int num;

struct proc *curproc = myproc(); //獲取當(dāng)前進(jìn)程的PCB

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

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

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

} else {

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

”,

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

curproc-》tf-》eax = -1;

}

}

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

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

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

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

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

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

push size

push buf

push fd

call write

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

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

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

{

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

}

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;

}

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

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;

}

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

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

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

{

int i;

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

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

return -1;

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

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

return 0;

}

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

char *p;

argptr(1, &p, n);

/**如果用一級(jí)指針**/

argptr(1, p, n);

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

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

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

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

這是以 write 系統(tǒng)調(diào)用為例的系統(tǒng)調(diào)用過(guò)程圖,圖是丑了點(diǎn),不過(guò)這條線應(yīng)該捋得還是挺清晰的,好啦,本文就到這里,有什么錯(cuò)誤還請(qǐng)批評(píng)指正,也歡迎大家來(lái)同我討論交流學(xué)習(xí)進(jìn)步。

責(zé)任編輯:haq

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

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41442
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64893
  • 系統(tǒng)調(diào)用

    關(guān)注

    0

    文章

    28

    瀏覽量

    8485

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

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用

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

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

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

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

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

    減速機(jī)的工作原理具體是如何實(shí)現(xiàn)的?

    減速機(jī)的工作原理主要基于齒輪傳動(dòng)的原理,通過(guò)不同的齒輪組合來(lái)實(shí)現(xiàn)速度的降低和扭矩的增加。以下是減速機(jī)工作原理的具體實(shí)現(xiàn)步驟: 1、輸入軸與驅(qū)動(dòng)電機(jī)連接: 減速機(jī)的輸入軸通常與驅(qū)動(dòng)電機(jī)相連。電機(jī)提供
    發(fā)表于 03-05 16:24

    光伏電站無(wú)人機(jī)巡檢系統(tǒng)具體作用

    系統(tǒng)實(shí)現(xiàn)了對(duì)電站各個(gè)方位的全面監(jiān)測(cè),不僅提高了光伏電站的運(yùn)維效率,減少了人力物力,同時(shí)也保障了光伏發(fā)電的可靠性和高效性。隨著無(wú)人機(jī)技術(shù)的不斷發(fā)展和應(yīng)用,光伏電站的巡檢將會(huì)更加智能和精準(zhǔn)。 ?????? 光伏電站無(wú)人機(jī)巡檢系統(tǒng)
    的頭像 發(fā)表于 01-22 16:30 ?521次閱讀
    光伏電站無(wú)人機(jī)巡檢<b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>具體</b>作用

    SD-WAN的優(yōu)勢(shì)和實(shí)際應(yīng)用具體表現(xiàn)在哪些方面?

    SD-WAN的實(shí)施策略、技術(shù)革新以及安全技術(shù),幫助網(wǎng)絡(luò)工程師更好地理解如何利用SD-WAN連接跨國(guó)網(wǎng)絡(luò),并確保數(shù)據(jù)安全。 SD-WAN的連接方式 SD-WAN的連接方式多樣,具體取決于企業(yè)的網(wǎng)絡(luò)架構(gòu)和需求。以下是幾種常見(jiàn)的連接方式: 鏈路聚合:通過(guò)組
    的頭像 發(fā)表于 01-20 11:58 ?482次閱讀

    光伏電站無(wú)人機(jī)巡檢系統(tǒng)具體應(yīng)用與優(yōu)勢(shì)

    光伏電站無(wú)人機(jī)巡檢系統(tǒng)具體應(yīng)用與優(yōu)勢(shì) 集中式光伏電站面積都非常大,如果僅僅依靠人工巡檢,費(fèi)時(shí)費(fèi)力,應(yīng)用無(wú)人機(jī)巡檢是一個(gè)高效、全面的解決方案。 光伏電站無(wú)人機(jī)巡檢系統(tǒng)實(shí)現(xiàn)了對(duì)電站各個(gè)方
    的頭像 發(fā)表于 12-16 16:56 ?817次閱讀

    華納云:VFS在提升文件系統(tǒng)性能方面的具體實(shí)踐

    VFS(Virtual File System)通過(guò)提供統(tǒng)一的接口和抽象層,使得操作系統(tǒng)能夠以高效的方式管理和訪問(wèn)不同的文件系統(tǒng)。以下是一些VFS在提升文件系統(tǒng)性能方面的具體實(shí)踐示例:
    的頭像 發(fā)表于 11-27 15:59 ?859次閱讀

    AIGC系統(tǒng)中多個(gè)模型的切換調(diào)用方案探索

    作者:京東科技 賈玉龍 1 背景 1.1 現(xiàn)狀 AIGC系統(tǒng)中多個(gè)模型的切換調(diào)用通常指的是在同一個(gè)AIGC系統(tǒng)或應(yīng)用中,可以根據(jù)不同的輸入條件或任務(wù)需求,動(dòng)態(tài)地選擇并調(diào)用不同的機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 11-27 11:43 ?518次閱讀
    AIGC<b class='flag-5'>系統(tǒng)</b>中多個(gè)模型的切換<b class='flag-5'>調(diào)用</b>方案探索

    使用具有集成式電源的隔離式RS-485收發(fā)器優(yōu)化您的設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《使用具有集成式電源的隔離式RS-485收發(fā)器優(yōu)化您的設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 11-25 14:55 ?4次下載
    使<b class='flag-5'>用具</b>有集成式電源的隔離式RS-485收發(fā)器優(yōu)化您的設(shè)計(jì)

    使用具有較高LED電源電壓和串聯(lián)LED的TLC5940

    電子發(fā)燒友網(wǎng)站提供《使用具有較高LED電源電壓和串聯(lián)LED的TLC5940.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 09:36 ?0次下載
    使<b class='flag-5'>用具</b>有較高LED電源電壓和串聯(lián)LED的TLC5940

    使用具有精密電壓閾值的使能引腳實(shí)現(xiàn)精密啟動(dòng)延遲

    電子發(fā)燒友網(wǎng)站提供《使用具有精密電壓閾值的使能引腳實(shí)現(xiàn)精密啟動(dòng)延遲.pdf》資料免費(fèi)下載
    發(fā)表于 09-04 10:13 ?0次下載
    使<b class='flag-5'>用具</b>有精密電壓閾值的使能引腳<b class='flag-5'>實(shí)現(xiàn)</b>精密啟動(dòng)延遲

    使用具有延長(zhǎng)引線的SOT-583封裝的好處

    電子發(fā)燒友網(wǎng)站提供《使用具有延長(zhǎng)引線的SOT-583封裝的好處.pdf》資料免費(fèi)下載
    發(fā)表于 08-28 11:39 ?0次下載
    使<b class='flag-5'>用具</b>有延長(zhǎng)引線的SOT-583封裝的好處

    RS觸發(fā)器的具體實(shí)現(xiàn)方式

    RS觸發(fā)器是數(shù)字電路中的一種基本邏輯單元,具有兩個(gè)穩(wěn)定狀態(tài)(通常稱(chēng)為“0”態(tài)和“1”態(tài)),并能在外部信號(hào)的作用下從一種狀態(tài)翻轉(zhuǎn)到另一種狀態(tài)。RS觸發(fā)器的具體實(shí)現(xiàn)方式多種多樣,但基本原理相同,即利用正反饋機(jī)制來(lái)維持觸發(fā)器的穩(wěn)定狀態(tài)。
    的頭像 發(fā)表于 08-12 09:47 ?2845次閱讀

    如何手搓一個(gè)自定義的RPC 遠(yuǎn)程過(guò)程調(diào)用框架

    1、RPC(遠(yuǎn)程過(guò)程調(diào)用概述) 遠(yuǎn)程過(guò)程調(diào)用(RPC, Remote Procedure Call)是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而無(wú)需了解網(wǎng)絡(luò)細(xì)節(jié)的通信技術(shù)。在分布式系統(tǒng)中,RPC
    的頭像 發(fā)表于 07-22 12:17 ?1236次閱讀
    如何手搓一個(gè)自定義的RPC 遠(yuǎn)程過(guò)程<b class='flag-5'>調(diào)用</b>框架