日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > IOT物聯(lián)網(wǎng)小鎮(zhèn)
[導(dǎo)讀]程序的結(jié)構(gòu)bootloader把程序從硬盤讀取到內(nèi)存代碼重定位程序入口點(diǎn)重定位段表重定位跳轉(zhuǎn)到程序的入口地址操作系統(tǒng)程序的執(zhí)行在上一篇文章中Linux從頭學(xué)05-系統(tǒng)啟動(dòng)過(guò)程中的幾個(gè)神秘地址,你知道是什么意思嗎?,我們以幾個(gè)重要的內(nèi)存地址為線索,介紹了x86系統(tǒng)在上電開機(jī)之后:C...

  • 程序的結(jié)構(gòu)


  • bootloader 把程序從硬盤讀取到內(nèi)存


  • 代碼重定位


    • 程序入口點(diǎn)重定位


    • 段表重定位


  • 跳轉(zhuǎn)到程序的入口地址


  • 操作系統(tǒng)程序的執(zhí)行


在上一篇文章中Linux從頭學(xué)05-系統(tǒng)啟動(dòng)過(guò)程中的幾個(gè)神秘地址,你知道是什么意思嗎?,我們以幾個(gè)重要的內(nèi)存地址為線索,介紹了 x86 系統(tǒng)在上電開機(jī)之后:


  1. CPU 如何執(zhí)行第一條指令;


  2. BIOS 中的程序如何被執(zhí)行;


  3. 操作系統(tǒng)的引導(dǎo)代碼(bootloader) 被讀取到物理內(nèi)存中被執(zhí)行;


下一個(gè)環(huán)節(jié),就應(yīng)該是引導(dǎo)程序(bootloader)把操作系統(tǒng)程序,讀取到內(nèi)存中,然后跳入到操作系統(tǒng)的第一條指令處開始執(zhí)行。


這篇文章,我們繼續(xù)以8086這個(gè)簡(jiǎn)單的處理器為原型,把程序的加載過(guò)程描述一下。其中的重點(diǎn)部分就是代碼重定位,我們用畫圖的方式,盡我所能,把程序加載、地址重定位的計(jì)算過(guò)程描述清楚。


PS: 文中所說(shuō)的程序、操作系統(tǒng)文件,都是指同一個(gè)東西。


程序的結(jié)構(gòu)

為了便于下面的理解,我們有必要把待加載的操作系統(tǒng)程序的文件結(jié)構(gòu)先介紹一下。


當(dāng)然了,這里介紹的文件結(jié)構(gòu),是一個(gè)非常簡(jiǎn)化版本的操作系統(tǒng)程序,本質(zhì)上與我們平常所寫的應(yīng)用程序沒有什么差別,因此我們也可以把它看做一個(gè)普通的程序文件。


操作系統(tǒng)程序靜靜的躺在硬盤中,等待bootloader來(lái)讀取,此時(shí)bootloader可以看做一個(gè)加載器


它倆畢竟是屬于兩個(gè)不同的東西,為了讓bootloader知道程序的長(zhǎng)度,需要某種“協(xié)議”來(lái)進(jìn)行溝通,這個(gè)“協(xié)議”就是程序文件的頭信息(Header)。


也就是說(shuō),在程序的開頭部分,會(huì)詳細(xì)的介紹自己,包括:程序的總長(zhǎng)度是多少字節(jié),一共有多少個(gè)段,入口地址在什么位置等等。


還記得之前介紹過(guò)的Linux系統(tǒng)中使用的ELF文件格式嗎?Linux系統(tǒng)中編譯、鏈接的基石-ELF文件:扒開它的層層外衣,從字節(jié)碼的粒度來(lái)探索


那篇文章把一個(gè)典型的Linux ELF格式的可執(zhí)行文件徹底拆解了一遍,可以看到,在ELF文件的頭部信息中,詳細(xì)描述了文件中每一部分內(nèi)容。


