2018-2019-1 20189210 《LInux内核原理与分析》第四周作业

第三章
这一章接触内核源代码,对内核源码进行编译和调试跟踪
一、预备知识:
内核:整个操作系统的最底层,它负责了整个硬件的驱动以及提供各种系统所需的内核功能。内核实质上是系统上面的一个文件而已,这个文件包含了驱动主机各项硬件的检测程序与驱动模块。当系统读完BIOS并加载MBR内的引导装载程序后,就能够加载内核到内存当中。然后内核开始检测硬件,挂载根目录并取得内核模块来驱动所有的硬件,之后调用/sbin/init就能依序启动多有系统所需要的服务了。
Qemu :以GPL许可证分发源码的模拟处理器,能启动那些为不同中央处理器编译的Linux程序。

二、构造一个简单的Linux内核
构造的MenuOS系统是由Linux内核镜像和根文件系统集成起来的。
Linux内核在PC上以文件的形式存在(保存成磁盘文件形式),就是所谓的“映像文件”。内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。为了能使用zImage这个压缩版本,必须在它的开头加上解压缩的代码,将zImage 解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般都比较小,内核要常驻内存,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般嵌入式系统均采用压缩的内核映像文件,即zImage。
根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。

在实验楼中的虚拟机里,直接进入LinuxKernel目录使用如下命令就可以运行Linux内核源码和跟文件系统

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rotes.img

1510233-20181104233941431-489787744.png

其中bzImage是vmlinux经过gzip压缩后的文件,适用于大内核;vmLinux是编译出来的最原始的内核ELF文件;initrd是内存根文件系统,只创建了一个rootfs.img,其中只有一个init的功能,用menu程序替代init, 内核启动完成后进入menu程序。

三、跟踪调试Linux内核的启动过程
Qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rotes.img -s -S

-S CPU初始化之前将其冻结起来

-s 是默认在tcp::1234端口上创建了一个gdb-server

1510233-20181104233831729-1709899893.png

再打开一个窗口,启动gdb,把内核加载进来,建立连接
file linux-3.18.6/vmlinux #把带有符号表的内核镜像加载进来
target remote:1234 #用tcp:1234端口来链接gdb server

然后在start_kernel函数和rest_init处设置端点,调试运行

1510233-20181104233809286-1699980775.png

1510233-20181104233743879-210180252.png

四、对于start_kernel( )和rest_init( )的分析
start_kernel( )相当于main.c中的main函数,是首先运行的,在此函数调用之前,内核代码主要是汇编语言编写的,用于完成硬件系统的初始化工作,为C代码的运行设置环境。这个函数主要进行各个模块初始化工作,trap_init()(中断向量的初始化)、mm_init()(内存管理的初始化)sched_init()(调度模块的初始化)等。
init_task() :0号进程,初始化的起点
struct task_struct init_task = INIT_TASK(init_task);
可以看出 init_task(0号进程)是 task_struct 类型,是进程描述符,使用宏INIT_TASK对其进行初始化,并且init_task是唯一没有通过fork方式产生的进程。

1510233-20181104233655200-652358913.png

rest_init( ):
在此函数中调用kernel_thread进程来创建kernel_init和kthreadd内核线程

1510233-20181104233621750-950997862.png

kernel_init()内核线程为1号内核线程,负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve加载init程序,最后演变成用户态1号进程——init进程。
kthreadd()函数的任务是管理和调度其他内核线程 kernel_thread。for 循环中运行 kthread_create_list 全局链表中维护的 kthread, 在create_kthread()函数中,会调用 kernel_thread 来生成一个新的进程并被加入到此链表中,因此所有的内核线程都是直接或者间接的以 kthreadd 为父进程。
小结:
本周学习了Linux内核源代码,对于内核的源代码目录,编译过程有了进一步的了解,但在学习中总会遇到新的问题,例如kernel_thread进程是由init零号进程fork出来的,以及idle进程与0号进程的关系,内核线程与用户进程的区别,这些问题在CSDN论坛中大部分都以解决,但发现内核内部的知识非常高深,还需多多查阅资料

转载于:https://www.cnblogs.com/20189210mujian/p/9906672.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 配置weblogic home时,weblogic version无法选择

问题原因: D:\Oracle\Middleware\wlserver_10.3缺少注册文件 解决方法: 把D:\Oracle\Middleware下的registry.xml文件,复制一份到D:\Oracle\Middleware\wlserver_10.3中就可以解决。

linux测试网络是否连通ping、telnet命令

ping 可以测试到目标机器的连通性,ping域名还可以得出解析IP。 ping ip地址 例:ping 127.0.0.1图例: telent测试端口是否开放。 telent ip地址 端口号 例如:telent 127.0.0.1 8080

2018ACM-ICPC国际大学生程序设计竞赛亚洲区域赛(青岛站)赛后总结

这是今年最后一次打铁,我已经打了一年的铁了。 还是想写一个总结,不然,什么都会没留下。 实际上在去青岛之前,我已经一个月都没有严格地训练自己了,从9月份CCPC秦皇岛站打铁之后,我就基本上开始怀疑自己了&…

引用js/css时,加入时间戳解决浏览器缓存问题

