学号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 寄存器 来传递。

总结起来, 执行态切换 过程如下:

  1. 应用程序 在 用户态 准备好调用参数,执行 int 指令触发 软中断 ,中断号为 0x80 ;
  2. CPU 被软中断打断后,执行对应的 中断处理函数 ,这时便已进入 内核态 ;
  3. 系统调用处理函数 准备 内核执行栈 ,并保存所有 寄存器 (一般用汇编语言实现);
  4. 系统调用处理函数 根据 系统调用号 调用对应的 C 函数—— 系统调用服务例程 ;
  5. 系统调用处理函数 准备 返回值 并从 内核栈 中恢复 寄存器 ;
  6. 系统调用处理函数 执行 ret 指令切换回 用户态 ;

 

转载于:https://www.cnblogs.com/lizhenhuaxxx/p/10562310.html

跟踪分析Linux5.0系统调用过程相关推荐

  1. 实验三:跟踪分析Linux内核启动过程

    钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.使用qemu ...

  2. 跟踪分析Linux内核5.0系统调用处理过程

    跟踪分析Linux内核5.0系统调用处理过程 学号384 原创作业转载请注明出处+中国科学技术大学孟宁老师的Linux操作系统分析 https://github.com/mengning/linuxk ...

  3. 举例跟踪分析Linux内核5.0系统调用处理过程

    学号最后三位编号:094 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 0.实验内容 编译内核5.0 qemu -kernel linu ...

  4. 分析Linux内核5.0系统调用处理过程

    学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.0 2.qemu -kernel linux-5.0.1/a ...

  5. execve系统调用_张凯捷—系统调用分析(3) (基于最新Linux5.0版本系统调用日志收集系统)...

    在上一篇文章<系统调用分析(2)>中介绍和分析了32位和64位的快速系统调用指令--sysenter/sysexit和syscall/sysret,以及内核对快速系统调用部分的相关代码,并 ...

  6. 理解进程调度时机跟踪分析进程调度与进程切换的过程

    虞啸川 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux既支持 ...

  7. 跟踪sys_mkdir的系统调用过程

    原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 向MenuOS系统中加入自己写 ...

  8. 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...

    week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...

  9. Linux 0.11内核分析03:系统调用

    目录 1 概述 1.1 什么是系统调用 1.2 为什么需要系统调用 2 系统调用基础设施 2.1 安装系统门 2.1.1 中断描述符 2.1.2 中断描述符安装函数 2.1.3 安装0x80系统门 2 ...

最新文章

  1. Windows和Linux的编译理解
  2. ECCV20 3D目标检测新框架3D-CVF
  3. Linux指定网卡优先级,如何在Ubuntu中设置网络连接的优先级?
  4. 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
  5. 10.30 NFLS-NOIP模拟赛 解题报告
  6. “共享工程师”?看锐捷“网络青年”如何携手500位工程师提供最优IT服务
  7. 283. 移动零 golang
  8. 数据结构之外部排序:失败树
  9. rust怎么上邮轮_20年内泰坦尼克号将消失 英公司推三千米沉船之旅
  10. linux常用yum 安装基本包_linux - yum常用命令
  11. pytorch实现LeNet5
  12. redux-observable笔记
  13. 【spring学习】03
  14. 浮栅场效应管 符号_MOS场效应管
  15. Scala tuple
  16. HDU4506 小明系列故事——师兄帮帮忙【水题】
  17. 超简代码版设计模式系列六
  18. 分享《通过开源项目去学习》
  19. 火电厂( 4×300MW )电气主系统方案与设备配置初步设计
  20. 物联网工程导论第二版思考题答案

热门文章

  1. UCML Ajax++框架介绍
  2. OSRAM欧司朗LED灯珠采购秘籍,收藏这一篇就够了
  3. 注册中心集群 服务负载均衡 雪崩效应Hystrix
  4. python语音转文字_Python文字转语音示例
  5. 深圳是“物联网之城”|草根逆袭之地
  6. 毕业设计——>基于SSM的健身房管理系统
  7. 慢慢买 | 比价API电商数据采集定制
  8. 8、店铺分类 - 后端功能开发 - 微擎小程序模块应用开发
  9. 申请计算机博士需要的论文,计算机科学与技术学院申请博士学位发表学术论文的规定(2008.9上网).doc...
  10. 大致总结一下 安卓各大版本的差异(安卓4以上版本)