其實(shí)Windows中的程序格式(PE格式)也是類似的,它與ELF格式來(lái)源于同一個(gè)祖宗。


1. 程序頭(Header)的描述信息

為了便于描述,我們假設(shè)程序中包括3個(gè)段:代碼段,數(shù)據(jù)段和棧段,再加上程序頭部信息,一共是4個(gè)組成部分。如下所示:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理為什么中間留有白色的空白?


因?yàn)槊恳粋€(gè)段并不是緊挨著排列的,為了段地址能夠內(nèi)存對(duì)齊(16個(gè)字節(jié)對(duì)齊),段與段之間可能會(huì)空余一段空間,這些空間里的數(shù)據(jù)都是無(wú)效的。


剛才說(shuō)了,為了能夠讓加載器(bootloader)盡可能的了解自己,程序文件會(huì)在自己的Header部分,詳細(xì)的描述自己的信息:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理有了這樣的描述信息,bootloader就能夠知道一共要讀取多少個(gè)字節(jié)的程序文件,跳轉(zhuǎn)到哪個(gè)位置才能讓操作系統(tǒng)的指令開始執(zhí)行。


2. 關(guān)于匯編地址

在程序的頭信息中,可以看到匯編地址和偏移量這樣的信息。


編譯器在編譯源代碼的時(shí)候,它是不知道bootloader會(huì)把程序加載到內(nèi)存中的什么位置的。


bootloader會(huì)查看哪個(gè)位置有足夠的空間,找到一個(gè)可用的位置之后,就把操作系統(tǒng)程序讀取到這個(gè)位置,可以看做是一個(gè)動(dòng)態(tài)的過(guò)程


因此,編譯器在編譯階段用來(lái)定位變量、標(biāo)簽等使用的地址,都是相對(duì)于當(dāng)前段的開始地址來(lái)計(jì)算的。


還是拿剛才的圖片來(lái)舉例:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理我們假設(shè)Header部分是32個(gè)字節(jié),三個(gè)段的開始地址分別是:


代碼段 addrCodeStart: 0x00020(距離文件的第一個(gè)字節(jié)是 32 Bytes);


數(shù)據(jù)段 addrDataStart: 0x01000(距離文件的第一個(gè)字節(jié)是 4K Bytes);


棧段   addrStackStart:0x01200(距離文件的第一個(gè)字節(jié)是 4K 512 Bytes);


在代碼段中,定義了一個(gè)標(biāo)簽label_1,它距離代碼段的開始位置(0x00020)是512個(gè)字節(jié)(0x0200)。


同時(shí),可以算出它距離文件開頭的第一個(gè)字節(jié)就是 512 32 = 544 字節(jié),因?yàn)榇a段的開始地址距離文件頭部是32個(gè)字節(jié)。


在label_1之前的代碼中,會(huì)引用到這個(gè)標(biāo)簽。


那么在使用的地方,將會(huì)填上0x0200,表示:引用的這個(gè)位置是距離代碼段開始地址的 512 字節(jié)處。


以上的這些地址,指的就是匯編地址


我們?cè)賮?lái)拿程序的入口地址偏移量來(lái)舉例,入口地址是通過(guò)start標(biāo)簽來(lái)定義的:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理假設(shè):在代碼段中,入口地址標(biāo)簽start位于代碼段開始位置的0x0100偏移處,也就是距離代碼段開始位置的256個(gè)字節(jié)。


那么,在程序的Header信息中,入口點(diǎn)偏移量的位置就要填寫0x0100,這樣的話,bootloader把程序讀取到內(nèi)存中之后,就能從這里獲取到程序入口點(diǎn)的偏移地址,然后經(jīng)過(guò)一系列的重定位,就可以準(zhǔn)確跳轉(zhuǎn)到程序的第一條指令的地方去執(zhí)行了。


按照剛才假設(shè)的地址信息,程序頭Header中的信息就是下面這個(gè)樣子:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理最右側(cè)的藍(lán)色字體,表示每一個(gè)項(xiàng)目占用的字節(jié)數(shù),一共是24個(gè)字節(jié)。


