在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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)源:Linuxer ? 作者:Linuxer ? 2021-02-20 16:46 ? 次閱讀

這張圖畫(huà)了挺久的,主要是想讓大家可以從全局角度,看下linux內(nèi)核中系統(tǒng)調(diào)用的實(shí)現(xiàn)。

4156d6e4-71ad-11eb-8b86-12bb97331649.png

在講具體的細(xì)節(jié)之前,我們先根據(jù)上圖,從整體上看一下系統(tǒng)調(diào)用的實(shí)現(xiàn)。

系統(tǒng)調(diào)用的實(shí)現(xiàn)基礎(chǔ),其實(shí)就是兩條匯編指令,分別是syscall和sysret。

syscall使執(zhí)行邏輯從用戶態(tài)切換到內(nèi)核態(tài),在進(jìn)入到內(nèi)核態(tài)之后,cpu會(huì)從 MSR_LSTAR 寄存器中,獲取處理系統(tǒng)調(diào)用內(nèi)核代碼的起始地址,即上面的 entry_SYSCALL_64。

在執(zhí)行 entry_SYSCALL_64 函數(shù)時(shí),內(nèi)核代碼會(huì)根據(jù)約定,先從rax寄存器中獲取想要執(zhí)行的系統(tǒng)調(diào)用的編號(hào),然后根據(jù)該編號(hào)從sys_call_table數(shù)組中找到對(duì)應(yīng)的系統(tǒng)調(diào)用函數(shù)。

接著,從 rdi, rsi, rdx, r10, r8, r9 寄存器中獲取該系統(tǒng)調(diào)用函數(shù)所需的參數(shù),然后調(diào)用該函數(shù),把這些參數(shù)傳入其中。

在系統(tǒng)調(diào)用函數(shù)執(zhí)行完畢之后,執(zhí)行結(jié)果會(huì)被放到rax寄存器中。

最后,執(zhí)行sysret匯編指令,從內(nèi)核態(tài)切換回用戶態(tài),用戶程序繼續(xù)執(zhí)行。

如果用戶程序需要該系統(tǒng)調(diào)用的返回結(jié)果,則從rax中獲取。

總體流程就是這樣,相對(duì)來(lái)說(shuō),還是比較簡(jiǎn)單的,主要就是先去理解syscall和sysret這兩條匯編指令,在理解這兩條匯編指令的基礎(chǔ)上,再去看內(nèi)核源碼,就會(huì)容易很多。

有關(guān)syscall和sysret指令的詳細(xì)介紹,請(qǐng)參考Intel 64 and IA-32 Architectures Software Developer’s Manual。

有了上面對(duì)系統(tǒng)調(diào)用的整理理解,我們接下來(lái)看下其具體的實(shí)現(xiàn)細(xì)節(jié)。

以write系統(tǒng)調(diào)用為例,其對(duì)應(yīng)的內(nèi)核源碼為:

419dd24c-71ad-11eb-8b86-12bb97331649.png

在內(nèi)核中,所有的系統(tǒng)調(diào)用函數(shù)都是通過(guò) SYSCALL_DEFINE 等宏定義的,比如上面的write函數(shù),使用的是 SYSCALL_DEFINE3。

將該宏展開(kāi)后,我們可以得到如下的函數(shù)定義:

41e59078-71ad-11eb-8b86-12bb97331649.png

由上可見(jiàn),SYSCALL_DEFINE3宏展開(kāi)后為三個(gè)函數(shù),其中只有__x64_sys_write是外部可訪問(wèn)的,其它兩個(gè)都有被static修飾,不能被外部訪問(wèn),所以注冊(cè)到上文中提到的sys_call_table數(shù)組里的函數(shù),應(yīng)該就是這個(gè)函數(shù)。

那該函數(shù)是怎么注冊(cè)到這個(gè)數(shù)組的呢?

我們先不說(shuō)答案,先來(lái)看下sys_call_table數(shù)組的定義:

4213a346-71ad-11eb-8b86-12bb97331649.png

由上可見(jiàn),該數(shù)組各元素的默認(rèn)值都是 __x64_sys_ni_syscall:

425994a0-71ad-11eb-8b86-12bb97331649.png

