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

从start_kernel到init进程启动 《Linux内核分析》笔记 从start_kernel到init进程启动 《Linux内核分析》笔记GDB的使用在进入GDB调试前,首先掌握GDB最常用的命令,以方便完成跟踪。 b[reak] linenumber:加断点 s[tep]:单步进入 n[ext]:单步跳过 c[ontinue]:继续执行 r[un]:运行至结束或者崩溃 q[uit]:退出 info:查看已设置的断点和观察点 watch:设置观察点 其他有用的命令 阅读详情

这段时间在看《Linux内核源代码情景分析》,顺便写了一些感悟。读内核源代码是一件很有意思的事。它像一条线,把操作系统,编译原理,C语言,数据结构与算法,计算机体系结构等等计算机的基础课程串起来。

        我看内核源代码是用lxr+glimpse(不一定要自己架,可以直接访问校内外的lxr网站)的。如果在windows下也可以用source insight。以下的当前路径为内核源代码路径,通常为/usr/src/linux。内核版本为2.6.13,平台为x86

好,让我们开始Linux内核之旅。

      我们的出发点是在CPU加电的一刹那,系统处于16位实地址模式下,终点是内核开始运行start_kernel(),系统处于32位页式寻址的保护模式下。那时内核映象bzImage已经解压完毕,运行于内核态。系统中已经有了一个叫swapper的0号进程,有自己的内核堆栈,情况就相对好理解得多。(尽管与用户态程序相比,还要多操心不少事,包括对硬件的直接操作,内核态各种数据结构的初始化,对页表的操作等等)。不过,不妨先做些准备动作。

      首先,什么是内核?目前,只知道编译内核后,产生一个叫bzImage的压缩内核映象。它不同于任何普通的可执行程序。我们甚至不知道它从哪里开始执行。只知道把它往/boot/下一放,往boot loader的配置文件(例如grub的menu.lst)中写上相关信息,机子就顺利启动了。因此,我对它的生成过程产生了浓厚兴趣。于是,我查看了相关资料,最直接的资料来自于arch/i386/boot/下的Makefile。从Makefile中可以知道。bzImage的产生过程是这样的:不过我不满足于此。于是,我想到了去看arch/i386/boot/下的Makefile。从arch/i386/boot/Makefile和arch/i386/boot/compressed/Makefile中可以看出(具体过程省略,)

1.先生成vmlinux.这是一个elf可执行文件

2.然后objcopy成arch/i386/boot/compressed/vmlinux.bin,去掉了原elf文件中的一些无用的section等信息。

3.gzip后压缩为arch/i386/boot/compressed/vmlinux.bin.gz

4.把压缩文件作为数据段链接成arch/i386/boot/compressed/piggy.o

5.链接:arch/i386/boot/compressed/vmlinux = head.o+misc.o+piggy.o

其中head.o和misc.o是用来解压缩的。

6.objcopy成arch/i386/boot/vmlinux.bin,去掉了原elf文件中的一些无用的section等信息。

7.用arch/i386/boot/tools/build.c工具拼接bzImage = bootsect+setup+vmlinux.bin

过程好复杂。

      这里要介绍一下objcopy命令,它的作用是把一个object文件转化为另一种格式的文件。在这里,objcopy的作用就是去掉原来elf文件中的elf header和一些无用的section信息。为什么要这么做呢?因为elf文件中的elf header和一些section的作用是告诉elf loader如何载入elf可执行文件。但是,linux内核作为一种特殊的elf文件,需要特殊折辅助程序去装载它。往往它的装载地址是固定的。这时,为了保证通用性而存在的elf header和一些section对内核的装载就没有意义了。加上为了使内核尽可能小,所以干脆把这些信息去掉。

       我们可以看一下vmlinux和arch/i386/boot/compressed/vmlinux。用file命令查看,它们也是elf可执行文件。只是没有main函数而已

 

参考:

Documentation/kbuild/makefiles.txt

Documentation/kbuild/modules.txt

详情参考:http://www.top-e.org/jiaoshi/html/?192.html

 

BRAM在图像处理缓存中的实现:完整示例解析 深入讲解如何利用BRAM高效实现图像处理中的数据缓存,结合实际案例解析BRAM的应用优势与设计细节,提升系统性能。 阅读详情

相关推荐

二、ROS2完成Docker容器和宿主机通信,使用ros2 topic list看到,但是无法echo

如果容器和主机权限不一致,则会导致无法通信(我的代码中,docker容器是root,宿主机是普通用户),虽然可以查询到相关话题,但是订阅后没有消息输出。比如,docker容器创建了一个共享内存,其所有者为docker容器用户root,当宿主机去访问的时候,由于用户不同,没有权限访问,也就无法进行信息传递。该方法只是临时修改共享内存的权限,每次运行完,需要重新运行上述命令,才可以进行通信。在运行的过程中,ROS2使用了共享内存机制,会共享内存。运行之后,宿主机和容器可能用户名不同,这是因为。

qq_43280851的博客 1265

读核感悟-kbuild系统-make bzImage的过程

文章来源:http://www.top-e.org/jiaoshi/class/ 从以上例子中可以看到,内核的编译系统kbuild是个很庞大的系统。但是,它所使用的make和我们平时用的make是一模一样的。kbuild只是通过预定义一些变量(obj-m,obj-y等等)和目标(bzImage ,menuconfig等等),使内核的编译和扩展变得十分方便。我们不妨yy一下kbuild的一些

李亚锋老师 4052

Unity3d实现的十字路口的模拟(一)

