跟踪分析Linux5.0系统调用过程
学号210 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
一.实验要求
二
二.实验环境
Ubuntu18
gcc 7
三.编译环境
1.mkdir LinuxKernel
2.下载内核源码Linux5.0source code
Wget https:mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
3.xz -d linux-5.0.1.tar.xz
4.tar -xvf linux-5.0.1.tar
5.cd LinuxKernel
cd linux-5.0.1
6.Make i386_defconfig
实验中所遇到的问题:
主要是缺什么,就补什么。
Sudo apt install gcc
Sudo apt install bison
Sudo apt install flex
sudo apt install libssl-dev
7.make i386_defconfig //32位的qemu,因此kernel需要同为32位的;
8.make menuconfig //然后kernel hacking,->Compile-time checks and compiler options,选择 [*]compile the kernel with debug info。效果如下图:
9.make
制作根文件系统
在linux5.0.1的文件下:
1.
cd ~/LinuxKernel/
2.
mkdir rootfs
3.
git clone https://github.com/mengning/menu.git
4.
cd menu
5.
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
遇到问题:
解决方法:
sudo apt-get install gcc-multilib
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
启动MenuOS
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
四.跟踪调试内核启动
1.cd LinuxKernel/linux-5.0.1
(gdb) file vmlinux
(gdb)target remote:1234
(gdb)break start_kernel
(gdb)c
(gdb)l
2.
3.
内核编译成功。
五.选择系统调用后两位与学号后两位进行跟踪编译
1.学号后两位10 对应的系统调用为unlink
功能描述:
从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。
用法:int unlink(const char *pathname);
参数:pathname:指向需解除连接的文件名。
2.编写210.c文件,调用系统函数
编译文件,输入命令gcc -g 210.c -o 210 -m32
每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,link函数创建一个新目录项,并且增加一个链接数。unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。
综上所诉,真正影响链接数的操作是link、unlink以及open的创建。
跟踪调试
gbq -q
file 210
b unlink(设置断点)
r
ni
info r(查看寄存器的值)
ni
info r
应用程序 ( application program )与 库函数 ( libc )之间, 系统调用处理函数 ( system call handler )与 系统调用服务例程 ( system call service routine )之间, 均是普通函数调用,应该不难理解。 而 库函数 与 系统调用处理函数 之间,由于涉及用户态与内核态的切换,要复杂一些。
Linux 通过 软中断 实现从 用户态 到 内核态 的切换。 用户态 与 内核态 是独立的执行流,因此在切换时,需要准备 执行栈 并保存 寄存器 。
内核实现了很多不同的系统调用(提供不同功能),而 系统调用处理函数 只有一个。 因此,用户进程必须传递一个参数用于区分,这便是 系统调用号 ( system call number )。 在 Linux 中, 系统调用号 一般通过 eax 寄存器 来传递。
总结起来, 执行态切换 过程如下:
- 应用程序 在 用户态 准备好调用参数,执行 int 指令触发 软中断 ,中断号为 0x80 ;
- CPU 被软中断打断后,执行对应的 中断处理函数 ,这时便已进入 内核态 ;
- 系统调用处理函数 准备 内核执行栈 ,并保存所有 寄存器 (一般用汇编语言实现);
- 系统调用处理函数 根据 系统调用号 调用对应的 C 函数—— 系统调用服务例程 ;
- 系统调用处理函数 准备 返回值 并从 内核栈 中恢复 寄存器 ;
- 系统调用处理函数 执行 ret 指令切换回 用户态 ;
转载于:https://www.cnblogs.com/lizhenhuaxxx/p/10562310.html
跟踪分析Linux5.0系统调用过程相关推荐
- 实验三:跟踪分析Linux内核启动过程
钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.使用qemu ...
- 跟踪分析Linux内核5.0系统调用处理过程
跟踪分析Linux内核5.0系统调用处理过程 学号384 原创作业转载请注明出处+中国科学技术大学孟宁老师的Linux操作系统分析 https://github.com/mengning/linuxk ...
- 举例跟踪分析Linux内核5.0系统调用处理过程
学号最后三位编号:094 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 0.实验内容 编译内核5.0 qemu -kernel linu ...
- 分析Linux内核5.0系统调用处理过程
学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.0 2.qemu -kernel linux-5.0.1/a ...
- execve系统调用_张凯捷—系统调用分析(3) (基于最新Linux5.0版本系统调用日志收集系统)...
在上一篇文章<系统调用分析(2)>中介绍和分析了32位和64位的快速系统调用指令--sysenter/sysexit和syscall/sysret,以及内核对快速系统调用部分的相关代码,并 ...
- 理解进程调度时机跟踪分析进程调度与进程切换的过程
虞啸川 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux既支持 ...
- 跟踪sys_mkdir的系统调用过程
原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 向MenuOS系统中加入自己写 ...
- 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...
week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...
- Linux 0.11内核分析03:系统调用
目录 1 概述 1.1 什么是系统调用 1.2 为什么需要系统调用 2 系统调用基础设施 2.1 安装系统门 2.1.1 中断描述符 2.1.2 中断描述符安装函数 2.1.3 安装0x80系统门 2 ...
最新文章
- Windows和Linux的编译理解
- ECCV20 3D目标检测新框架3D-CVF
- Linux指定网卡优先级,如何在Ubuntu中设置网络连接的优先级?
- 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
- 10.30 NFLS-NOIP模拟赛 解题报告
- “共享工程师”?看锐捷“网络青年”如何携手500位工程师提供最优IT服务
- 283. 移动零 golang
- 数据结构之外部排序:失败树
- rust怎么上邮轮_20年内泰坦尼克号将消失 英公司推三千米沉船之旅
- linux常用yum 安装基本包_linux - yum常用命令
- pytorch实现LeNet5
- redux-observable笔记
- 【spring学习】03
- 浮栅场效应管 符号_MOS场效应管
- Scala tuple
- HDU4506 小明系列故事——师兄帮帮忙【水题】
- 超简代码版设计模式系列六
- 分享《通过开源项目去学习》
- 火电厂( 4×300MW )电气主系统方案与设备配置初步设计
- 物联网工程导论第二版思考题答案
热门文章
- UCML Ajax++框架介绍
- OSRAM欧司朗LED灯珠采购秘籍,收藏这一篇就够了
- 注册中心集群 服务负载均衡 雪崩效应Hystrix
- python语音转文字_Python文字转语音示例
- 深圳是“物联网之城”|草根逆袭之地
- 毕业设计——>基于SSM的健身房管理系统
- 慢慢买 | 比价API电商数据采集定制
- 8、店铺分类 - 后端功能开发 - 微擎小程序模块应用开发
- 申请计算机博士需要的论文,计算机科学与技术学院申请博士学位发表学术论文的规定(2008.9上网).doc...
- 大致总结一下 安卓各大版本的差异(安卓4以上版本)