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下的所有文件打包成一个镜像文件

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

zgd@zgd-ThinkPad-X260:~/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再编译即可

庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1相关推荐

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

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

  2. Linux使用百度云

    2019独角兽企业重金招聘Python工程师标准>>> 百度云没有Linux客户端,于是有大神用Go语言写出来一个叫BaiduPCS-Go的命令行盘客户端,可以通过终端操作百度云盘, ...

  3. QNAP 威联通(NAS)安装百度云(Linux方案)

    之前在下 一直是用精简WIN10虚拟方案中跑win的百度云,但是作者本人的453bmini主频1.5G着实有一些弱鸡的性能,稍微同时跑5个下载线程虚拟机基本就跟卡死没区别了.就想着能否有一些替代方案. ...

  4. 【Python】调用百度云API驾驶行为分析 Driver Behavior

    # encoding:utf-8 # !/usr/local/bin/python3# 百度云:驾驶行为分析 # 应用名称:驾驶行为分析测试import urllib3 from urllib.par ...

  5. 解决百度云下载过慢、Linux下载百度云数据问题

    1. 找到你要下载的百度云链接 我这里是:https://pan.baidu.com/s/1uzwqLaCXcWe06xEXk1ROWw 2. 第二步找到文件实际下载路径 两种方式: 使用f12/Fn ...

  6. 百度同步盘linux客户端,技术|Linux下百度云的Python客户端(支持Unicode)

    bypy - 百度云/百度网盘的Python客户端 下载地址: Copyright 2013 Hou Tianze (GitHub: houtianze, Twitter: @ibic, G+: +T ...

  7. 解决:Linux版百度云客户端 BCloud网络错误 问题

    国内很多云盘渐渐停止服务支持,如新浪.华为.115.360等... 强大的百度云,你会继续免费让大家使用吗? 今天在Linux上使用了liulang的BCloud百度云客户端,登陆之后不显示主页,什么 ...

  8. linux微信教程 百度云,2019-03-08 linux安装QQ,微信,百度云,迅雷

    介绍 在linux下使用QQ等流行的windows软件一直是国内很多linux用户的需求,之前要实现这个需求用户往往需要对wine进行很多繁琐的配置,但即使这样最后跑出来的软件也是功能残缺的,只能满足 ...

  9. linux镜像 百度云

    转发的下面为链接,大家进去吧.还是比较全的,有些貌似不能下载 http://www.linuxfly.org/post/659/ 不为什么,就为了方便搜索,特把红帽EL 5.EL6.EL7 的各版本整 ...

最新文章

  1. 经典面试题:ES如何做到亿级数据查询毫秒级返回?
  2. aspx页面引用html页面
  3. a3国际服服务器未响应,A3幸存者国际服
  4. Mybatis基本配置和搭建
  5. DMN 1.1 XML:使用Drools 7.0从建模到自动化
  6. a pycharm 标记多个_每周分享五个 PyCharm 使用技巧(二)
  7. js传中文参数 java取_js中文转码传输java后台 适用于用url传递中文参数
  8. 019、Linux性能监控:memory
  9. (20)Verilog HDL并行块:fork-join
  10. thikPHP框架部署
  11. netty mysql 中间件_阿里开源Mysql分布式中间件:Cobar
  12. Adb 微信APP降级工具使用教程
  13. java必备基础5(集合list、set、map)
  14. Udacity CH2中.bag 文件解析
  15. P8700和T9600对比测试
  16. 10bit色深灰度图彩色图加载显示
  17. tumblr_使用Google Analytics(分析)获取有关您的Tumblr博客的详细统计信息
  18. X61的intel wireless 3945abg 不再掉线了
  19. XShell常用命令大全
  20. 基于FPGA的简易DDS信号发生器的设计(一)

热门文章

  1. 想不想修真鸿蒙源液有什么用,想不想修真初代小世界怎么玩_想不想修真初代小世界玩法介绍_玩游戏网...
  2. Oracle常见ORA错误及解决办法
  3. 微信开发者工具和gitee实现多人协作
  4. git clone失败的一种解决办法
  5. java乘方运算符号_Java 4. 运算符号
  6. 华为策略路由加等价路由_思科华为路由器如何利用route-map配置双wan口策略路由...
  7. HTML跨年代码[源码]
  8. Dijkstra(迪杰斯特拉)算法求单源最短路径问题
  9. Ubuntu切换窗口,快速返回桌面
  10. C++ 学习(四)程序流程结构 - 顺序结构、选择结构、循环结构、跳转语句