該函數(shù)也非常簡(jiǎn)單,就是直接返回錯(cuò)誤碼-ENOSYS,表示系統(tǒng)調(diào)用非法。

sys_call_table數(shù)組定義的地方好像只設(shè)置了默認(rèn)值,并沒(méi)有設(shè)置真正的系統(tǒng)調(diào)用函數(shù)。

我們?cè)倏纯雌渌胤剑词欠裼写a會(huì)注冊(cè)真正的系統(tǒng)調(diào)用函數(shù)到sys_call_table數(shù)組里。

可惜,并沒(méi)有。

這就奇怪了,那各系統(tǒng)調(diào)用函數(shù)到底是在哪里注冊(cè)的呢?

我們?cè)倩仡^仔細(xì)看下sys_call_table數(shù)組的定義,它在設(shè)置完默認(rèn)值之后,后面還include了一個(gè)名為asm/syscalls_64.h的頭文件,這個(gè)位置include頭文件還是比較奇怪的,我們看下它里面是什么內(nèi)容。

但是,這個(gè)文件居然不存在。

那我們只能初步懷疑這個(gè)頭文件是編譯時(shí)生成的,帶著這個(gè)疑問(wèn),我們?nèi)ニ阉飨嚓P(guān)內(nèi)容,確實(shí)發(fā)現(xiàn)了一些線索:

4298af50-71ad-11eb-8b86-12bb97331649.png

這個(gè)文件確實(shí)是編譯時(shí)生成的,上面的makefile中使用了syscalltbl.sh腳本和syscall_64.tbl模板文件來(lái)生成這個(gè)syscalls_64.h頭文件。

我們來(lái)看下syscall_64.tbl模板文件的內(nèi)容:

42bb097e-71ad-11eb-8b86-12bb97331649.png

這里確實(shí)定義了write系統(tǒng)調(diào)用,且標(biāo)明了它的編號(hào)是1。

我們?cè)賮?lái)看下生成的syscalls_64.h頭文件:

431eb82a-71ad-11eb-8b86-12bb97331649.png

這里面定義了很多好像宏調(diào)用一樣的東西。

__SYSCALL_COMMON,這個(gè)不就是sys_call_table數(shù)組定義那里define的那個(gè)宏嘛。

再去上面看下__SYSCALL_COMMON這個(gè)宏定義,它的作用是將sym表示的函數(shù)賦值到sys_call_table數(shù)組的nr下標(biāo)處。

所以對(duì)于__SYSCALL_COMMON(1, sys_write)來(lái)說(shuō),它就是注冊(cè)__x64_sys_write函數(shù)到sys_call_table數(shù)組下標(biāo)為1的槽位處。

而這個(gè)__x64_sys_write函數(shù),正是我們上面猜測(cè)的,SYSCALL_DEFINE3定義的write系統(tǒng)調(diào)用,展開(kāi)之后的一個(gè)外部可訪問(wèn)的函數(shù)。

這樣就豁然開(kāi)朗了,原來(lái)真正的系統(tǒng)調(diào)用函數(shù)的注冊(cè),是通過(guò)先定義__SYSCALL_COMMON宏,再include那個(gè)根據(jù)syscall_64.tbl模板生成的syscalls_64.h頭文件來(lái)完成的,非常巧妙。

系統(tǒng)調(diào)用函數(shù)注冊(cè)到sys_call_table數(shù)組的過(guò)程,到這里已經(jīng)非常清楚了。

下面我們繼續(xù)來(lái)看下哪里在使用這個(gè)數(shù)組:

4348f482-71ad-11eb-8b86-12bb97331649.png

do_syscall_64在使用,方式是先通過(guò)nr在sys_call_table數(shù)組中找到對(duì)應(yīng)的系統(tǒng)調(diào)用函數(shù),然后再調(diào)用該函數(shù),將regs傳入其中。

這個(gè)流程和我們上面預(yù)估的一樣,且傳入的regs參數(shù)類(lèi)型,和我們上面注冊(cè)的系統(tǒng)調(diào)用函數(shù)所需的類(lèi)型也一樣。

