Linux内核分析-系统中断在内核中的实现
分析system_call中断处理过程
在MenuOS中添加上周所运用到的系统调用
即在Linuxkernel/menu/test.c文件中,添加代码如下:
int Mkdir()
{
const char *ch = "test"; //创建的文件夹名称
mode_t mode = 0700; //创建的文件夹的权限
int flag = 0; //是否创建成功新的文件夹的标识符
flag = mkdir(ch,mode); //调用mkdir
if(flag==0) //flag=0则创建成功,否则失败
{
printf("succeed");
}
else
printf("error");
return 0;
}
int MkdirAsm()
{
char *ch="test-asm"; //创建文件夹的名称
mode_t mode=S_IRWXU; //创建新的文件夹的权限
int flag=0; //标识符
asm volatile(
"mov $0x27,%%eax\n\t" //系统调用号赋给eax寄存器
"mov %1,%%ebx\n\t" //将文件夹的名称赋给ebx寄存器
"mov %2,%%ecx\n\t" //将文件夹的权限赋给ecx寄存器
"int $0x80\n\t" //开启中断,执行mkdir系统调用
"mov %%eax,%0\n\t" //将返回值赋给flag
:"=m"(flag) //输出变量flag
:"d"(ch),"D"(mode) //输入变量ch与mode
);
if(flag==0) //flag=0则创建成功,否则失败
printf("succeed");
else
printf("error");
return 0;
}
int main()
{
PrintMenuOS();
SetPrompt("MenuOS>>");
MenuConfig("version","XXX V1.0(Menu program v1.0 inside)",NULL);
MenuConfig("quit","Quit from XXX",Quit);
MenuConfig("mkdir","Make up a new director",Mkdir);
MenuConfig("Mkdirasm","Make up a new director by asm",MkdirAsm);
ExecuteMenu();
}
- make rootfs即可完成功能的添加
gdb单步调试系统调用mkdir
设置断点:

在MenuOS界面输入mkdir,则发现停在了system_mkdir该函数处:

进行单步调试,发现其步骤大约为读取pathname(所需要创建文件夹的名称),配置权限,完成创建:

同理输入命令mkdirasm,完成单步调试,与mkdir一样的结果(因为都是调用系统调用mkdir)
输入c,将程序进行完,则出现最终结果:

system_call到iret的步骤
代码如下:
.macro INTERRUPT_RETURN ; 中断返回
iret
.endm
.macro SAVE_ALL ; 保护现场
...
.macro RESTORE_INT_REGS
...
.endmENTRY(system_call)
SAVE_ALL
syscall_call:
call *sys_call_table(,%eax,4)
movl %eax, PT_EAX(%esp) ; store the return value
syscall exit:
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work
restore_all:
RESTORE_INT_REGS
irq_return:
INTERRUPT_RETURN ; 到这里就算执行完了
ENDPROC(system_call) syscall_exit_work:
testl $_TIF_WORK_SYSCALL_EXIT, %ecx
jz work_pending
END(syscall_exit_work) work_pending:
testb $_TIF_NEED_RESCHED, %cl
jz work_notifysig
work_resched:
call schedule
jz restore_all
work_notifysig:
... ; deal with pending signals
END(work_pending)
流程图如下:

SAVE_ALL宏可以在栈中保存中断处理程序可能会使用的所有CPU寄存器,以此起到保护现场的作用
根据sys_call_table查找所需要的中断程序的中断号,从而执行system_call
系统调用完成后,则执行iret结束该操作。
Linux内核分析-系统中断在内核中的实现的更多相关文章
- Linux内核分析课程总结
Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业
1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...
- Linux内核分析--内核中的数据结构双向链表【转】
本文转自:http://blog.csdn.net/yusiguyuan/article/details/19840065 一.首先介绍内核中链表 内核中定义的链表是双向链表,在上篇文章--libev ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- Linux内核分析之扒开系统调用的三层皮(下)
一.实验内容 1. 通过内核的方式使用系统调用 需要使用的命令 rm menu -rf //强制删除当前menugit clone http://github.com/mengning/menu.gi ...
- Linux内核分析——可执行程序的装载
链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...
- Linux内核分析——Linux内核学习总结
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...
- Linux内核分析——期中总结
期中总结 一.MOOC课程 (一)计算机是如何工作的 1.冯诺依曼体系结构的核心思想是存储程序计算机. 2.CPU在实际取指令时根据cs:eip来准确定位一个指令. 3.寄存器模式,以%开头的寄存器标 ...
随机推荐
- Vue、Vuex+Cookie 实现自动登陆 。
概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...
- 字符串之StringBuffer 与 StringBuilder的对比
StringBuilder 和 StringBuffer是高度类似的两个类 StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别 原文地址:[十四]基础 ...
- 数据挖掘十大算法--K-均值聚类算法
一.相异度计算 在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...
- P1387 最大正方形
2018-08-16 https://www.luogu.org/problemnew/show/P1387 题意: 略. 4 4 0 0 1 1 把这个翻译成dp的形式 0 0 1 1 ...
- 【转】curl 命令行下载工具使用方法小结
获取curl curl 命令行下载工具 curl的官方网站为: http://curl.haxx.se官方下载页面为:http://curl.haxx.se/download.html 你可能并不清楚 ...
- canvas.toDataURL 画布导出图片
<html> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <he ...
- gitlab 使用流程
gitlab 使用流程 1. 开发人员写代码,开发产品. 2. 测试人员进行测试,如果发现bug, 填写 Issues - List - new issus 3. 开发人员修复bug, 从master ...
- solidity 汇编语言问题——内存数据mload时为什么从第32位开始
问题:内存数据mload时为什么从第32位开始 代码出处:https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d pragma so ...
- 《深入理解Java虚拟机》笔记(转)
文章来自http://www.cnblogs.com/tianchi/archive/2012/11/11/2761631.html 在C里面我们想执行一段自己编写的机器指令的方法大概如下: type ...
- 自己编写的Shell
shell文件 #!/bin/sh ## param 1: log string #下面的$1指的是调用这个function时传过来的第一个参数,依次类推 $2第二个 $3第三个funcLog() { ...