linux及安全第五周总结——20135227黄晓妍
(注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了。本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分。)
实验部分
使用gdb跟踪分析一个系统调用内核函数
- 强制删除menu (rm menu -rf)
- 更新menu代码至最新版本(git clone https://github.com/mengning/menu.git)
- 在test.c中main函数中增加MenuConfig,以及增加上周自己选择Getegid,GetegidAsm的代码
- Make roofts自动编译,生成,和启动根文件系统


在test.c的main中增加menuconfig

增加我的函数getegid和getegidasm

int Getegid(int argc,char *argv[])
{
gid_t gid;
gid = getegid ();
printf(“gid=%d”,gid);
return 0;
}
int GetegidAsm(int agrc,char *argv[])
{
gid_t gid;
gid = getegid ();
asm volatile(
“mov $0x32,%%eax\n\t”
“int $0x80\n\t”
“mov %%eax,%0\n\t”
:”=m”(gid)
);
printf(“gid=%d”,gid);
return 0;
}
make rootfs然后查看一下,发现新增加了getegid和getegid_asm命令

getegid一下

使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口
gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
查看50 i386 getegid sys_getegid16
(gdb)break sys_getegid16# 断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time
示例:gdb跟踪sys_time

跟踪调试

system_call对应的汇编代码的工作过程
sys_call只是汇编代码的声明,不是函数,所以gdb无法跟踪sys_call的位置,但是sys_call里包含的系统调用的时机非常重要:
中断向量int0x80如何与sys_call绑定的呢?
\init\main.c里的start_kernel里有trap_init()函数
\arch\x86\kernel\traps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化。
系统调用处理过程
用户态的函数根据API接口,申请一个系统调用,触发int0x80中断向量指令,中断int指令(保护现场)保存用户态的栈顶地址,当时的状态字,当时的cs:eip值和内核态的栈顶指针,当时的状态字,和中断处理程序的入口(sys_call),sys_call_table根据系统调用号查找对应的函数,如果当前进程需要调度或者有其他的信号需要处理,则分别调度和处理,如果不需要,运行函数,恢复现场(restore_all), 最后iret结束。下面我用流程图展示系统调用处理的过程(sytem call到iret之间):


总结部分:
一:如何给menuOS增加自己编写的命令Getegid,GetegidAsm
1. 强制删除menu (rm menu -rf)
2. 更新menu代码至最新版本(git clone https://github.com/mengning/menu.git)
3. 在test.c中main函数中增加MenuConfig,以及增加上周自己选择Getegid,GetegidAsm的代码
4. Make roofts自动编译,生成,和启动根文件系统
二:gdb跟踪自己编写的系统调用函数Getegid,GetegidAsm
使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
另开一个shell窗口
gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time
示例:gdb跟踪sys_time


三:系统调用在内核代码中的工作机制和初始化
在x86/kernel/entry_32.S里有ENTRY(system call)

sys_call只是汇编代码的声明,不是函数,所以gdb无法跟踪sys_call的位置,但是sys_call里包含的系统调用的时机非常重要:
中断向量int0x80如何与sys_call绑定的呢?
\init\main.c里的start_kernel里有trap_init()函数
\arch\x86\kernel\traps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化


四:简化汇编伪代码
Save_all保存现场
Sys_call_table:绑定系统调用函数
Interrupt_return:结束

linux及安全第五周总结——20135227黄晓妍的更多相关文章
- linux及安全第七周总结——20135227黄晓妍
实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...
- linux及安全第八周总结——20135227黄晓妍
实验部分 实验环境搭建 -rm menu -rf git clone https://github.com/megnning/menu.git cd menu make rootfs qemu -ke ...
- linux及安全第六周总结——20135227黄晓妍
总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...
- linux及安全第三周总结——20135227黄晓妍
总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init 内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...
- linux安全第一周总结——20135227黄晓妍
实验部分: 我将源代码做了修改,将其中一个数字修改为我学号27 2.在实验楼环境下将其保存为text.c并将其编译,得到text.s 3.将.开头的多余的语句删去了之后,我得到了32位环境的汇编代码 ...
- linux及安全第二周总结——20135227黄晓妍
实验部分: 首先运行结果截图 代码分析: Mypcb.h /* * linux/mykernel/mypcb.h * * Kernel internal PCB types * * Copyri ...
- linux及安全期中总结——20135227黄晓妍
Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- Linux基础入门学习笔记20135227黄晓妍
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍
第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...
随机推荐
- openstack将本地实例迁移至ceph存储中
需求: 最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,opens ...
- php实现一个简单的购物网站
实现一个简单的购物网站 一.考试时间:8小时 二.开发工具:DW 三.数据库:见附件 四.需要实现的页面: Index:浏览商品页面,显示商品列表,用户可以点击“购买“. ViewCart:查看购物车 ...
- stringstream读入每行数据
做了下阿里的编程测试题,就30分钟,不是正常的输入输入,直接给一个数组作为输入. 于是带想题和处理数据花了20分钟,最后10分钟搞一个dij模版, 竟然只过了66%,应该是我数组开小了. 题目数据量没 ...
- Excel打开csv文件乱码问题的解决办法
excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写,通 ...
- Minix2.0内核源代码的组织结构
Minix2.0操作系统的源代码由两个目录组成:include/目录和src/目录 include/目录包含了操作系统所有的头文件(即.h文件) src/目录下包含了操作系统所有的源文件(.c或.s文 ...
- Egret3D初步学习笔记三 (角色使用)
一 Unity中编辑角色 仍然使用unity4.7.1_Egret3D_Dll.unitypackage. 里面含有一个角色. 二 查看人物的动画 选中lingtong 属性面板里有个Animator ...
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...
- 【Android】安卓中常用的图片加载方法
一.通过相机选图片: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- Linux定时对日志批量打包Shell脚本及定时任务crontab 详细用法
一.需求背景 因此次项目的生产环境中部署了多套系统,每天会产生大量的日志(数百GB的量),侵占了服务器宝贵的存储资源空间.为了有效缓解服务器存储压力,考虑通过Linux的Shell脚本结合cr ...
- Java中的文件和流相关知识
1. File File类可以使用文件路径字符串来创建File实例,该文件路径可以是绝对路径或相对路径 File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出 ...