剛才說(shuō)到,每一個(gè)段的開始地址都是按照16字節(jié)對(duì)齊的,因此在Header之后,要空余8個(gè)字節(jié)的空間,之后,才是代碼段的開始地址(0x00020 = 32 Bytes)。


bootloader 把程序從硬盤讀取到內(nèi)存

1. 讀取到內(nèi)存中的什么位置?

bootloader在把操作系統(tǒng)文件,從硬盤上讀取到內(nèi)存之前,必須決定一件事情:把文件內(nèi)容存放到內(nèi)存中的什么位置?


從上一篇文章我們了解到,在讀取操作系統(tǒng)之前,內(nèi)存布局模型是下面這樣的:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理注意:這是8086系統(tǒng)中,20根地址線能夠?qū)ぶ返? MB的地址空間。


其中頂部的64 KB,映射到ROM中的BIOS程序。


底部從0開始的1 KB地址空間,是存儲(chǔ)256個(gè)中斷向量(下一篇文章準(zhǔn)備聊聊中斷的事情)。


中間的從0x07C00地址開始的地方,是BIOS從硬盤的引導(dǎo)區(qū)讀取的bootloader程序所存放的地方。


黃色部分的空間一共是640 KB的空間,都是映射到RAM中的,因此,有足夠大的空閑地址空間來(lái)存儲(chǔ)操作系統(tǒng)程序文件。


假設(shè):bootloader就決定從地址0x20000開始(128 KB),存放從硬盤中讀取的操作系統(tǒng)程序文件。


2. bootloader 設(shè)置數(shù)據(jù)段基地址

從硬盤上讀取文件,是按照扇區(qū)為讀取單位的,也就是每次讀取一個(gè)扇區(qū)(512字節(jié))。


至于如何通過(guò)指定扇區(qū)號(hào)、發(fā)送端口命令,來(lái)從硬盤上讀取數(shù)據(jù),這是另一個(gè)話題,暫且不表,我們把目光集中在bootloader上。


對(duì)于bootloader來(lái)說(shuō),讀取操作系統(tǒng)文件就相當(dāng)于讀取普通的數(shù)據(jù)。


既然已經(jīng)決定把讀取的數(shù)據(jù)從地址0x20000開始存放,那么bootloader就要把數(shù)據(jù)段寄存器ds設(shè)置為0x2000,這樣的話,經(jīng)過(guò)邏輯地址的計(jì)算公式:


物理地址 = 邏輯段地址 * 16 偏移地址


才能得到正確的物理地址,例如:


讀取的第 1 個(gè)扇區(qū)的數(shù)據(jù)放在:0x2000:0x0000 地址處;


讀取的第 2 個(gè)扇區(qū)的數(shù)據(jù)放在:0x2000:0x0200 地址處;


讀取的第 3 個(gè)扇區(qū)的數(shù)據(jù)放在:0x2000:0x0400 地址處;


...


讀取的第 10 個(gè)扇區(qū)的數(shù)據(jù)放在:0x2000:0x1200 地址處;


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理

3. bootloader 讀取所有扇區(qū)

bootloader需要把操作系統(tǒng)程序的所有內(nèi)容讀取到內(nèi)存中,需要讀取的長(zhǎng)度是多少呢?


程序文件的Header中有這個(gè)信息,因此,bootloader需要先讀取程序文件的第一個(gè)扇區(qū),也就是512字節(jié),放在0x20000開始的位置。


我們繼續(xù)假設(shè)一下:程序的總長(zhǎng)度是5K字節(jié)(0x01400),那么程序文件的前512個(gè)字節(jié)(第一個(gè)扇區(qū))讀取到內(nèi)存中,就是下面這個(gè)樣子:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理注意:這是文件內(nèi)容被讀取到內(nèi)存中的布局,最下面是低地址,最上面是高地址,這與前面描述靜態(tài)文件中內(nèi)容的順序是相反的。


