2019-5-3

主要内容摘自 孟宁《庖丁解牛Linux内核分析》

天下大事必作于细,天下难事必作于易

1.计算机三大法宝

存储程序计算机

函数调用堆栈

中断

2.虚拟一个x86的CPU硬件平台

2.1 虚拟环境搭建

sudo apt-get install qemu # 安装qemu

sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu # 生成qemu-system-i386的符号链接qemu

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz # 下载linux-3.9.4.tar.xz

# 下载mykernel补丁

wget https://www.raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch

xz -d linux-3.9.4.tar.xz

tar -xvf linux-3.9.4.tar

cd linux-3.9.4

patch -p1 < ../mykernel_for_linux3.9.4sc.patch # 添加补丁,注意参数为p1不是pl

make allnoconfig

make # 编译mykernel

qemu -kernel arch/x86/boot/bzImage

2.2使用mykernel编写时间片轮转多道程序内核

1.mykernel相关文件

mypcb.h

mymain.c

myinterrupt.c

2.使用gdb调试内核

gdb # 运行gdb

# 在gdb程序中,输入:

file linux3.9.4/vmlinux # 加载符号表

target remote:1234 # 建立连接

break start_kernel # 插入断点

3.MenuOS的构造

3.1 Linux内核源代码简介

操作系统两把“宝剑”

中断上下文

进程上下文

使用版本:linux-3.18.6

内核分析中重要的文件:

arch/x86

init/main.c

kernel

linux readme

what is linux?

on what hardware does it run?

documentation

installing the kernel source

software requirements

build directory for the kernel

configuring the kernel

compiling the kernel

if something goes wrong

编译安装内核大概步骤

(1) 安装开发包组

(2) 下载源码文件

(3) .config:准备内核选项

(4) make menuconfig:配置内核选项

