RM新时代网站-首页

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

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

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

Linux之引導(dǎo)內(nèi)存分配器

Linux閱碼場(chǎng) ? 來源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2022-07-22 11:17 ? 次閱讀

3.6 引導(dǎo)內(nèi)存分配器

在內(nèi)核初始化的過程中需要分配內(nèi)存,內(nèi)核提供了臨時(shí)的引導(dǎo)內(nèi)存分配器,在頁分配器和塊分配器初始化完畢后,把空閑的物理頁交給頁分配器管理,丟棄引導(dǎo)內(nèi)存分配器。

早期使用的引導(dǎo)內(nèi)存分配器是 bootmem,目前正在使用 memblock 取代 bootmem。如果開啟配置宏 CONFIG_NO_BOOTMEMmemblock 就會(huì)取代 bootmem。為了保證兼容性,bootmem memblock 提供了相同的接口。

3.6.1 bootmem 分配器

bootmem 分配器使用的數(shù)據(jù)結(jié)構(gòu)如下:

include/linux/bootmem.h typedef struct bootmem_data {  unsigned long node_min_pfn;  unsigned long node_low_pfn;  void *node_bootmem_map;  unsigned long last_end_off;  unsigned long hint_idx;  struct list_head list; } bootmem_data_t;

下面解釋結(jié)構(gòu)體 bootmem_data 的成員。

1node_min_pfn 是起始物理頁號(hào)。

2node_low_pfn 是結(jié)束物理頁號(hào)。

3node_bootmem_map 指向一個(gè)位圖,每個(gè)物理頁對(duì)應(yīng)一位,如果物理頁被分配,把對(duì)應(yīng)的位設(shè)置為 1。

4last_end_off 是上次分配的內(nèi)存塊的結(jié)束位置后面一個(gè)字節(jié)的偏移。

5hint_idx 的字面意思是“暗示的索引”,是上次分配的內(nèi)存塊的結(jié)束位置后面的物理頁在位圖中的索引,下次優(yōu)先考慮從這個(gè)物理頁開始分配。

每個(gè)內(nèi)存節(jié)點(diǎn)有一個(gè) bootmem_data 實(shí)例:


include/linux/mmzone.h typedef struct pglist_data { #ifndef CONFIG_NO_BOOTMEM  struct bootmem_data *bdata; #endif } pg_data_t;

bootmem 分配器的算法如下。

1)只把低端內(nèi)存添加到 bootmem 分配器,低端內(nèi)存是可以直接映射到內(nèi)核虛擬地址空間的物理內(nèi)存。

2)使用一個(gè)位圖記錄哪些物理頁被分配,如果物理頁被分配,把這個(gè)物理頁對(duì)應(yīng)的位設(shè)置成 1。

3)采用最先適配算法,掃描位圖,找到第一個(gè)足夠大的空閑內(nèi)存塊。

4)為了支持分配小于一頁的內(nèi)存塊,記錄上次分配的內(nèi)存塊的結(jié)束位置后面一個(gè)字節(jié)的偏移和后面一頁的索引,下次分配時(shí),從上次分配的位置后面開始嘗試。如果上次分配的最后一個(gè)物理頁的剩余空間足夠,可以直接在這個(gè)物理頁上分配內(nèi)存。

bootmem 分配器對(duì)外提供的分配內(nèi)存的函數(shù)是 alloc_bootmem 及其變體,釋放內(nèi)存的函數(shù)是 free_bootmem。分配內(nèi)存的核心函數(shù)是源文件“mm/bootmem.c”中的函數(shù) alloc_bootmem_bdata

ARM64 架構(gòu)的內(nèi)核已經(jīng)不使用 bootmem 分配器,但是其他處理器架構(gòu)還在使用 bootmem分配器。

3.6.2 memblock 分配器

1.?dāng)?shù)據(jù)結(jié)構(gòu)

memblock 分配器使用的數(shù)據(jù)結(jié)構(gòu)如下:


include/linux/memblock.h struct memblock {  bool bottom_up; /* 是從下向上的方向?*/  phys_addr_t current_limit;  struct memblock_type memory;  struct memblock_type reserved; #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP  struct memblock_type physmem; #endif };

成員 bottom_up 表示分配內(nèi)存的方式,值為真表示從低地址向上分配,值為假表示從高地址向下分配。

成員 current_limit 是可分配內(nèi)存的最大物理地址。

接下來是 3 種內(nèi)存塊:memory 是內(nèi)存類型(包括已分配的內(nèi)存和未分配的內(nèi)存),reserved 是預(yù)留類型(已分配的內(nèi)存),physmem 是物理內(nèi)存類型。物理內(nèi)存類型和內(nèi)存類型的區(qū)別是:內(nèi)存類型是物理內(nèi)存類型的子集,在引導(dǎo)內(nèi)核時(shí)可以使用內(nèi)核參數(shù)mem=nn[KMG]指定可用內(nèi)存的大小,導(dǎo)致內(nèi)核不能看見所有內(nèi)存;物理內(nèi)存類型總是包含所有內(nèi)存范圍,內(nèi)存類型只包含內(nèi)核參數(shù)“mem=”指定的可用內(nèi)存范圍。

內(nèi)存塊類型的數(shù)據(jù)結(jié)構(gòu)如下:


include/linux/memblock.h struct memblock_type {  unsigned long cnt; /* 區(qū)域數(shù)量 */  unsigned long max; /* 已分配數(shù)組的大小 */  phys_addr_t total_size; /* 所有區(qū)域的長度 */  struct memblock_region *regions;  char *name; };

內(nèi)存塊類型使用數(shù)組存放內(nèi)存塊區(qū)域,成員 regions 指向內(nèi)存塊區(qū)域數(shù)組,cnt 是內(nèi)存塊區(qū)域的數(shù)量,max 是數(shù)組的元素個(gè)數(shù),total_size 是所有內(nèi)存塊區(qū)域的總長度,name 是內(nèi)存塊類型的名稱。

內(nèi)存塊區(qū)域的數(shù)據(jù)結(jié)構(gòu)如下:


include/linux/memblock.h struct memblock_region {  phys_addr_t base;  phys_addr_t size;  unsigned long flags; #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP  int nid; #endif }; /* memblock標(biāo)志位的定義. */ enum {  MEMBLOCK_NONE = 0x0, /* 無特殊要求 */  MEMBLOCK_HOTPLUG = 0x1, /* 可熱插拔區(qū)域 */  MEMBLOCK_MIRROR = 0x2, /* 鏡像區(qū)域 */  MEMBLOCK_NOMAP = 0x4, /* 不添加到內(nèi)核直接映射 */ };

成員 base 是起始物理地址,size 是長度,nid 是節(jié)點(diǎn)編號(hào)。成員 flags 是標(biāo)志,可以是MEMBLOCK_NONE 或其他標(biāo)志的組合。

1MEMBLOCK_NONE 表示沒有特殊要求的區(qū)域。

2MEMBLOCK_HOTPLUG 表示可以熱插拔的區(qū)域,即在系統(tǒng)運(yùn)行過程中可以拔出或插入物理內(nèi)存。

3MEMBLOCK_MIRROR 表示鏡像的區(qū)域。內(nèi)存鏡像是內(nèi)存冗余技術(shù)的一種,工作原理與硬盤的熱備份類似,將內(nèi)存數(shù)據(jù)做兩個(gè)復(fù)制,分別放在主內(nèi)存和鏡像內(nèi)存中。

4MEMBLOCK_NOMAP 表示不添加到內(nèi)核直接映射區(qū)域(即線性映射區(qū)域)。

2.初始化

源文件“mm/memblock.c”定義了全局變量 memblock,把成員 bottom_up 初始化為假,表示從高地址向下分配。

ARM64 內(nèi)核初始化 memblock 分配器的過程是:

1)解析設(shè)備樹二進(jìn)制文件中的節(jié)點(diǎn)“/memory”,把所有物理內(nèi)存范圍添加到 memblock.memory,具體過程參考 3.6.3 節(jié)。

2)在函數(shù) arm64_memblock_init 中初始化 memblock。