最近学习了Unity3d这个游戏引擎,感觉真的是非常的强大,正好赶上操作系统课程要做一个模拟信号量的模拟程序,于是打算做一个模拟十字路口的程序,大致的实现要实现的成果是:存在四种不同的汽车,包括一辆警车(不受交通信号灯的控制)随机产生在不同的路口,并且有不同的行动路线如:直走,左转,右转等,当然还有交通信号灯来控制车辆的有序运行。可以展示不同的视角来观察路口的情况(利用Q,W,E,R分别控制不同的

永远在身边的专栏 7489

分析Linux内核启动过程:从start_kernel到init

郑德伦 原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 STEP1:在自己的linux系统中搭建实验环境。 1.下载linux-3.18.6的内核源码,并且编译 cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kerne

a363344923的专栏 1万+

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 503

Linux kernel 不输出log信息

/********************************************************************************* * Linux kernel 不输出log信息 * 说明: * 为了加快Kernel启动速度,可以通过quiet禁止log输出信息,加快开机启动速度。 * * ...

weixin_33859665的博客 847

simulink可控励磁同步电机模型分析

他励同步电机模型分析

qq_26681609的博客 5551

linux驱动模块开机自动加载,以及应用程序开机自启动

将测试程序放在/bin底下,然后用vi编辑/etc/init.d/rcS,加上/bin/应用程序名 &,加上&表示后台运行   这两个功能的实现都是通过设置启动脚本来实现的。启动脚本的一般存放路径是 /etc/init.d/rcS  (rcS即脚本文件),自启动应用程序一般放置于/etc/rc.d/init.d目录下。 我们需要用vi命令对rcS进行编辑,当然也可以通过其他方式对其进行覆盖。

不积跬步,无以至千里 6860

OmniDrive(3):逐行代码详解

模型效果: 端到端联合规划与推理 接下来,简单介绍下训练的配置 1.1 模型配置 模型基于sparse query based的3D Bev感知框架StreamPetr ,用query来编码动态目标(如车辆、行人)和静态地图元素(如车道线)。(1) tran、test和val数据配置 指定真值的文件路径: ann_file 指定输出处理的pipeline: 训练使用, test 和val使用 指定是否需要时序训练seq_mode (2)数据处理pipeline 自定义的Dataset 通过类实现,训

@bangbang的博客 720

飞行机械臂设计

其后对飞行机械臂系统的机 理模型和基于 ADAMS 的物理模型进行了控制系统的搭建,对于机理模 型,设计了三个输入通道,分别是俯仰力矩,翻滚力矩与偏航力矩,控 制量为翻滚角,俯仰角,偏航角。四旋翼无人机自身具有独特的优势,在无人机上增加机械臂,整个 机体系统相当于一架空中行动自如的空中机器人,可以适应更多的应用场合,能够实现空中抓取,运输载荷,巡航监视等任务。的函数模块如图 4-8 所示,可见输入为 U1,U2,U3,U4,分别对应总力矩,俯仰力矩,翻滚力矩,偏航力矩,控制 量为俯仰角,翻滚角,偏航角。

coldmood77的博客 2916

linux工作原理fiq,读Kernel感悟-Linux内核启动-内核的生成 - kernel hacker 修炼之道——李万鹏 - 博客频道 - 优快云...

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

weixin_30394019的博客 275

【GameFramework框架内置模块】1、全局配置(Config)

这是GameFramework框架内置模块的第一篇,全局配置Config,讲解这些模块的时候会尽量的涉及介绍、为什么使用、如何使用、代码分析这几块,让大家可以知其然,也知其所以然。全局配置表,存储了一些游戏中使用的全局的参数配置,比如玩家的初始速度、游戏初始音量等。全局配置表的结构跟DataTable结构类似,也是列行+键值对,只是没有ID这一列,因为全局配置也不需要用ID去查询, 是直接使用key值进行查询。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5886

读Kernel感悟-Linux内核启动-BIOS

文章来源:http://www.top-e.org/jiaoshi/html/?196.html “真罗嗦,直接告诉我Linux下用glibc库编译出来的C程序真正的入口地址是_start()不就行了么?”臭鸡蛋扑面而来。嗯,我说了我只是想用一种特别的方式来叙述问题。我更看重探索的过程中体现的思考方式以及其中的乐趣。回到我们的主题。Linux内核为什么不是从main函数开始执行?事

李亚锋老师 1310

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

文章来源:http://www.top-e.org/jiaoshi/class/一般来说,用户是不需要关心section的具体位置的。在用户态,内核会解析elf可执行文件的各个section,然后把它映射到虚拟地址空间。然而,在内核启动时,一切得从零开始。很多在用户态下应用程序不需要操心的东西,例如映射section的任务不得不由内核自己来完成。上一篇感悟揭示了内核如何建立页表,并且把自身

李亚锋老师 1596

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

读Kernel感悟-Linux内核启动-开启页面映射

文章来源:http://www.top-e.org/jiaoshi/class/ 在setup的帮助下,我们顺利地从16位实地址模式过渡到32位段式寻址的保护模式。又在arch/i386/boot/compressed/head.S的帮助下实现了内核的自解压,并且从arch/i386/kernel/head.S中的startup_32开始。现在在线性地址0x100000(1M)处开始就是我

李亚锋老师 2126

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

李亚锋老师 1277

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

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

李亚锋老师 1030

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

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

weixin_39877898的博客 118

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

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

weixin_42300400的博客 468

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

顶嵌专栏 871
上一篇: Android JNI实例
下一篇: 读Kernel感悟-Linux内核启动-从hello world说起
TopEmbedded
博客等级 码龄18年 58粉丝 61原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值