1.源码方式安装特定版本 Linux Kernel 步骤
2.å¦ä½å¨linuxä¸ä½¿ç¨systemc
3.Linux内核源码解析---万字解析从设计模式推演per-cpu实现原理
源码方式安装特定版本 Linux Kernel 步骤
源码方式安装特定版本Linux Kernel 步骤详解
本文将详细介绍通过源码方式安装指定版本Linux Kernel(本文以6.2.0版本为例)的步骤。在安装过程中,您需要下载软件仓库(upstream),配置内核以适应特定需求,并最终完成内核的安装。此外,caffe的源码解析您将学习如何更新Grub配置以确保系统使用新内核启动。
安装前准备:确认操作系统为RHEL(Linux)环境,并拥有root权限。所有命令默认在root权限下执行。确保基础的Linux开发工具已安装,安装过程中如需补充工具则会自动进行。
步骤1:下载并切换到特定版本的Linux Kernel仓库
1.1 下载Linux Kernel仓库至/home目录,后续命令将自动安装于适当位置,无需更改文件名。对于6.2.0版本,无需特别修改文件名。
步骤2:配置内核以自定义属性
2.1 使用配置工具自定义内核属性。有多种方式:完全重新配置或导入并修改之前的前端源码压缩配置文件(.config),最终生成新的配置文件(.config),旧配置文件则命名为(.config.old)。
步骤3:编译Linux Kernel生成bzImage文件
步骤4:默认安装Linux Kernel模块,存储于/lib/modules文件夹。
步骤5:安装Linux Kernel,自动安装至/boot文件夹下,包含System.map-6.2.0-upstream、initramfs-6.2.0-upstream.img、vmlinuz-6.2.0-upstream,更新链接关系至新生成文件。
更新Grub配置
1.1 设置启动内核,使用--set-default参数后跟启动的Linux Kernel版本。
1.2 选择启动cmdline(非必要),使用--remove-args和--args参数添加或删除cmdline参数。
1.3 查看Grub配置。
1.4 生成新的Grub配置文件,位置根据服务器启动方式决定。
重新启动计算机并配置Linux Kernel
若服务器包含其他Linux Kernel版本,rocket源码作者指定特定版本内核并设置启动命令行参数。
1.1 修改启动命令行参数(若需要)。
1.2 重新安装Linux Kernel,删除旧版本文件。操作原因:安装过程自动链接相关文件,重新设置链接关系。删除旧文件标记为.old。
1.3 重新生成/boot/grub/grubenv文件,并验证配置。
1.4 重启计算机。
检查安装结果
通过命令检查Linux Kernel版本,确认安装过程无误。
本文详细介绍了源码方式安装特定版本Linux Kernel的完整步骤,包括下载仓库、配置内核、编译及安装内核,以及更新Grub配置。最后,jeecg pro源码通过重启计算机验证安装结果。希望此指南能够帮助您顺利完成Linux Kernel的安装。
å¦ä½å¨linuxä¸ä½¿ç¨systemc
1ã./configure ;2ãmake ;3ã make install;SystemCä¹ä¸ä¾å¤ãå°ä¸è½½çæºç 解åå°æ件夹å¦ï¼/home/user/DirAï¼userä»£è¡¨ä½ çç¨æ·åï¼DirAè¡¨ç¤ºä½ å建çæ个ç®å½ï¼
1 cd /home/user/DirA
2
3 ./configure -prefix=INSTALL_DIR //ç¨-prefix=æå®è¦å®è£ å°çç®å½è·¯å¾ï¼æ¤è·¯å¾å¿ 须已ç»åå¨ï¼
4
5 make
6
7 make install
åºæ¬å°±å¯ä»¥äºï¼ææ¯å¨èææºä¸çå°çº¢å¸½ï¼æçå®è£ éå°ä¸äºå°çé误ï¼ä¸»è¦æ¯example没æå®è£ è¿å»ï¼docsä¹æ²¡æï¼ä½ç±»åºé½å·²ç»å®è£ 好äºï¼
æ§è¡ make check æ£æ¥å®è£ æ¯å¦æåï¼make check æå就没é®é¢äºï¼æçæ¯æåç¶æã
æåçå®è£ ç®å½å¦ä¸ï¼
2ãVC6++/VS SystemC使ç¨
åé¢è¯´è¿ï¼SystemCå®é ä¸æ¯ä¸ä¸ªC++ç±»åºï¼å æ¤ï¼VCæè VSä¸ä½¿ç¨SystemCå°±æ¯å¤é¨åºç使ç¨ã
åºç¼è¯ï¼ä¸è½½è§£ååçsystemc-versionä¸æmsvcçç®å½ï¼ä¸é¢æå·¥ç¨æ件ï¼ç´æ¥å¯ä»¥æå¼ç¼è¯å³å¯å¾å°SystemCçåºã
æ°å»ºå·¥ç¨ï¼
åºæ·»å ï¼
1ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-è¿æ¥å¨-常è§ï¼æ·»å é件åºç®å½
2ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-è¿æ¥å¨-è¾å ¥ï¼æ·»å åº
3ï¼é¡¹ç®å³é®-å±æ§-é ç½®å±æ§-C/C++-常è§ï¼æ·»å 头æ件æå¨ç®å½
ç¼åsc_hello.cpp代ç å¦ä¸å¹¶æ·»å å°å·¥ç¨ï¼
1 // sc_helloworld.cpp : å®ä¹æ§å¶å°åºç¨ç¨åºçå ¥å£ç¹ã
2 //
3
4 #include "systemc.h"
5 SC_MODULE(hello)
6 {
7 sc_in<bool> clock;
8 void run()
9 {
cout << "@"<<sc_simulation_time<<" hello world" <<endl;
}
SC_CTOR(hello)
{
SC_METHOD(run);
sensitive<<clock.pos();
}
};
int sc_main(int argc, char* argv[])
{
sc_clock clk("clock",,SC_NS);
hello h("hello");
h.clock(clk);
sc_start(,SC_NS);
system("pause");
return 0;
}
Linux内核源码解析---万字解析从设计模式推演per-cpu实现原理
引子
在如今的大型服务器中,NUMA架构扮演着关键角色。它允许系统拥有多个物理CPU,不同NUMA节点之间通过QPI通信。虽然硬件连接细节在此不作深入讨论,但需明白每个CPU优先访问本节点内存,当本地内存不足时,可向其他节点申请。从传统的SMP架构转向NUMA架构,主要是为了解决随着CPU数量增多而带来的总线压力问题。
分配物理内存时,numa_node_id() 方法用于查询当前CPU所在的NUMA节点。频繁的内存申请操作促使Linux内核采用per-cpu实现,将CPU访问的变量复制到每个CPU中,以减少缓存行竞争和False Sharing,类似于Java中的电影上传源码Thread Local。
分配物理页
尽管我们不必关注底层实现,buddy system负责分配物理页,关键在于使用了numa_node_id方法。接下来,我们将深入探索整个Linux内核的per-cpu体系。
numa_node_id源码分析获取数据
在topology.h中,我们发现使用了raw_cpu_read函数,传入了numa_node参数。接下来,我们来了解numa_node的定义。
在topology.h中定义了numa_node。我们继续跟踪DECLARE_PER_CPU_SECTION的定义,最终揭示numa_node是一个共享全局变量,类型为int,存储在.data..percpu段中。
在percpu-defs.h中,numa_node被放置在ELF文件的.data..percpu段中,这些段在运行阶段即为段。接下来,我们返回raw_cpu_read方法。
在percpu-defs.h中,我们继续跟进__pcpu_size_call_return方法,此方法根据per-cpu变量的大小生成回调函数。对于numa_node的int类型,最终拼接得到的是raw_cpu_read_4方法。
在percpu.h中,调用了一般的read方法。在percpu.h中,获取numa_node的绝对地址,并通过raw_cpu_ptr方法。
在percpu-defs.h中,我们略过验证指针的环节,追踪arch_raw_cpu_ptr方法。接下来,我们来看x架构的实现。
在percpu.h中,使用汇编获取this_cpu_off的地址,代表此CPU内存副本到".data..percpu"的偏移量。加上numa_node相对于原始内存副本的偏移量,最终通过解引用获得真正内存地址内的值。
对于其他架构,实现方式相似,通过获取自己CPU的偏移量,最终通过相对偏移得到pcp变量的地址。
放入数据
讨论Linux内核启动过程时,我们不得不关注per-cpu的值是如何被放入的。
在main.c中,我们以x实现为例进行分析。通过setup_percpu.c文件中的代码,我们将node值赋给每个CPU的numa_node地址处。具体计算方法通过early_cpu_to_node实现,此处不作展开。
在percpu-defs.h中,我们来看看如何获取每个CPU的numa_node地址,最终还是通过简单的偏移获取。需要注意如何获取每个CPU的副本偏移地址。
在percpu.h中,我们发现一个关键数组__per_cpu_offset,其中保存了每个CPU副本的偏移值,通过CPU的索引来查找。
接下来,我们来设计PER CPU模块。
设计一个全面的PER CPU架构,它支持UMA或NUMA架构。我们设计了一个包含NUMA节点的结构体,内部管理所有CPU。为每个CPU创建副本,其中存储所有per-cpu变量。静态数据在编译时放入原始数据段,动态数据在运行时生成。
最后,我们回到setup_per_cpu_areas方法的分析。在setup_percpu.c中,我们详细探讨了关键方法pcpu_embed_first_chunk。此方法管理group、unit、静态、保留、动态区域。
通过percpu.c中的关键变量__per_cpu_load和vmlinux.lds.S的链接脚本,我们了解了per-cpu加载时的地址符号。PERCPU_INPUT宏定义了静态原始数据的起始和结束符号。
接下来,我们关注如何分配per-cpu元数据信息pcpu_alloc_info。percpu.c中的方法执行后,元数据分配如下图所示。
接着,我们分析pcpu_alloc_alloc_info的方法,完成元数据分配。
在pcpu_setup_first_chunk方法中,我们看到分配的smap和dmap在后期将通过slab再次分配。
在main.c的mm_init中,我们关注重点区域,完成map数组的slab分配。
至此,我们探讨了Linux内核中per-cpu实现的原理,从设计到源码分析,全面展现了这一关键机制在现代服务器架构中的作用。