讀取了第一個(gè)扇區(qū)之后,就可以取出0x20000開始的 4 個(gè)字節(jié)的數(shù)據(jù):0x01400,得到程序文件的總長(zhǎng)度: 5 K 字節(jié)


每個(gè)扇區(qū)是512字節(jié),5 K字節(jié)就是10個(gè)扇區(qū)。


第一個(gè)扇區(qū)已經(jīng)讀取了,那么還需要繼續(xù)讀取剩下的9個(gè)扇區(qū)。


于是,bootloader把所有扇區(qū)的數(shù)據(jù),依次讀取到:0x2000:0x0000, 0x2000:0x0200,  0x2000:0x0400, ... 0x2000:0x1200 地址處。


4. 如果程序文件超過(guò) 64 KB 怎么辦?

這里有一個(gè)延伸的問(wèn)題可以思考一下:


8086 的段尋址方式,由于偏移量寄存器的長(zhǎng)度是16位,最大只能表示64 KB的空間。


我們所假設(shè)的例子中,程序文件只有5 KB,在一個(gè)數(shù)據(jù)段內(nèi)完全可以包括,因此bootloader可以一直用 0x2000:偏移量 的方式來(lái)讀取文件內(nèi)容。


那如果程序的長(zhǎng)度是100 KB,超過(guò)了偏移量的64 KB最大尋址空間,那么bootloader應(yīng)該怎么樣做才能正確把100 KB的程序讀取到內(nèi)存中?


解答:


可以在讀取文件的過(guò)程中,動(dòng)態(tài)的增加數(shù)據(jù)段邏輯地址。


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理比如,在讀取前面的64 KB數(shù)據(jù)(扇區(qū) 1 ~ 扇區(qū) 128)時(shí),段寄存器ds設(shè)置為0x2000。


在讀取第65 KB數(shù)據(jù)(扇區(qū) 129)之前,把段寄存器ds設(shè)置為0x3000,這樣讀取的數(shù)據(jù)就從0x3000:0x0000處開始存放了。


代碼重定位

現(xiàn)在,操作系統(tǒng)程序已經(jīng)被讀取到內(nèi)存中了,下一個(gè)步驟就是:跳轉(zhuǎn)到操作系統(tǒng)的程序入口點(diǎn)去執(zhí)行!


程序入口點(diǎn)重定位

程序入口點(diǎn)的偏移量,已經(jīng)被記錄在Header中了(0x04 ~ 0x05字節(jié),橙色部分):


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理Header中記錄的代碼段中入口點(diǎn)start標(biāo)簽的偏移量是0x100,即:入口點(diǎn)距離代碼段的開始地址是 256 個(gè)字節(jié)。


同樣的道理,代碼段中所有相關(guān)的地址,都是相對(duì)于代碼段的開始地址來(lái)計(jì)算偏移量的。


因此,如果(這里是如果啊)bootloader把代碼段的開始地址(不是整個(gè)文件的開始),直接放到內(nèi)存的0x00000地址處,那么代碼段里所有地址就都不用再修改了,可以直接設(shè)置:cs = 0x0000, ip=0x0100,這樣就直接跳轉(zhuǎn)到start標(biāo)簽的地方開始執(zhí)行了。


可惜,bootloader是把操作系統(tǒng)程序讀取到地址0x20000開始的地方,因此,需要把代碼段寄存器cs設(shè)置為當(dāng)前代碼段在內(nèi)存中的實(shí)際開始位置,也即是下面這個(gè)五角星的位置:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理
以上兩段文字,可以再多讀幾遍!


在Header中,0x06,0x07, 0x08, 0x09 這4個(gè)字節(jié)的數(shù)據(jù)0x00020,就是代碼段的開始位置距離程序文件開頭的字節(jié)數(shù)。


