一、实验环境配置

系统环境:Ubuntu16.04

实验说明:本人学号末两位70,对应__64x_sys_msgrcv系统调用

注:不能在上次实验的基础上做,要重新下载解压linux-5.4.34文件

1、安装开发工具

1 sudo apt install build-essential2 sudo apt install qemu # installQEMU3 sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev

2、下载内核源码

1 sudo apt installaxel2 axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/

3 linux-5.4.34.tar.xz4 xz -d linux-5.4.34.tar.xz5 tar -xvf linux-5.4.34.tar

6 cd linux-5.4.34

3、配置内核选项

make defconfig # Default configuration is based on 'x86_64_defconfig'

makemenuconfig

# 打开debug相关选项

Kernel hacking--->Compile-time checks and compiler options --->[*] Compile the kernel with debug info[*] Provide GDB scripts forkernel debugging

[*] Kernel debugging

# 关闭KASLR,否则会导致打断点失败

Processor type and features---->[] Randomize the address of the kernel image (KASLR)

4、编译和运行内核

1 make -j$(nproc) # nproc gives the number of CPU cores/threads2 available3 # 测试⼀下内核能不能正常加载运⾏,因为没有⽂件系统最终会kernel panic4 qemu-system-x86_64 -kernel arch/x86/boot/bzImage

5、制作根文件系统

1 ⾸先从https://www.busybox.net下载 busybox源代码解压,解压完成后,跟内核⼀样先配置编译,并安装。

2 axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2

3 tar -jxvf busybox-1.31.1.tar.bz24 cd busybox-1.31.1

1 makemenuconfig2 记得要编译成静态链接,不⽤动态链接库。3 Settings --->

4 [*] Build static binary (no shared libs)5 然后编译安装,默认会安装到源码⽬录下的 _install ⽬录中。6 make -j$(nproc) && make install