函數(shù) arm64_memblock_init 的主要代碼如下:


start_kernel() ->setup_arch() -> arm64_memblock_init() arch/arm64/mm/init.c1 void __init arm64_memblock_init(void) 2 { 3 const s64 linear_region_size = -(s64)PAGE_OFFSET; 4 5 fdt_enforce_memory_region(); 6 7 memstart_addr = round_down(memblock_start_of_DRAM(), 8 ARM64_MEMSTART_ALIGN); 146 3.6 引導(dǎo)內(nèi)存分配器9 10 memblock_remove(max_t(u64, memstart_addr + linear_region_size, 11 __pa_symbol(_end)), ULLONG_MAX); 12 if (memstart_addr + linear_region_size < memblock_end_of_DRAM()) { 13 /* 確保memstart_addr嚴(yán)格對(duì)齊 */ 14 memstart_addr = round_up(memblock_end_of_DRAM() - linear_region_size, 15 ARM64_MEMSTART_ALIGN); 16 memblock_remove(0, memstart_addr); 17 } 18 19 if (memory_limit != (phys_addr_t)ULLONG_MAX) { 20 memblock_mem_limit_remove_map(memory_limit); 21 memblock_add(__pa_symbol(_text), (u64)(_end - _text)); 22 } 23 24 25 memblock_reserve(__pa_symbol(_text), _end - _text); 26 27 28 early_init_fdt_scan_reserved_mem(); 29 30 }

5 行代碼,調(diào)用函數(shù) fdt_enforce_memory_region 解析設(shè)備樹二進(jìn)制文件中節(jié)點(diǎn)“/chosen的屬性“linux,usable-memory-range”,得到可用內(nèi)存的范圍,把超出這個(gè)范圍的物理內(nèi)存范圍從 memblock.memory 中刪除。

7 行和第 8 行代碼,全局變量 memstart_addr 記錄內(nèi)存的起始物理地址。

1017 行代碼,把線性映射區(qū)域不能覆蓋的物理內(nèi)存范圍從 memblock.memory 中刪除。

1922 行代碼,設(shè)備樹二進(jìn)制文件中節(jié)點(diǎn)“/chosen”的屬性“bootargs”指定的命令行中,可以使用參數(shù)“mem”指定可用內(nèi)存的大小。如果指定了內(nèi)存的大小,那么把超過可用長度的物理內(nèi)存范圍從 memblock.memory 中刪除。因?yàn)閮?nèi)核鏡像可以被加載到內(nèi)存的高地址部分,并且內(nèi)核鏡像必須是可以通過線性映射區(qū)域訪問的,所以需要把內(nèi)核鏡像占用的物理內(nèi)存范圍重新添加到 memblock.memory 中。

25 行代碼,把內(nèi)核鏡像占用的物理內(nèi)存范圍添加到 memblock.reserved 中。

28 行代碼,從設(shè)備樹二進(jìn)制文件中的內(nèi)存保留區(qū)域(memory reserve map,對(duì)應(yīng)設(shè)備樹源文件的字段“/memreserve/”)和節(jié)點(diǎn)“/reserved-memory”讀取保留的物理內(nèi)存范圍,添加到 memblock.reserved 中。

3編程接口

memblock 分配器對(duì)外提供的接口如下。

1memblock_add:添加新的內(nèi)存塊區(qū)域到 memblock.memory 中。

2memblock_remove:刪除內(nèi)存塊區(qū)域。

3memblock_alloc:分配內(nèi)存。

4memblock_free:釋放內(nèi)存。

為了兼容 bootmem 分配器,memblock 分配器也實(shí)現(xiàn)了 bootmem 分配器提供的接口。如果開啟配置宏 CONFIG_NO_BOOTMEMmemblock 分配器就完全替代了 bootmem 分配器。

4.算法