只要把這個(gè)數(shù)值(0x00020),與文件存儲(chǔ)的開始地址(0x20000)相加,就可以得到代碼段的開始地址在物理內(nèi)存中的絕對(duì)地址


0x00020 0x20000 = 0x20020


即:代碼段的開始地址,位于物理內(nèi)存中0x20020的位置。


對(duì)于一個(gè)物理地址,我們可以用多種不同的邏輯地址來(lái)表示,例如:


0x20020 = 0x2002:0x0000
0x20020 = 0x2000:0x0020
0x20020 = 0x1FF0:0x0120


面對(duì)這3個(gè)選擇,我們當(dāng)然是選擇第1個(gè),而且只能選擇第1個(gè),因?yàn)榇a段內(nèi)部所有的地址偏移,在編譯的時(shí)候都是基于0地址的(也即是上面所說(shuō)的匯編地址),或者稱作相對(duì)地址。


明白了這個(gè)道理之后,就可以把cs:ip設(shè)置為0x2002:0x0100,這樣CPU就會(huì)到start標(biāo)簽處執(zhí)行了。


但是,在進(jìn)行這個(gè)操作之前還有其他幾件事情需要處理,因此,要把代碼段的邏輯段地址0x2002, 寫回到Header中的0x06 ~ 0x09這4個(gè)字節(jié)中保存起來(lái)(橙色部分):


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理

段表重定位

此時(shí),系統(tǒng)還是在bootloader的控制之下,數(shù)據(jù)段寄存器ds仍然為0x2000,想一想為什么?


因?yàn)?bootloader 讀取操作系統(tǒng)程序的第一扇區(qū)之前,希望把數(shù)據(jù)讀取到物理地址 0x20000 的地方,右移一位就得到了邏輯段地址 0x2000,把它寫入到數(shù)據(jù)段寄存器 ds 中。


我們一直忽略了 bootloader 使用的??臻g,因?yàn)檫@部分與文件主題無(wú)關(guān)。


操作系統(tǒng)程序如果想要執(zhí)行,必須使用自己程序文件中的數(shù)據(jù)段和棧段。


但是,Header中記錄的這2個(gè)段的開始地址,都是相對(duì)于程序文件開頭而言的。


而且操作系統(tǒng)文件并不知道:自己被 bootloader 讀取到內(nèi)存中的什么位置?


因此,bootloader也需要把這2個(gè)段,在內(nèi)存中的開始地址進(jìn)行重新計(jì)算,然后更新到Header中。


這樣的話,當(dāng)操作系統(tǒng)程序開始執(zhí)行的時(shí)候,才能從Header中得到數(shù)據(jù)段和棧段的邏輯段地址


當(dāng)然了,這里所舉的示例中只有3個(gè)段,一個(gè)實(shí)際的程序可能會(huì)包括很多個(gè)段,每一個(gè)段的地址都需要進(jìn)行重定位。


bootloader從Header的0x0A ~ 0x0B這 2 個(gè)字節(jié),可以得到一共有多少個(gè)段地址需要重定位。


然后按照順序,依次讀取每一個(gè)段的偏移地址,加上程序文件的加載地址(0x20000),計(jì)算出實(shí)際的物理地址,然后再得到邏輯段地址,具體如下:


代碼段偏移量 0x00020:0x20000 0x00020 = 0x20020(物理地址),右移一位得到邏輯段地址:0x2002;


數(shù)據(jù)段偏移量 0x0x01000: 0x20000 0x01000 = 0x21000(物理地址),右移一位得到邏輯段地址:0x2100;


棧段 段偏移量 0x0x01200: 0x20000 0x01200 = 0x21200(物理地址),右移一位得到邏輯段地址:0x2120;


下圖橙色部分:


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理我們把代碼段、數(shù)據(jù)段、棧段在內(nèi)存中的布局模型全部畫出來(lái):


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理

跳轉(zhuǎn)到程序的入口地址

萬(wàn)事俱備,只欠東風(fēng)!


