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黄晓妍
第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...
随机推荐
- php查询操作实现投票功能
这篇文章主要为大家详细介绍了php查询操作实现投票功能的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了php查询操作实现投票功能的代码,供大家参考,具体内容如下 ...
- 有道云笔记同步IT笔试面试资源
有道云笔记同步资源 放在手机上ipad或者电脑上看..特别方便...精心整理..暂时只有c++的..希望大家喜欢 暂时只扒了一些c++的..java的随后扒 主要都是取自<程序员面试笔试宝典&g ...
- JZOJ.5329【NOIP2017模拟8.22】时间机器
Description
- 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS
了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...
- c# winform窗体边框风格的设计
1.首先,窗体的FormBorderStyle设置成None,不要控制边框. 2.然后,TransparencyKey和BackColor颜色设置成相同的,这样,窗体就透明了. 3.最后,窗体的拖动 ...
- dd命令测试硬盘IO
1.用Linux自带的命令dd测试硬盘IO,如下------------------------------------写: [root@server102 ~]# time dd count= of ...
- vector库的用法
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
- 170608、Spring 事物机制总结
spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- js常用的几个验证
/// <summary> ///1. 使用正则表达式验证 参数 是否 为数值 /// </summary> /// <param name="trNumber ...
- CentOS7.2使用yum配置LNMP环境
一,安装系统查看 二,yum安装nginx 设置yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-c ...