1 然后制作内存根⽂件系统镜像,⼤致过程如下:2 mkdirrootfs3 cd rootfs4 cp ../busybox-1.31.1/_install/*./ -rf5 mkdir dev proc sys home6 sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/

1 准备init脚本⽂件放在根⽂件系统跟⽬录下(rootfs/init),添加如下内容到init⽂件。2 #!/bin/sh

3 mount -t proc none /proc4 mount -t sysfs none /sys5 echo "Wellcome MengningOS!"

6 echo "--------------------"

7 cd home8 /bin/sh

9 给init脚本添加可执⾏权限10 chmod +x init

1 打包成内存根⽂件系统镜像(rootfs目录下)2 find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz3 测试挂载根⽂件系统,看内核启动完成后是否执⾏init脚本4 qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz

可以看到init脚本已被执行

二、使用gdb跟踪调试

1、gdb问题处理

在用gdb打断点的时候,出现Remote ‘g’ packet reply is too long错误,查询得到参考解决办法https://blog.csdn.net/superking3188/article/details/8477574。

改完代码后进行重新编译和安装

./configuremake

make install

2、验证内核初始化

启动虚拟机

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s

在linux-5.4.34目录下启动gdb

gdb vmlinux

target remote:1234

在start_kernel、trap_init、cou_init、syscall_init位置打上断点

依次执行,可以清晰的看出系统内核初始化的顺序为start_kernel->trap_init->cou_init->syscall_init

3、跟踪70号系统调用

在linux-5.4.34/arch/x86/entry/syscalls/syscall_64.tbl文件中可以查看70对应的系统调用为__64x_sys_msgrcv

为了观察该系统调用,在rootfs/home目录下写一个程序来触发系统调用

intmain()

{

asmvolatile("movl $0x46,%eax\n\t" //使⽤EAX传递系统调⽤号70

"syscall\n\t" //触发系统调⽤

);return 0;

}

对该程序进行静态编译

gcc testSys.c -o testSys -static

重新打包内存跟文件系统镜像

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz

启动虚拟机

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s

在linux-5.4.34目录下启动gdb调试

gdb vmlinux

target remote:1234b __64x_sys_msgrcv

c

此时可以看到home目录下已经存在我们刚刚生成的可执行文件,执行该文件即可触发70号系统调用

获取到了70号系统调用的返回信息

使用bt命令查看栈信息

可以看到该系统调用涉及到do_syscall_64和entry_SYSCALL_64两个内核函数。

三、系统调用的保存和恢复现场

系统调用入口为entry_SYSCALL_64,其中使用了swapgs这一方法来快照式的保存现场,加快了系统调用,随后对一些相关寄存器进行压栈操作。

随后执行了do_syscall_64函数

在do_syscall_64函数中,获取到系统调用号所对应的入口,跳转执行。

随后便执行相关的系统调用

调用结束后恢复现场

四、总结

本次实验中,学习了gdb工具,使用gdb断点调试完成了内核初始化顺序的验证;查看了70号系统调用的调用过程,详细了解了系统调用的保存和恢复现场。

linux执行cd会使用系统调用,深入理解Linux系统调用相关推荐

  1. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

  2. 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?

    理解Linux Shell: shell:一个命令行解释器,通过执行命令或脚本,帮助用户与操作系统打交道. process:进程,用户执行的任务是进程,但进程不只是任务. file:文件放在硬盘上,包 ...

  3. linux文件未识别,linux的内核文件vmlinuz介绍-深入理解Linux重定向的使用-网卡eth0,未识别的端口的解决方法_169IT.COM...

    介绍:Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作. Linu ...

  4. linux中cd命令及范例,15个Linux中的“cd”命令的实际示例

    在Linux中"CD"( 更改目录 )命令是新手以及系统管理员中最重要和最广泛使用的命令之一. 对于无头的服务器上管理员,"CD"是导航到一个目录来查看日志,执 ...

  5. linux目录结构与功能_深入理解linux系统的目录结构(总结的非常详细)

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  6. linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...

  7. linux内核文件系统的架构,《深入理解Linux内核》-文件系统学习心得

    内核中要注意的是各种结构体,结构体之间的联系和各个函数以及函数之间的调用关系,参数的传递和函数的功能. 内核中数据结构的字段无外乎包括三种字段:属性字段,调用方法,指向其它结构的指针.具体如下图所示: ...

  8. windows比linux差在哪,怎么让新手理解Linux比Windows好在哪里!

    pingpang2008 于 2009-06-17 08:54:31发表: 人好多啊 hantu 于 2009-06-16 23:28:57发表: 哈哈,偏偏很多人就是不爽windows了才用Linu ...

  9. linux live cd中文版,介绍四种经典Linux Live CD发行版本 (1)

    Linux 的 LiveCD 发行版本已经有若干年的历史,但是近一两年这种发行版本的数量已经增加了好几倍.现在的大部分专用 LiveCD 都起源于 LinuxTag 的 Knoppix 发行版本,那是 ...

最新文章

  1. MySQL优化篇:show profile进行SQL分析
  2. 快速部署-01-docker
  3. SQL SERVER最大用户连接数
  4. VS-设置签出独占锁
  5. HYSBZ 1734 二分
  6. java excel添加公式_Java添加、读取Excel公式
  7. 机器人、威胁情报、对抗机器学习以及深度学习是如何影响安全领域的
  8. bash: dh_make:未找到命令
  9. 基于FPGA的YCbCr颜色空间中颜色参数的变化
  10. java dwg转pdf_java实现CAD图纸文件DWG格式转为PDF格式
  11. wordpress邮件地址混淆 你没权限访问整个邮件地址造成的死链接
  12. 使用ajax请求下载excel文件
  13. 熊博士c语言,InstallShield2015制作安装包----------安装后实现电脑开机自启动
  14. 经典同步时序逻辑电路分析汇总(第八道)(同步三进制计数器)
  15. Bugku Misc 图穷匕见
  16. 字符串的插入(不用库函数)
  17. A - Adventure Time-还是太菜了.
  18. 从《9败1胜》了解王兴如何10年创业带领美团上市!
  19. Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。然后重点提到Acti
  20. 树莓派安装opencv4.3.0

热门文章

  1. VC中的#pragma指令的用法
  2. tomcat7查看后台管理怎么设置用户名和密码
  3. Netty使用Marshalling传输信息
  4. Token 认证的来龙去脉
  5. SAP CRM 使用Javascript触发SAP Server Event
  6. 转 已知两点坐标和半径求圆心坐标程序C++
  7. HTML 5 Web Socket:下一次Web通信革命揭幕,互联网营销
  8. 发布一个C#实现的Asterisk的管理系统
  9. 深入解析Windows系统两大进程
  10. [转]关于父亲的故事