memblock 分配器把所有內(nèi)存添加到 memblock.memory 中,把分配出去的內(nèi)存塊添加memblock.reserved 中。內(nèi)存塊類型中的內(nèi)存塊區(qū)域數(shù)組按起始物理地址從小到大排序。

函數(shù) memblock_alloc 負(fù)責(zé)分配內(nèi)存,把主要工作委托給函數(shù) memblock_alloc_range_nid,算法如下。

1)調(diào)用函數(shù) memblock_find_in_range_node 以找到?jīng)]有分配的內(nèi)存塊區(qū)域,默認(rèn)從高地址向下分配。

函數(shù) memblock_find_in_range_node 有兩層循環(huán),外層循環(huán)從高到低遍歷 memblock.memory的內(nèi)存塊區(qū)域數(shù)組;針對(duì)每個(gè)內(nèi)存塊區(qū)域 M1,執(zhí)行內(nèi)層循環(huán),從高到低遍歷 memblock.reserved的內(nèi)存塊區(qū)域數(shù)組。針對(duì)每個(gè)內(nèi)存塊區(qū)域 M2,目標(biāo)區(qū)域是內(nèi)存塊區(qū)域 M2 和前一個(gè)內(nèi)存塊區(qū)域之間的區(qū)域,如果目標(biāo)區(qū)域?qū)儆趦?nèi)存塊區(qū)域 M1,并且長度大于或等于請(qǐng)求分配的長度,那么可以從目標(biāo)區(qū)域分配內(nèi)存。

2)調(diào)用函數(shù) memblock_reserve,把分配出去的內(nèi)存塊區(qū)域添加到 memblock.reserved 中。

函數(shù) memblock_free 負(fù)責(zé)釋放內(nèi)存,只需要把內(nèi)存塊區(qū)域從 memblock.reserved 中刪除。

3.6.3 物理內(nèi)存信息

在內(nèi)核初始化的過程中,引導(dǎo)內(nèi)存分配器負(fù)責(zé)分配內(nèi)存,問題是:引導(dǎo)內(nèi)存分配器怎么知道內(nèi)存的大小和物理地址范圍?

ARM64 架構(gòu)使用扁平設(shè)備樹(Flattened Device TreeFDT)描述板卡的硬件信息,好處是可以把板卡特定的代碼從內(nèi)核中刪除,編譯生成通用的板卡無關(guān)的內(nèi)核。驅(qū)動(dòng)開發(fā)者編寫設(shè)備樹源文件(Device Tree Source,DTS),存放在目錄“arch/arm64/boot/dts”下,然后使用設(shè)備樹編譯器(Device Tree Compiler,DTC)把設(shè)備樹源文件轉(zhuǎn)換成設(shè)備樹二進(jìn)制文件(Device Tree Blob,DTB),接著把設(shè)備樹二進(jìn)制文件寫到存儲(chǔ)設(shè)備上。設(shè)備啟動(dòng)時(shí),引導(dǎo)程序把設(shè)備樹二進(jìn)制文件從存儲(chǔ)設(shè)備讀到內(nèi)存中,引導(dǎo)內(nèi)核的時(shí)候把設(shè)備樹二進(jìn)制文件的起始地址傳給內(nèi)核,內(nèi)核解析設(shè)備樹二進(jìn)制文件后得到硬件信息。

設(shè)備樹源文件是文本文件,擴(kuò)展名是“.dts”,描述物理內(nèi)存布局的方法如下:


/ {  #address-cells = <2>;  #size-cells = <2>;  memory@80000000 {  device_type = "memory";  reg = <0x00000000 0x80000000 0 0x80000000>,  <0x00000008 0x80000000 0 0x80000000>;  }; };

/”是根節(jié)點(diǎn)。

屬性“#address-cells”定義一個(gè)地址的單元數(shù)量,屬性“#size-cells”定義一個(gè)長度的單元數(shù)量。單元(cell)是一個(gè) 32 位數(shù)值,屬性“#address-cells = <2>”表示一個(gè)地址由兩個(gè)單元組成,即地址是一個(gè) 64 位數(shù)值;屬性“#size-cells = <2>”表示一個(gè)長度由兩個(gè)單元組成,即長度是一個(gè) 64 位數(shù)值。

memory”節(jié)點(diǎn)描述物理內(nèi)存布局,“@”后面的設(shè)備地址用來區(qū)分名字相同的節(jié)點(diǎn),如果節(jié)點(diǎn)有屬性“reg”,那么設(shè)備地址必須是屬性“reg”的第一個(gè)地址。如果有多塊內(nèi)存,可以使用多個(gè)“memory”節(jié)點(diǎn)來描述,也可以使用一個(gè)“memory”節(jié)點(diǎn)的屬性“reg”的地址/長度列表來描述。

屬性“device_type”定義設(shè)備類型,“memory”節(jié)點(diǎn)的屬性“device_type”的值必須是memory”。

屬性“reg”定義物理內(nèi)存范圍,值是一個(gè)地址/長度列表,每個(gè)地址包含的單元數(shù)量是由根節(jié)點(diǎn)的屬性“#address-cells”定義的,每個(gè)長度包含的單元數(shù)量是由根節(jié)點(diǎn)的屬性#size-cells”定義的。在上面的例子中,第一個(gè)物理內(nèi)存范圍的起始地址是“0x000000000x80000000”,長度是“0 0x80000000”,即起始地址是 2GB,長度是 2GB;第二個(gè)物理內(nèi)存范圍的起始地址是“0x00000008 0x80000000”,長度是“0 0x80000000”,即起始地址是34GB,長度是 2GB。

內(nèi)核在初始化的時(shí)候調(diào)用函數(shù) early_init_dt_scan_nodes 以解析設(shè)備樹二進(jìn)制文件,從而得到物理內(nèi)存信息。


start_kernel() ->setup_arch() ->setup_machine_fdt() ->early_init_dt_scan() ->early_init_dt_scan_nodes() drivers/of/fdt.c1 void __init early_init_dt_scan_nodes(void) 2 { 3 4 /* 初始化size-cells和address-cells信息 */ 5 of_scan_flat_dt(early_init_dt_scan_root, NULL); 6 7 /* 調(diào)用函數(shù)early_init_dt_add_memory_arch設(shè)置內(nèi)存 */ 8 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 9 }

5 行代碼,調(diào)用函數(shù) early_init_dt_scan_root,解析根節(jié)點(diǎn)的屬性“#address-cells”得到地址的單元數(shù)量,保存在全局變量 dt_root_addr_cells 中;解析根節(jié)點(diǎn)的屬性“#size-cells得到長度的單元數(shù)量,保存在全局變量 dt_root_size_cells 中。

8 行代碼,調(diào)用函數(shù) early_init_dt_scan_memory,解析“memory”節(jié)點(diǎn)得到物理內(nèi)存布局。

函數(shù) early_init_dt_scan_memory 負(fù)責(zé)解析“memory”節(jié)點(diǎn),其主要代碼如下:


drivers/of/fdt.c1 int __init early_init_dt_scan_memory(unsigned long node, const char *uname, 2 int depth, void *data) 3 { 4 const char *type = of_get_flat_dt_prop(node, "device_type", NULL); 5 const __be32 *reg, *endp; 6 int l; 7 8 9 /* 只掃描 "memory" 節(jié)點(diǎn) */ 10 if (type == NULL) { 11 /* 如果沒有屬性“device_type”,判斷節(jié)點(diǎn)名稱是不是“memory@0”*/ 12 if (!IS_ENABLED(CONFIG_PPC32) || depth != 1 || strcmp(uname, "memory@0") != 0) 13 return 0; 14 } else if (strcmp(type, "memory") != 0) 15 return 0; 1617 reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); 18 if (reg == NULL) 19 reg = of_get_flat_dt_prop(node, "reg", &l); 20 if (reg == NULL) 21 return 0; 22 23 endp = reg + (l / sizeof(__be32)); 24 25 26 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 27 u64 base, size; 28 29 base = dt_mem_next_cell(dt_root_addr_cells, ®); 30 size = dt_mem_next_cell(dt_root_size_cells, ®); 31 32 if (size == 0) 33 continue; 34 35 early_init_dt_add_memory_arch(base, size); 36 37 } 38 39 return 0; 40 }