那也就是說(shuō),regs參數(shù)的字段里,是帶著各系統(tǒng)調(diào)用函數(shù)所需的參數(shù)的,SYSCALL_DEFINE等宏展開(kāi)出來(lái)的一系列函數(shù),會(huì)從這些字段中提取出真正的參數(shù),然后對(duì)其進(jìn)行類(lèi)型轉(zhuǎn)換,最后這些參數(shù)被傳入到最終的系統(tǒng)調(diào)用函數(shù)中。

對(duì)于上面的write系統(tǒng)調(diào)用宏展開(kāi)后的那些函數(shù),__x64_sys_write會(huì)先從regs中提取出di, si, dx字段作為真正參數(shù),然后__se_sys_write會(huì)將這些參數(shù)轉(zhuǎn)成正確的類(lèi)型,最后__do_sys_write函數(shù)被調(diào)用,轉(zhuǎn)換后的這些參數(shù)被傳入其中。

在系統(tǒng)調(diào)用函數(shù)執(zhí)行完畢后,其結(jié)果會(huì)被賦值到了regs的ax字段里。

由上可見(jiàn),系統(tǒng)調(diào)用函數(shù)的參數(shù)及返回值的傳遞,都是通過(guò)regs來(lái)完成的。

但文章開(kāi)始的時(shí)候不是說(shuō),系統(tǒng)調(diào)用的參數(shù)及返回值的傳遞,是通過(guò)寄存器來(lái)完成的嗎,這里怎么是通過(guò)struct pt_regs的字段呢?

先別急,先來(lái)看下struct pt_regs的定義:

43838782-71ad-11eb-8b86-12bb97331649.png

你有沒(méi)有發(fā)現(xiàn),這里面的字段名都是寄存器的名字。

那是不是說(shuō),在執(zhí)行系統(tǒng)調(diào)用的代碼里,有邏輯把各寄存器里的值放到了這個(gè)結(jié)構(gòu)體的對(duì)應(yīng)字段里,在結(jié)束系統(tǒng)調(diào)用時(shí),這些字段里的值又被賦值到各個(gè)對(duì)應(yīng)的寄存器里呢?

離真相越來(lái)越近。

我們繼續(xù)看使用了do_syscall_64的地方:

43e020fa-71ad-11eb-8b86-12bb97331649.png

上圖中的entry_SYSCALL_64方法,就是系統(tǒng)調(diào)用流程中最重要的一個(gè)方法了,為了便于理解,我對(duì)該方法做了很多修改,并添加了很多注釋。

這里需要注意的是100行到121行這段邏輯,它將各寄存器的值壓入到棧中,以此來(lái)構(gòu)建struct pt_regs對(duì)象。

這就能構(gòu)建出一個(gè)struct pt_regs對(duì)象了?

是的。

我們回上面看下struct pt_regs的定義,看其字段名字及順序是不是和這里的壓棧順序正好相反。

我們?cè)傧胂拢?dāng)我們要構(gòu)建一個(gè)struct pt_regs對(duì)象時(shí),我們要為其在內(nèi)存中分配一塊空間,然后用一個(gè)地址來(lái)指向這段空間,這個(gè)地址就是該struct pt_regs對(duì)象的指針,這里需要注意的是,這個(gè)指針里存放的地址,是這段內(nèi)存空間的最小地址。

再看上面的壓棧過(guò)程,每一次壓棧操作我們都可以認(rèn)為是在分配內(nèi)存空間并賦值,當(dāng)r15被最終壓入到棧中后,整個(gè)內(nèi)存空間分配完畢,且數(shù)據(jù)也初始化完畢,此時(shí),rsp指向的棧頂?shù)刂罚褪沁@段內(nèi)存空間的最小地址,因?yàn)閴簵_^(guò)程中,棧頂?shù)牡刂肥且恢痹谧冃〉摹?/p>

綜上可知,在壓棧完畢后,rsp里的地址就是一個(gè)struct pt_regs對(duì)象的地址,即該對(duì)象的指針。

在構(gòu)建完struct pt_regs對(duì)象后,123行將rax中存放的系統(tǒng)調(diào)用編號(hào)賦值到了rdx里,124行將rsp里存放的struct pt_regs對(duì)象的地址,即該對(duì)象的指針,賦值到了rsi中,接著后面執(zhí)行了call指令,來(lái)調(diào)用do_syscall_64方法。

