读Kernel感悟-Linux内核启动-链接脚本

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜 未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。 阅读详情

文章来源:http://www.top-e.org/jiaoshi/class/

一般来说,用户是不需要关心section的具体位置的。在用户态,内核会解析elf可执行文件的各个section,然后把它映射到虚拟地址空间。然而,在内核启动时,一切得从零开始。很多在用户态下应用程序不需要操心的东西,例如映射section的任务不得不由内核自己来完成。上一篇感悟揭示了内核如何建立页表,并且把自身的一部分映射到虚拟地址。内核还要负责对BSS段(所有在代码中未定义的全局变量)的初始化(设置为0),这就要求内核知道section的具体位置(否则如何知道该映射哪一部分呢?)

此外,在开启页面映射的过程中,我最为疑惑的是几个常量(页目录swapper_pg_dir,页表pg0等等)是如何确定的。扩展一下。gcc链接可执行文件时,是如何确定变量的地址的?按理说应该有某种途径(命令行参数或者文件)告诉链接器ld如何定位这些变量。最普通如hello world。为什么_start的地址是0x80482e0?于是想到,我们需要一个文件来指定各个section的虚拟地址。在内核源代码里,还看到这个文件arch/i386/kernel/vmlinux.lds.S。不像是普通的汇编文件。原来这就是linker scripts链接器脚本。

在链接器脚本中,.表示当前location counter地址计数器的值。默认为0。

017   . = __KERNEL_START;

表示地址计数器从__KERNEL_START(0xc00100000)开始。

.text:{...}

表示.text section包含了哪几个section

031   . = ALIGN(16);

则表示对齐方式。

具体格式可以调用info ld查看Linker Scripts一节。

链接器脚本指定了各个section的起始位置和结束位置。它还允许程序员在脚本中对变量进行赋值。这使内核可以通过__initcall_start和__initcall_end之类的变量获得段的起始地址和结束地址,从而对某些段进行操作。

根据链接器脚本,以及nm vmlinux的结果,内核中各个section的虚拟地址就很清楚了。以我的机子为例(粗略):

地址分配

text section

从_text:c0100000 A _text

到_etext:c0436573 A _etext

Exception table

从__start___ex_table:c0436580 A __start___ex_table

到__stop___ex_table:c04370b8 A __stop___ex_table

RODATA read only section

.data writable section

.data_nosave section

从__nosave_begin:c050f000 A __nosave_begin

到__nosave_end:c050f000 A __nosave_end

.data.page_aligned section

.data.cacheline_aligned section

.data.read_mostly section

.data.init_task section

init section

从__init_begin c0514000 A __init_begin

到__init_end c0540000 A __init_end

其中.initcall.init section:

从__initcall_start:c053b570 A __initcall_start

到__initcall_end:c053b8c0 A __initcall_end

BSS section

从__bss_start c0540000 A __bss_start

到__bss_end c0594c78 A __bss_stop

其中 swapper进程的页表

从c0540000 B swapper_pg_dir

到c0541000

共一页

empty_zero_page

从c0541000 B empty_zero_page

到c0542000

共一页

pg0 页目录0

从c0595000 A pg0

到init_pg_tables_end

.exitcall.exit

 section

stab section

几个比较重要的section:

bss section,存放在代码里未初始化的全局变量,最后初始化为0。

init sections,所有只在初始化时调用的函数和变量,包括所有在内核启动时调用的函数,以及内核模块初始化时调用的函数。其中最特别的是.initcall.init section。通过__initcall_start和__initcall_end,内核可以调用里面所有的函数。这些section在使用一次后就可以释放,从而节省内存。

12、有杆泵抽油系统:原理、性能与选择 本文全面介绍了有杆泵抽油系统的原理、性能分析和设备选择方法。有杆泵抽油系统广泛应用于石油开采领域,通过地面抽油装置与井下柱塞泵的配合,实现高效、稳定的原油提升。文章详细解析了系统的工作原理、组成结构、光杆运动特性、载荷计算、泵输送能力及功率需求,并提供了抽油装置的选择流程和实际案例分析。此外,还探讨了泵的容积效率影响因素、示功图的作用及系统优化运行的建议,为石油开采工程提供了理论支持和实践指导。 阅读详情