4 行代碼,解析節(jié)點(diǎn)的屬性“device_type”。

14 行代碼,如果屬性“device_type”的值是“memory”,說明這個(gè)節(jié)點(diǎn)描述物理內(nèi)存信息。

1719 行代碼,解析屬性“linux,usable-memory”,如果不存在,那么解析屬性“reg”。這兩個(gè)屬性都用來定義物理內(nèi)存范圍。

2637 行代碼,解析出每塊內(nèi)存的起始地址和大小后,調(diào)用函數(shù) early_init_dt_add_memory_arch

函數(shù) early_init_dt_add_memory_arch 的主要代碼如下:


drivers/of/fdt.cvoid __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) {  const u64 phys_offset = MIN_MEMBLOCK_ADDR;  if (!PAGE_ALIGNED(base)) {  if (size < PAGE_SIZE - (base & ~PAGE_MASK)) {  pr_warn("Ignoring memory block 0x%llx - 0x%llx
",  base, base + size);  return;  }  size -= PAGE_SIZE - (base & ~PAGE_MASK);  base = PAGE_ALIGN(base);  }  size &= PAGE_MASK;  if (base > MAX_MEMBLOCK_ADDR) {  pr_warning("Ignoring memory block 0x%llx - 0x%llx
",  base, base + size);  return;  }  if (base + size - 1 > MAX_MEMBLOCK_ADDR) {  pr_warning("Ignoring memory range 0x%llx - 0x%llx
", ((u64)MAX_MEMBLOCK_ADDR)+1,base+size); size = MAX_MEMBLOCK_ADDR - base + 1;  }  if (base + size < phys_offset) {  pr_warning("Ignoring memory block 0x%llx - 0x%llx
",  base, base + size);  return;  }  if (base < phys_offset) {  pr_warning("Ignoring memory range 0x%llx - 0x%llx
",  base, phys_offset);  size -= phys_offset - base;  base = phys_offset;  } memblock_add(base, size); }

函數(shù) early_init_dt_add_memory_arch 對(duì)起始地址和長度做了檢查以后,調(diào)用函數(shù)memblock_add 把物理內(nèi)存范圍添加到 memblock.memory 中。

審核編輯 :李倩


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

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209322
  • 分配器
    +關(guān)注

    關(guān)注

    0

    文章

    193

    瀏覽量

    25747
  • 初始化
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    11850

原文標(biāo)題:《Linux內(nèi)核深度解析》選載之引導(dǎo)內(nèi)存分配器

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CDCL1810A 1.8V、10 輸出高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810A 1.8V、10 輸出高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-23 10:08 ?0次下載
    CDCL1810A 1.8V、10 輸出高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCL1810 1.8V 10路輸出高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810 1.8V 10路輸出高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-22 11:14 ?0次下載
    CDCL1810 1.8V 10路輸出高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE18005高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE18005高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE18005高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE62005高性能時(shí)鐘發(fā)生器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE62005高性能時(shí)鐘發(fā)生器和分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE62005高性能時(shí)鐘發(fā)生器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    LMK01000高性能時(shí)鐘緩沖器、分頻器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《LMK01000高性能時(shí)鐘緩沖器、分頻器和分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 09:53 ?0次下載
    LMK01000高性能時(shí)鐘緩沖器、分頻器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    液壓分配器起什么作用的

    液壓分配器是一種用于控制液壓系統(tǒng)中液體流量和壓力的設(shè)備。它在許多工業(yè)和工程應(yīng)用中發(fā)揮著重要作用,例如在液壓升降機(jī)、液壓挖掘機(jī)、液壓起重機(jī)等設(shè)備中。以下是液壓分配器的主要功能和原理: 流量控制 :液壓分配器
    的頭像 發(fā)表于 07-10 10:56 ?920次閱讀

    液壓分配器工作原理是什么

    液壓分配器,又稱液壓多路閥,是液壓系統(tǒng)中的關(guān)鍵部件之一。它的作用是將液壓泵輸出的油液分配到各個(gè)執(zhí)行機(jī)構(gòu),實(shí)現(xiàn)液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器的工作原理 液壓分配器的基本組成 液壓
    的頭像 發(fā)表于 07-10 10:55 ?1772次閱讀

    液壓分配器壓力調(diào)整方法有哪些

    液壓分配器,又稱液壓分配器或液壓分流器,是一種用于液壓系統(tǒng)中的設(shè)備,主要用于將液壓系統(tǒng)中的壓力油分配到各個(gè)執(zhí)行元件,以實(shí)現(xiàn)對(duì)液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器壓力調(diào)整的重要性 液壓
    的頭像 發(fā)表于 07-10 10:53 ?1940次閱讀

    單線分配器與雙線分配器的區(qū)別是什么

    單線分配器與雙線分配器是兩種不同類型的電子設(shè)備,它們?cè)谕ㄐ拧V播、電視等領(lǐng)域中有著廣泛的應(yīng)用。本文將介紹單線分配器與雙線分配器的區(qū)別。 一、定義 單線
    的頭像 發(fā)表于 07-10 10:44 ?873次閱讀

    四路數(shù)據(jù)分配器的基本概念、工作原理、應(yīng)用場(chǎng)景及設(shè)計(jì)方法

    四路數(shù)據(jù)分配器是一種數(shù)字電路元件,它的作用是將一個(gè)數(shù)據(jù)輸入信號(hào)分配成多個(gè)數(shù)據(jù)輸出信號(hào)。 1. 四路數(shù)據(jù)分配器的基本概念 四路數(shù)據(jù)分配器是一種多路復(fù)用器(Multiplexer),它將一
    的頭像 發(fā)表于 07-10 10:42 ?1516次閱讀

    八路數(shù)據(jù)分配器的基本概念及工作原理

    八路數(shù)據(jù)分配器是一種常見的電子設(shè)備,用于將一個(gè)輸入信號(hào)分配到多個(gè)輸出端。在本文中,我們將詳細(xì)介紹八路數(shù)據(jù)分配器的基本概念、工作原理、應(yīng)用場(chǎng)景以及設(shè)計(jì)方法。 一、八路數(shù)據(jù)分配器的基本概念
    的頭像 發(fā)表于 07-10 10:40 ?1888次閱讀

    DS90LV110T 1至10 LVDS數(shù)據(jù)/時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS90LV110T 1至10 LVDS數(shù)據(jù)/時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-05 11:37 ?0次下載
    DS90LV110T 1至10 LVDS數(shù)據(jù)/時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    Linux內(nèi)核內(nèi)存管理slab分配器

    本文在行文的過程中,會(huì)多次提到cache或緩存的概念。如果沒有特殊在前面添加硬件的限定詞,就說明cache指的是slab分配器使用的軟件緩存的意思。如果添加了硬件限定詞,則指的是處理器的硬件緩存,比如L1-DCache、L1-ICache之類的。
    的頭像 發(fā)表于 02-22 09:25 ?1203次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>內(nèi)存</b>管理<b class='flag-5'>之</b>slab<b class='flag-5'>分配器</b>

    Linux內(nèi)核內(nèi)存管理ZONE內(nèi)存分配器

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請(qǐng)求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請(qǐng)求。
    的頭像 發(fā)表于 02-21 09:29 ?890次閱讀

    請(qǐng)問為什么CAN不使用手動(dòng)引腳分配器來更改引腳?

    了 Pin28 (P2.8) 使用手動(dòng)引腳分配器,它起作用了, 然后想把 \" sync2 \" 從 Pin25 (P2.15) 改為 Pin1 (P0.1), 但是在手動(dòng)引腳分配器
    發(fā)表于 01-30 07:24
    RM新时代网站-首页