調(diào)用do_syscall_64方法之前,對(duì)rdi和rsi的賦值,是為了遵守c calling convention,因?yàn)樵谠揷alling convention中約定,在調(diào)用c方法時(shí),第一個(gè)參數(shù)要放到rdi里,第二個(gè)參數(shù)要放到rsi里。

我們?cè)偃ド厦婵聪耫o_syscall_64方法的定義,參數(shù)類(lèi)型及順序是不是和我們這里說(shuō)的是完全一樣的。

在調(diào)用完do_syscall_64方法后,系統(tǒng)調(diào)用的整個(gè)流程基本上就快結(jié)束了,上圖中的129行到133行做的都是一些寄存器恢復(fù)的工作,比如從棧中彈出對(duì)應(yīng)的值到rax,rip,rsp等等。

這里需要注意的是,棧中rax的值是在上面do_syscall_64方法里設(shè)置的,其存放的是系統(tǒng)調(diào)用的最終結(jié)果。

另外,在棧中彈出的rip和rsp的值,分別是用戶態(tài)程序的后續(xù)指令地址及其堆棧地址。

最后執(zhí)行sysret,從內(nèi)核態(tài)切換回用戶態(tài),繼續(xù)執(zhí)行syscall后面邏輯。

到這里,完整的系統(tǒng)調(diào)用處理流程就已經(jīng)差不多說(shuō)完了,不過(guò)這里還差一小步,就是syscall指令在進(jìn)入到內(nèi)核態(tài)之后,是如何找到entry_SYSCALL_64方法的:

445e0cae-71ad-11eb-8b86-12bb97331649.png

它其實(shí)是注冊(cè)到了MSR_LSTAR寄存器里了,syscall指令在進(jìn)入到內(nèi)核態(tài)之后,會(huì)直接從這個(gè)寄存器里拿系統(tǒng)調(diào)用處理函數(shù)的地址,并開(kāi)始執(zhí)行。

系統(tǒng)調(diào)用內(nèi)核態(tài)的邏輯處理就是這些。

下面我們用一個(gè)例子來(lái)演示下用戶態(tài)部分:

44aa1ba8-71ad-11eb-8b86-12bb97331649.png

編譯并執(zhí)行:

44ec4ee2-71ad-11eb-8b86-12bb97331649.png

我們用syscall來(lái)執(zhí)行write系統(tǒng)調(diào)用,寫(xiě)的字符串為Hi ,syscall執(zhí)行完畢后,我們直接使用ret指令將write的返回結(jié)果當(dāng)作程序的退出碼返回。

所以在上圖中,輸出了Hi,且程序的退出碼是3。

如果對(duì)上面的匯編不太理解,可以把它想像成下面這個(gè)樣子:

455a1bfc-71ad-11eb-8b86-12bb97331649.png

在這里,我們使用的是glibc中的write方法來(lái)執(zhí)行該系統(tǒng)調(diào)用,其實(shí)該方法就是對(duì)syscall指令做的一層封裝,本質(zhì)上使用的還是我們上面的匯編代碼。

這個(gè)例子到這里就結(jié)束了。

有沒(méi)有覺(jué)得不太盡興?

我們分析了這么多的代碼,最終就用了這么個(gè)小例子就結(jié)束了,不行,我們要再做點(diǎn)什么。

要不我們來(lái)自己寫(xiě)個(gè)系統(tǒng)調(diào)用?

說(shuō)干就干。

我們先在write系統(tǒng)調(diào)用下面定義一個(gè)我們自己的系統(tǒng)調(diào)用:

458e3fcc-71ad-11eb-8b86-12bb97331649.png

該方法很簡(jiǎn)單,就是將參數(shù)加10,然后返回。

再把這個(gè)系統(tǒng)調(diào)用在syscall_64.tbl里注冊(cè)一下,編號(hào)為442:

45ce44f0-71ad-11eb-8b86-12bb97331649.png

編譯內(nèi)核,等待執(zhí)行。

我們?cè)侔焉厦鎸?xiě)的那個(gè)hi程序改下并編譯好:

4630f078-71ad-11eb-8b86-12bb97331649.png

然后在虛擬機(jī)中啟動(dòng)新編譯的linux內(nèi)核,并執(zhí)行上面的程序:

466ec3f8-71ad-11eb-8b86-12bb97331649.png

看結(jié)果,正好就是20。

搞定,收工。

原文標(biāo)題:精致全景圖 | 系統(tǒng)調(diào)用是如何實(shí)現(xiàn)的

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

責(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)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5401

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    8418

原文標(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)推薦

    NFS網(wǎng)絡(luò)文件系統(tǒng)深度解析

    Procedure Call Protocol 遠(yuǎn)程過(guò)程調(diào)用實(shí)現(xiàn)RPC采用C/S模式,客戶機(jī)請(qǐng)求程序調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。
    的頭像 發(fā)表于 03-01 14:15 ?433次閱讀

    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 ?402次閱讀
    AIGC<b class='flag-5'>系統(tǒng)</b>中多個(gè)模型的切換<b class='flag-5'>調(diào)用</b>方案探索

    HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))技能調(diào)用方案概述

    一、概述 技能調(diào)用是意圖框架依托系統(tǒng)AI多模態(tài)大模型能力做深度用戶輸入理解,并通過(guò)解析的用戶意圖對(duì)接應(yīng)用或元服務(wù)內(nèi)的功能和內(nèi)容。 二、場(chǎng)景體驗(yàn) 用戶通過(guò)對(duì)小藝對(duì)話進(jìn)行自然語(yǔ)言輸入實(shí)現(xiàn)內(nèi)容查詢(xún),知識(shí)
    發(fā)表于 11-08 15:38

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?
    的頭像 發(fā)表于 10-31 09:35 ?595次閱讀
    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步<b class='flag-5'>系統(tǒng)</b>及應(yīng)<b class='flag-5'>用是</b>什么?

    記一次JSF異步調(diào)用引起的接口可用率降低

    源碼是基于JSF 1,7.5-HOTFIX-T6版本。 起因 問(wèn)題背景 1.廣告投放系統(tǒng)是典型的I/O密集型(I/O Bound)服務(wù),系統(tǒng)中某些接口單次操作可能依賴(lài)十幾個(gè)外部接口,導(dǎo)致接口耗時(shí)較長(zhǎng),嚴(yán)重影響用戶體驗(yàn),因此需要將這些外部
    的頭像 發(fā)表于 08-05 13:40 ?411次閱讀
    記一次JSF異步<b class='flag-5'>調(diào)用</b>引起的接口可用率降低

    如何手搓一個(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 ?1085次閱讀
    如何手搓一個(gè)自定義的RPC 遠(yuǎn)程過(guò)程<b class='flag-5'>調(diào)用</b>框架

    求助,關(guān)于ESP8266 HTTPClient REST調(diào)用問(wèn)題求解

    我有一個(gè) Sketch,我在其中調(diào)用了 REST 服務(wù),它在我的 ESP-12E 模塊上運(yùn)行良好。REST 調(diào)用是針對(duì)運(yùn)行 Windows 10 IoT 的 Raspberry PI 3
    發(fā)表于 07-19 13:32

    sdk調(diào)用sprintf函數(shù)時(shí),系統(tǒng)就會(huì)崩潰,為什么?

    rtos版本的sdk,v1.0.4版本(1.0.3版本的也有同樣的問(wèn)題)。當(dāng)我調(diào)用sprintf函數(shù)時(shí),系統(tǒng)就會(huì)崩潰,打印信息如下: Fatal exception (222t?,u): epc1
    發(fā)表于 07-18 07:14

    人員定位系統(tǒng)的主要作用是什么?還有什么常用功能?

    、人員定位系統(tǒng)的主要作用是什么? 其實(shí)現(xiàn)在的人員定位系統(tǒng)可提供的服務(wù)不僅僅是定位,更主要的作用是減少安全事故,而便于管理者使用的監(jiān)管功能也只
    的頭像 發(fā)表于 07-16 11:17 ?690次閱讀

    IoT_Demo例程未調(diào)用smartconfig_start(),是如何實(shí)現(xiàn)快連功能的?

    請(qǐng)問(wèn) IoT_Demo 例程未調(diào)用 smartconfig_start(),是如何實(shí)現(xiàn)快連功能的?
    發(fā)表于 07-15 06:36

    pi調(diào)節(jié)器的作用是什么

    PI調(diào)節(jié)器,即比例-積分調(diào)節(jié)器,是一種廣泛應(yīng)用于工業(yè)控制系統(tǒng)中的控制器。它通過(guò)比例(P)和積分(I)兩個(gè)參數(shù)的調(diào)整,實(shí)現(xiàn)對(duì)系統(tǒng)輸出的精確控制。以下是關(guān)于PI調(diào)節(jié)器的詳細(xì)介紹: 一、PI調(diào)節(jié)器
    的頭像 發(fā)表于 06-30 10:43 ?5643次閱讀

    控制器的主要作用是指什么

    控制器的主要作用是指在自動(dòng)化控制系統(tǒng)中,對(duì)系統(tǒng)的工作狀態(tài)進(jìn)行監(jiān)控、調(diào)節(jié)和控制的設(shè)備或裝置。控制器是自動(dòng)化控制系統(tǒng)的核心部件,其性能和可靠性直接影響到整個(gè)
    的頭像 發(fā)表于 06-30 10:39 ?6213次閱讀

    繼電器中彈簧的作用是什么

    、設(shè)計(jì)和應(yīng)用等方面的內(nèi)容。 一、彈簧在繼電器中的作用 觸點(diǎn)復(fù)位 彈簧在繼電器中的主要作用是觸點(diǎn)復(fù)位。當(dāng)繼電器線圈通電時(shí),線圈產(chǎn)生的磁場(chǎng)會(huì)吸引觸點(diǎn),使觸點(diǎn)閉合,從而實(shí)現(xiàn)電路的接通。當(dāng)線圈斷電時(shí),觸點(diǎn)需要迅速?gòu)?fù)位,恢復(fù)到
    的頭像 發(fā)表于 06-21 11:13 ?1501次閱讀

    數(shù)控機(jī)床的核心是什么,它的作用是什么?

    Numerical Control System),它的作用是實(shí)現(xiàn)對(duì)機(jī)床的精確控制,提高加工精度和生產(chǎn)效率。以下是關(guān)于數(shù)控機(jī)床核心及其作用的詳細(xì)分析。 一、數(shù)控機(jī)床的核心——數(shù)控系統(tǒng) 1.1 數(shù)控
    的頭像 發(fā)表于 06-07 09:48 ?2880次閱讀

    PSoC 5LP如何實(shí)現(xiàn)一個(gè)真正的基本文件I/O系統(tǒng)

    有人知道 stdio 函數(shù)的基本文件 I/O 實(shí)現(xiàn)嗎? 在沒(méi)有操作系統(tǒng)的裸機(jī)項(xiàng)目中,除了_read()/_write()能讓 printf()等正常工作外,大多數(shù)系統(tǒng)調(diào)用的最低工作
    發(fā)表于 05-31 08:18
    主站蜘蛛池模板: 1024亚洲视频 | 午夜精品久久久久久久 | 国产精品九九热 | xxxx大片| 免费抓胸吻胸激烈视频网站 | 午夜欧美精品 | 天天色亚洲 | 成人精品久久 | 亚洲 自拍 欧美 综合 | 婷婷亚洲综合五月天小说在线 | 四虎免费永久观看 | 亚洲无线视频 | 特级毛片免费看 | 国产手机在线国内精品 | 欧美性黄色 | 被cao到合不拢腿腐男男 | 免费看的一级毛片 | 成人在线视频网址 | 噜噜影院无毒不卡 | 婷婷深爱 | 四虎国产精品永久在线看 | 国产久视频 | 亚洲春色www | 国模精品一区二区 | 欧美高清视频一区 | 网全大全黄| 午夜毛片视频 | 久久国产免费观看 | 欧美一区二区三区免费高 | 狠狠干狠狠操 | 天天舔天天插 | 老师叫我揉她内裤越快越好 | 四虎影院在线免费观看 | 三级理论在线观看 | a级精品九九九大片免费看 a级毛毛片看久久 | 欧美一级在线全免费 | 国产伦子一区二区三区四区 | 亚洲成a人一区二区三区 | 免费在线观看的网站 | 性欧美xxxx | 美女黄网站 |