相关推荐

linux内核链接脚本

内容提要 本文简单的介绍了理解内核链接脚本需要的链接器知识和链接脚本语法,从vmlinux_32.lds.S文件分析了内核image的构成,并着重讲解了使用自定义section配合链接脚本动态创建表的方法。这里或许有一些你经常看到但不了解原理的东西,例如“内核导出符号表是如何创建的?”、“__initcall修饰的函数在什么时候被内核调用?”、“__initdata是否会被释放?”等。

Linux 内核链接脚本vmlinux.lds.S详解

现代软件工程中,一个大的工程通常都会有多个源文件组成,其中包括高级计算机语言编写的源文件,以及汇编语言编写的汇编文件。在编译构建过程中会分别对这些源文件进行汇编、编译生成目标文件,这些目标文件包含:代码段、数据段、符号表等内容。链接器主要任务是将符号引用解析到符号定义上,将多个目标文件和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。本文主要针对 ARM64架构的连接脚本进行剖析。因为 vmlinux.lds.S 的内容比较多,本文将其拆分后分析。

私房菜 3027

Linux下的lds链接脚本基础[0].pdf

Linux下的lds链接脚本基础.pdf 链接器把一个或多个输入文件合成一个输出文件. 输入文件: 目标文件或链接脚本文件. 输出文件: 目标文件或可执行文件. 目标文件(包括可执行文件)具有固定的格式, 在UNIX或GNU/Linux平台下, 一般为ELF格式.

Linux内核链接脚本

转载地址: http://blog.chinaunix.net/space.php?uid=20499746&do=blog&view=me&frmd=-1&classid=0&page=1 1. 什么是链接脚本 链接器主要有两个作用,一是将若干输入文件(.o文件)根据一定规则合并为一个输出文件(例如ELF格式的可执行文件);一是将符号与地址绑定(当然加载器也要完成这一部分工作)。关于

2589

内核配置与编译——内核链接脚本

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 962

内核(kernel)的链接脚本

链接脚本的产生 kernel链接脚本和uboot的不同,uboot的链接脚本是源文件的一部分,而kernel链接脚本在源文件中是找不到的,要经过编译才会产生。链接脚本的名字是vmlinux.lds,由汇编文件vmlinux.lds.S生成。用汇编文件动态生成链接脚本,可以实现条件编译,这样可以根据需求生成不同的内核镜像。 备注:vmlinux.lds.S在arch/xxx/kernel/目录下,其中xxx是CPU的架构。 链接脚本 OUTPUT_ARCH(arm) ENTRY(stext) jiff

weixin_42031299的博客 1775

linux kernel】基于ARM64分析linux内核链接脚本vmlinux.lds.S

本文基于ARM64分析linux内核链接脚本

iriczhao的博客 2268

Kernel感悟-Linux内核启动-内核的生成

这段时间在看《Linux内核源代码情景分析》,顺便写了一些感悟内核源代码是一件很有意思的事。它像一条线,把操作系统,编译原理,C语言,数据结构与算法,计算机体系结构等等计算机的基础课程串起来。        我看内核源代码是用lxr+glimpse(不一定要自己架,可以直接访问校内外的lxr网站)的。如果在windows下也可以用source insight。以下的当前路径为内核源代码路径

李亚锋老师 1990

Linux kernel 分析之七:内核启动-链接脚本

一般来说,用户是不需要关心section的具体位置的。在用户态,内核会解析elf可执行文件的各个section,然后把它映射到虚拟地址空间。然而,在内核启动时,一切得从  零开始。很多在用户态下应用程序不需要操心的东西,例如映射section的任务不得不由内核自己来完成。上一篇感悟揭示了内核如何建立页表,并且把自身的一部分映射到虚拟地址。内核还要负责对BSS段(所有在代码中未定义的全局变量)的初