(5) make [-j #]

(6) make modules_install:安装模块

(7) make install:安装内核相关文件

(8) 安装bzImage为/boot/vmlinuz-VERSION_RELEASE

(9) 生成initramfs文件

(10) 编辑grub的配置文件

2.编译配置选项

(1) 配置内核选项

(2) 支持“更新”模式进行配置:make help

make config:在命令行中以遍历的方式去配置内核中可配置的每一个选项。

make menuconfig:基于curses的文本窗口界面

make gconfig:基于GTK(GNOME)环境窗口界面

make xconfig:基于QT(KDE)环境的窗口界面

(3) 支持“全新配置”模式进行配置

make defconfig:基于内核为目标平台提供的默认配置进行配置

make allyesconfig:所有选项回答为"yes"

make allnoconfig:所有选项回答为"no"

3.编译

make [-j #] : 全部编译

3.2 构造一个简单的Linux内核

编译、运行、跟踪源代码

MenuOS:由Linux内核和该文件系统集成

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

解释

qemu: 仿真kernel的虚拟机;

bzImage:vmLinux经过gzip压缩后的文件,是压缩的内核映像,‘b‘表示‘big‘(bzImage适用于大内核,zImage适用于小内核);

vmLinux:编译出来的最原始的内核ELF文件;

根文件系统:一般包含内存根文件和磁盘文件系统

initrd:是“initial ramdisk”简写,普通用户一般感受不到这个内存根文件系统的存在,因为普通Linux在启动时,是boot loader将存储介质中的initrd文件加载到内存,内核启动时先访问initrd文件系统(内存根文件系统),然后再切换到磁盘文件系统。为简化实验只使用了initrd根文件系统

(1)下载内核源代码并解压

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz

xz -d linux-3.18.6.tar.xz

tar -xvf linux-3.18.6.tar

cd linux-3.18.6

make i386_defconfig

make

(2)制作根文件系统(返回上级目录)

mkdir rootfs

git clone https:/github.com/mengning/menu.git

cd menu

gcc pthread -o init linkable.c menu.c test.c -m32 -static

cd ../rootfs

cp ../menu/init ./ # 将init复制到rootfs下

find . | cpio -o -Hnewc | gzip -9 > ../rootfs.img # 把当前rootfs下的所有文件打包成一个镜像文件

配置内核编译选项出现的问题

[email protected]:~/kernel/linux-3.18.6$ make menuconfig

HOSTLD scripts/kconfig/mconf

/usr/bin/ld: scripts/kconfig/zconf.tab.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC

/usr/bin/ld: final link failed: Nonrepresentable section on output

collect2: error: ld returned 1 exit status

scripts/Makefile.host:100: recipe for target 'scripts/kconfig/mconf' failed

make[1]: *** [scripts/kconfig/mconf] Error 1

Makefile:541: recipe for target 'menuconfig' failed

make: *** [menuconfig] Error 2

原因及解决方法

原因:gcc版本太高,ubuntu18自带gcc版本为7.4,高版本gcc默认开启-fPIC(Position independent code)支持动态库的重定位

方法:安装gcc-4.8,生成新的/usr/bin/gcc链接,重新配置menuconfig再编译即可

原文:https://www.cnblogs.com/vincent-zhu/p/10806241.html

庖丁解牛山linux内核的析,# 庖丁解牛Linux内核分析笔记-1相关推荐

  1. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1

    2019-5-3 主要内容摘自 孟宁<庖丁解牛Linux内核分析> 天下大事必作于细,天下难事必作于易 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断 2.虚拟一个x86的CPU硬 ...

  2. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核-1

    这个文集是用来记录 庖丁解牛Linux内核 这个课程的笔记和作业.错误之处,恳请指出. 实验目地 通过这个实验,主要了解到C函数的调用在汇编层面的逻辑. 实验内容 C程序 首先我们准备了一个简单的函数 ...

  3. 基于Linux的UART驱动框架源码分析笔记

    文章目录 前言 一.I.MX6ULL串口接收和发送方式 1.非DMA方式 1.1.接收方式 1.2 发送方式 2.DMA方式 2.1.接收方式 2.2 发送方式 二.UART驱动注册 1.uart_r ...

  4. 庖丁解牛Linux内核分析01:操作系统工作原理基础

    目录 1 存储程序计算机工作模型 2 IA-32汇编基础 2.1 寄存器概述 2.1.1 通用寄存器 2.1.2 段寄存器 2.1.3 标志寄存器 2.2 数据格式 2.3 寻址方式 2.3.1 立即 ...

  5. 庖丁解牛linux内核,庖丁解牛Linux网络核心

    通过TCP协议进行C/S模式的网络通信 学习要由浅入深.由易到难,分析Linux内核中网络部分就要从内核对外提供的socket封装接口说起,典型以TCP协议C/S方式socket通信大致过程如图所示: ...

  6. 《庖丁解牛Linux内核》笔记之:调用堆栈

    <庖丁解牛Linux内核>笔记之:调用堆栈 参考视频 基础知识介绍 在基础知识里讲过在使用cal调用函数时,会在之前的堆栈上创建一个新的堆栈,这里想讨论的就是如何实现调用函数时的参数传递. ...

  7. 《庖丁解牛Linux内核》笔记之:汇编基础

    <庖丁解牛Linux内核>笔记之:汇编基础 参考视频 下面的说法都来自x86CPU寄存器. 值的不同表示方法 %eax 类似这种就是直接操作该寄存器,效果类似于C语言中的指针:*和& ...

  8. linux内核日志使用syslog,Linux日志系统syslog详解

    一台服务器的日志对系统工程师来说是至关重要的,一旦服务器出现故障或被入侵,我们需要查看日志来定位问题的关键所在,所以说对于线上跑的服务器而言日志应该合理的处理及管理.下面来介绍下linux系统的sys ...

  9. linux内核中的jiffies,Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

    在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构 struct timeval { time_t tv_s ...

最新文章

  1. Datagridview中数字格式列 不显示小数点前面的0
  2. linux亲和性,两种亲和性
  3. 简单的相似图片搜索的原理
  4. 钉钉服务器端SDK PHP版
  5. 基于事件驱动架构构建微服务第8部分:在应用程序上实现事件溯源
  6. android同步aar到jcenter,android上传aar到jcenter
  7. 【转】使用python进行多线程编程
  8. MySQL8.0——Resource Group(资源组)
  9. Dart 10-Day
  10. 微信小程序之下拉刷新,上拉更多列表实现
  11. 【Playable API】不用Animator如何播放动画?
  12. 拼多多开除即将拿到股票的安全大佬;虾米音乐将永久关停;GitHub 解禁伊朗开发者使用权
  13. 修改Android Studio默认的gradle配置文件
  14. 线程之线程池(ExecutorService)
  15. html实现太极图效果
  16. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十周题解(个人向仅供参考)
  17. 以太坊:在合约里调用指定地址的另一已部署合约
  18. opensuse下安装网易云音乐netease-cloud-music
  19. 共享打印机提示“0x00000709”错误的解决方法
  20. AS2021为工具 AOSP为源码 rk开发板为目标设备 调式app到android framework service

热门文章

  1. iOS小技能:监听H5页面goBack返回事件 网页监听APP返回键 (NavigationBackItemInjection)
  2. 关于新光源建设的一些想法
  3. 悲欢离合是红尘,坎坎坷坷是人生
  4. mysql官方系在教程_MySQL系列教程(四)
  5. tdm gcc怎么运行c语言,TDM-GCC 64位
  6. CSS篇-dbMovies和dbBooks小网页
  7. SD卡CF卡U盘硬盘等磁盘属性显示为0字节怎么恢复数据
  8. 关于Linux服务器中文字体的安装
  9. RO、RW和ZI的区别
  10. 字节跳动前端实习一面