跟踪sys_mkdir的系统调用过程
原创作品转载请注明出处 《Linux内核分析》MOOC课程
http://mooc.study.163.com/course/USTC-1000029000
- 向MenuOS系统中加入自己写的系统调用函数:
1.1我们首先下载最新的MenuOS代码,此代码中将time加入了MenuOS中,而且修改了Makefile,输入make rootfs即可制作根文件系统,使用qemu启动内核加载rootfs.img文件系统。
我们输入命令:
git clone https://github.com/mengning/menu.git
cd menu
make rootfs
即可完成环境的配置。
1.2然后我们打开test.c文件加入上次实验写的系统调用函数
加入两个函数
int newdir(int argc, char *argv[])
{if(mkdir("new dir", S_IRWXU) == 0)printf("new dir create success\n");elseprintf("new dir create failed\n");return 0;}
int newdirAsm(int argc, char *argv[])
{char *dirName = "new dirAsm";mode_t mode = S_IRWXU;int returnValue = 0;asm("movl $39, %%eax\r\n""movl %1, %%ebx\r\n""movl %2, %%ecx\r\n""int $0x80\r\n""movl %%eax, %0":"=m"(returnValue):"d"(dirName),"D"(mode));if(returnValue == 0)printf("new dirAsm create success\n");elseprintf("new dirAsm create failed\n"); return 0;
}
并且在main函数里面加入
MenuConfig("newdir","create a new directory",newdir);
MenuConfig("newdir-asm","create a new directory(asm)",newdirAsm);
完成之后我们重新编译,make rootfs编译并且进入内核。
输入newdir和newdir-asm就会发现命令生效了
2. 跟踪中断处理的代码
我们使用gdb来调试跟踪一下MenuOS中mkdir的系统调用过程。
首先在终端输入
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s –S
并且在另一个终端打开gdb
输入
gdbtui
(gdb)file linux-3.18.6/vmlinux #加载符号表
(gdb)target remote:1234 #建立gdb和gdbserver之间的连接
(gdb)b sys_mkdir #在sys_mkdir建立断点
(gdb)c
然后我们在qemu中输入newdir,会触发断点,然后我们进入gdb跟踪调试
断点停到SYSCALL_DEFINE2.
这个SYSCALL_DEFINE2在这里其实就是
asmlinkage long sys_mkdir(const char __user *pathname, umode_t mode)
因为:我们打开源码中/linux-3.18.6/include/linux/syscalls.h文件,会看到一堆宏定义。
我们拿刚才那个定义为例:、
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
这是把SYSCALL_DEFINE2定义为SYSCALL_DEFINEx然后把name与下划线连接(##表示前后两个参数当做串连接)
然后看下SYSCALL_DEFINEx的定义
#define SYSCALL_DEFINEx(x, sname, ...) \SYSCALL_METADATA(sname, x, __VA_ARGS__) \__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
我们继续找到__SYSCALL_DEFINEx的定义。
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
…
剩余部分省略
__这里把SYSCALL_DEFINEx定义为asmlinkage long sys##name…
而name就是前面的_name,在这里也就是_mkdir。
所以SYSCALL2_DEFINE2定义为了asmlinkage long sys_mkdir,正式我们要找的系统调用。
弄清楚了之后,接下来我们继续跟踪。
我们在此处x/s pathname打印一下参数,看到参数正是我们要创建的文件夹名字
我们按s步入执行,发现进入了一个函数SYSCALL_DEFINE3,根据上面的理解,这里应该是sys_mkdirat系统调用
我们来看下这个函数里面的操作
user_path_create
security_path_mkdir
vfs_mkdir
done_path_create
我们步入执行进入user_path_create
里面会调用kern_path_create
然后进入kern_path_create,里面还会调用do_path_lookup
然后我们返回到SYSCALL_DEFINE3中执行完毕,会跳入到schedule中
如果继续执行的话就会进入到不可调试的部分只能通过阅读代码来跟踪了。
上面的调用过程我们来用一个流程图来描述一下:
3. 分析系统调用过程的汇编代码
/linux-3.18.6/arch/x86/kernel/entry_32.S中ENTRY(system_call)与ENDPROC(system_call)之间的内容就是完成系统调用的汇编代码。
提取出主要的处理过程就是:
ENTRY(system_call)
SAVE_ALL
system_call:call *sys_call_table(,%eax,4)#根据系统调用号来调用系统调用的处理函数
…
system_exit:testl $_TIF_ALLWORK_MASK, %ecx #判断当前任务是否需要处理syscall_exit_workjne syscall_exit_work #如果需要处理则跳转到syscall_exit_work
restore_all:RESTORE_INT_REGS #不需要处理的话进行RESTORE_ALL
irq_return:INTERRUPT_RETURN #返回
ENDPROC(system_call)
整个中断处理的过程我们可以用一个流程图画出来
跟踪sys_mkdir的系统调用过程相关推荐
- [strace]跟踪进程的系统调用
转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...
- 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...
- 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...
- 跟踪分析Linux5.0系统调用过程
学号210 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验要求 二 二.实验环境 Ubuntu18 gcc 7 三.编译环境 1 ...
- Linux系统调用过程(Linux0.11内核实验)
什么是系统调用呢? 系统调用和普通函数调用得区别: 普通函数调用:调用自定义函数是通过call指令直接跳转到该函数的地址,继续运行. 系统调用:调用一个系统得API(Application progr ...
- 详解Linux系统调用过程
Linux系统调用的层次如下: 用户程序-------->C库(即API):INT 0x80------------>system_call------------>系统调用服务例程 ...
- Linux-Level2-day03:内存映射及其分配释放函数brk/sbrk->mmap/munmap;系统调用过程详解;
七.内存 1.虚拟内存.物理内存 虚拟内存:地址空间,虚拟的存储区域,应用程序所访问的都是虚拟内存. 物理内存:存储空间,实际的存储区域,只有系统内核可以访问物理内存. 虚拟内存和物理内存之间存在对应 ...
- Linux +xenomai 下sendto()系统调用过程 --WT
一 : sendto()系统调用 本文基于 linux-4.9.38+Xenomai 3.0.5 的实时系统 加载用的是xenomai下pci总线驱动rtcan_adv_pci,以及rtcan_sja ...
- linux系统调用过程
在用户程序调用read.write等系统调用时,linux内核发生了哪些动作呢.下面以write为例: 调用write系统调用,进入C库执行write函数,就是产生了一个int 0X80的一个中断,这 ...
最新文章
- Servlet--03--servlet的生命周期
- css浮动+应用(瀑布流效果的实现)
- Java并发基础总结_Java并发编程笔记之基础总结(二)
- JAVA学习--面向对象的特征二:继承性
- JavaWeb项目文件夹生成Zip压缩包并下载到本地
- docker下centos7 systemctl启动报错 docker Failed to get D-Bus connection 报错
- 【转】mutation接收单个参数和多个参数
- 9106w android7,三星note4 SM-N9106W原厂刷机包4.4.4/5.0.1rom线刷包Root驱动
- 11-FreeSwitch-freeswitch架构
- Vue todos案例
- nn.functional.normalize
- 远程移动测试平台对比分析
- python用语句输入一个3*3的二维矩阵、并将之输出_从键盘输入一个3行4列的矩阵,将其转置后,变成4行3列的矩阵输出。这个c语言的代码咋写...
- PCIe系列专题之一:PCIe技术概述
- 关于洗地机电池容量问题,你怎么看
- Vim快捷键学习---记性不行了,留这里备查
- linux tar 7z,.tar.gz和.gz或.tar.7z和.7z有什么区别?
- jvm---6.1、dump 文件分析工具 IBM HeapAnalyzer
- 数控系统维修:FANUC发那科编程调试操作图解
- 如何用副业搞垮一个打工人?