一切工作已經(jīng)準(zhǔn)備就緒,最后一步就是進(jìn)入操作系統(tǒng)程序中代碼段的start入口點(diǎn)了。


在上面的準(zhǔn)備工作中,bootloader已經(jīng)把程序代碼段的邏輯段地址0x2002,保存在Header中的 0x06 ~ 0x09 這 4 個(gè)字節(jié)中了,只要把它賦值給代碼段寄存器cs即可。


程序入口點(diǎn)位于start標(biāo)簽處,它距離代碼段的開始位置偏移0x100,保存在Header中的 0x04 ~ 0x05 這 2 個(gè)字節(jié),只要把它賦值給指令指針寄存器ip即可。


我們可以手動(dòng)從內(nèi)存中讀取,然后賦值給 cs 和 ip 寄存器。


也可以直接利用 8086 CPU 中的這條指令:jmp [0x04] 來(lái)實(shí)現(xiàn)cs:ip的賦值。


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理因?yàn)榇丝踢€是在bootloader的控制下,數(shù)據(jù)段寄存器ds的值仍然為 0x2000,因此跳轉(zhuǎn)到0x2000:0x04內(nèi)置中所表示的地址,就可以把正確的邏輯段地址和指令地址賦值給cs:ip,從而開始執(zhí)行操作系統(tǒng)程序的第一條指令。


操作系統(tǒng)程序的執(zhí)行

操作系統(tǒng)的第一條指令在執(zhí)行時(shí),數(shù)據(jù)段寄存器ds和 棧段寄存器cs中的值,仍然為bootloader中所設(shè)置的值。


因此,操作系統(tǒng)首先要把這2個(gè)段寄存器設(shè)置為自己程序文件的值,然后才能開始后續(xù)指令的執(zhí)行。


上文已經(jīng)說(shuō)過(guò),每一個(gè)段在內(nèi)存中的邏輯段地址,已經(jīng)被bootloader重新計(jì)算,并且更新到了Header中。


所以,操作系統(tǒng)就可以從 ds:0x14 的位置,讀取新的棧段邏輯地址 0x2120,并把它賦值給棧段寄存器cs。


從這個(gè)時(shí)候開始,所有的棧操作就是操作系統(tǒng)程序自己的了。


注意:此時(shí)數(shù)據(jù)段寄存器 ds 仍然沒有改變,仍然是 bootloader 中使用的 0x2000。


然后再?gòu)?ds:0x10 的位置讀取新的數(shù)據(jù)段邏輯地址 0x2100,并把它賦值給數(shù)據(jù)段寄存器ds。


從這個(gè)時(shí)候開始,所有的數(shù)據(jù)操作就是操作系統(tǒng)程序自己的了。


Linux從頭學(xué)06:16張結(jié)構(gòu)圖,徹底理解【代碼重定位】的底層原理注意:給cs、ds的賦值順序不能顛倒。


如果先給ds賦值,那么再去Header中讀取cs邏輯段地址的時(shí)候,就沒法定位了。


因?yàn)榇藭r(shí)ds寄存器已經(jīng)指向了新的地址(ds = 0x2100),沒法再去0x2000:0x14地址處獲取數(shù)據(jù)了。


最后還有一點(diǎn),對(duì)于棧操作,除了設(shè)置棧的段寄存器ss外,還需要設(shè)置棧頂指針寄存器sp。


我們假設(shè)程序中設(shè)置的??臻g是512字節(jié),棧頂指針是向低地址方向增長(zhǎng)的,因此,需要把sp初始化為512。


至此,操作系統(tǒng)程序終于可以愉快的開始執(zhí)行了!



------ End ------
這篇文章,我們描述了關(guān)于代碼重定位的最底層原理。


在以后學(xué)習(xí)到Linux中的重定位相關(guān)知識(shí)時(shí),會(huì)接觸到更多的概念和技巧,但是最底層的基本原理都是相通的。


希望這篇文章,能夠成為你前進(jìn)路上的墊腳石!


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