解决思路&#xff1a;在引入的url后面加上时间戳&#xff0c;每次请求获取最新的js/css var timestampnew Date().getTime()&#xff1b;<script type"text/javascript" src"****.js?t"timestamp></script>

MySQL数据库编译过程

编译安装MySQL 准备工作 卸载rpm方式安装的mysql-server、mysql 安装ncurses-devel和cmake包 yum -y install ncurses-devel cmake tar xf cmake-2.8.6.tar.gz -C /usr/src cd /usr/src/cmake-2.8.6/ ./configure && gmake && gmake install 这个过程需要时间源…

window.open()详解

语法 window.open(URL,name,specs,replace) var specs"height400,width600,alwaysRaised,directoriesno,toolbarno,titlebarno,menubarno,scrollbarsno, resizableno,locationno, statusno";返回值&#xff1a; oNewWindow : 对象(Element)。返回对新的 window 对…

深入了解Kubernetes REST API的工作方式

关于Kubernetes REST API的工作方式&#xff1a; 在哪里以及如何定义从REST路径到处理REST调用的函数的映射&#xff1f; 与etcd的交互发生在哪里&#xff1f; 从客户端发出请求到保存在etcd中对象的端到端路径是怎样的&#xff1f; Kubernetes REST框架 Kubernetes REST实现可…

mapper 判断条件为null

在双引号里面再判断不为空 <if test"name ! null and name !" > and name #{name} </if>

gitlab hook触发jenkins自动构建

意义&#xff0c;gitlab推送或合并代码后触发jenkin自动构建发布代码或者执行命令推送规则 1.安装gitlab和hook插件有时需要重启jenkins服务&#xff0c;可能兼容性问题&#xff0c;安装完之后构建中看不到hook插件 2.配置jenkins构建中的hook插件下图中圈出为必选&#xff0c;…

The content of elements must consist of well-formed character data or markup

SQL语句中包括XML预定义字符&#xff0c;则需将SQL语句放在<![CDATA[ ]]> 中。在 XML 中有 5 个预定义的实体引用&#xff1a; 预定义字符 说明 < 小于 > 大于 & 和号单引号 " 双引号例子&#xff1a; <if test"id ! null and id ! ">a…

Python开发【第一篇】:初识Python

1. Python简介 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;由Guido van Rossum于1989年底发明。 1.1 Python 介绍 1. 开发语言 低级语言&#xff1a;C、汇编等&#xff08;机器码&#xff09;高级语言&#xff1a;Python、Java、PHP、C# 等&am…

[Ljava.lang.String; cannot be cast to java.lang.String

问题描述&#xff1a;不能把String[]转化为String类型。 解决方案&#xff1a; String name ((String[])request.getAttribute(“name”))[0];

Transactional 事务

1、事务场景中&#xff0c;抛出异常被catch后&#xff0c;如果需要回滚&#xff0c;一定要手动回滚 其实像第一种try catch这种把整个包裹起来&#xff0c;这种业务方法也就等于脱离了spring事务的管理&#xff0c;因为没有任何异常会从业务方法中抛出&#xff0c;全被捕获并“…

oracle varchar2改成大字段类型clob,读取大字段内容

oracle varchar2&#xff08;4000&#xff09;改成大字段类型clob&#xff0c;如果需要改成大字段的varchar2列有内容&#xff0c;不能直接用 alter table med_generic modify option07 blob; 直接用上面的会提示&#xff1a;ORA-22858: 数据类型的变更无效 因此&#xff0c;修…

React 点击按钮显示div与隐藏div

<!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>React 点击按钮显示div与隐藏div</title><script src"https://unpkg.com/react16/umd/react.development.js"></script><script src"…

For input string:

问题描述&#xff1a;在进行类型转换的时候&#xff0c;输入的字符串为空值造成的 解决方案&#xff1a;对字符串进行非空判断就可以&#xff0c;输入 if(str ! null && !.equals(str)){//类型转换; }

long型转String

long a1 12;String s1 a1 ""; // 法1&#xff1a;直接加空串System.out.println(s1);long a2 34;String s2 String.valueOf(a2); // 法2&#xff1a;String.valueOf()System.out.println(s2);long a3 56;String s3 Long.toString(a3); …

004-linux常用命令-权限管理命令

权限管理命令&#xff1a;chmod命令名称&#xff1a;chmod命令英文原意&#xff1a;change the permissions mode of a file命令所在路径&#xff1a;/bin/chmod执行权限&#xff1a;所有用户语法&#xff1a;chmod [{ugoa}{-}{rwx}] [文件或目录][mode421 ] [文件或目录]-R 递…

B cannot be cast to java.sql.Blob

问题描述&#xff1a;BLOB类型的数据从数据库提取出来&#xff0c;提示不能强制转换为BLOG 解决方案&#xff1a;转换为二进制数组 byte[] object (byte[]) Map.get("blob");

SSH-key连接原理

1&#xff0c;我们想通过远程的方式从我的电脑远程连接到对方的电脑上那么在LINUX系统下我们可以通过一种叫ssh的方式连接过去。SSH客户端&#xff08;ssh命令&#xff09;还包含一个很有用的远程安全拷贝命令scp。 2&#xff0c;有两种连接方式&#xff0c; &#xff08;1&…