vanileo的专栏 2551

Kernel感悟-Linux内核启动-内核解压缩

 文章来源:http://www.top-e.org/jiaoshi/class/ 这得从vmliux.bin的产生过程说起。从内核的生成过程来看内核链接主要有三步:第一步是把内核的源代码编译成.o文件,然后链接,这一步,链接的是arch/i386/kernel/head.S,生成的是vmlinux。注意的是这里的所有变量地址都是32位页寻址方式的保护模式下的虚拟地址。通常在

李亚锋老师 1270

Kernel感悟-Linux内核启动-setup辅助程序

文章来源:http://www.top-e.org/jiaoshi/class/ 我们发现,在起点与终点之间,还有几个中转站。最近的一站叫作MBR。BIOS,带你到MBR后,说:“对不起,只能送你到这里了。”那其它几个中转站是什么呢?我们知道,在x86上,保护模式有两种,32位页式寻址的保护模式和32位段式寻址的保护模式。显然,32位页式寻址的保护模式要求系统中已经构造好页表。从16位

李亚锋老师 1024

linux内核感悟,Kernel感悟-Linux内核启动-从hello world说起

内核是从哪里开始执行的呢?几乎任何一本源代码分析的书都会给出详细的答案。不过,我试图从一个不同的角度(一个初学者的角度)来叙述,而不是一上来就给出答案。从熟悉的事物入手,慢慢接近陌生的事物,这是比较常见的思路。既然都是二进制代码,那么不妨从最简单的用户态C程序,helloworld开始。说不定能找到共同点。恰好我是一个喜欢寻根究底的人。也许,理解了helloworld程序的启动过程,有助于更好...

weixin_39877898的博客 117

Kernel感悟-Linux内核启动-从hello world说起

顶嵌专栏 869

安卓linux内核解包,Kernel感悟-Linux内核启动-内核解压缩

这得从vmliux.bin的产生过程说起。从Linux内核的生成过程来看内核链接主要有三步:第一步是把内核的源代码编译成.o文件,然后链接,这一步,链接的是arch/i386/kernel/head.S,生成的是vmlinux。注意的是这里的所有变量地址都是32位页寻址方式的保护模式下的虚拟地址。通常在3G以上。第二步,将vmlinux objcopy 成arch/i386/boot/compr...

weixin_42300400的博客 466

linux内核连接脚本,linux内核链接脚本详解

3.3 构造Section在构建了基本的segment后,就可以从输入.o文件中获取感兴趣的section以生成新的section并放入相应的segment。在这里,输入的section称为inputsection,生成的新section称为output section。除此之外,有一个重要的链接脚本符号“.”需要了解。”.”是个位置计数器,记录着当前位置在目标文件中的虚拟地址(VMA)。”.”是...

weixin_32408723的博客 1062

kernel.lds 链接脚本

kernel.ldskernel.lds是一个,用于,定义。

zjkyeah的博客 377

arm架构Linux5.0内核连接脚本文件vmlinux.lds.S分析

vmlinux.lds.S 是 Linux 内核中用于链接脚本文件,用于定义内核对象文件的内存布局,即它告诉链接器如何将不同的内核代码段和数据段组合成一个最终的内核映像 vmlinux。编译内核源码生成内核文件的过程分两步,一个是“编译”,另一个是“链接”的过程,vmlinux.lds.S要做的就是告诉编译器如何链接编译好的各个内核.o文件,从而生成vmlinux文件。

jianjian的博客 1811

反光衣检测数据集1+1000IMG+已标注.zip

反光衣目标检测数据集1000张,已标注的数据集,目标检测项目,实际工程项目,可直接进行训练,yolo系列

上一篇: Linux内核中EXPORT_SYMBOL的用法
下一篇: 读Kernel感悟-伪装现场-系统调用参数
TopEmbedded
博客等级 码龄18年 58粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值