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.寄存器模式,以%开头的寄存器标 ...
随机推荐
- Reachability
一.Reachability中介绍了取得/检测网络状态的方法. 二.使用 1.添加源文件:Reachability.h和Reachability.m 2.添加framework———SystemCon ...
- CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB
一.多样输出支持 CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件,它可以随着ASP.NET Core实例的启动而启动,目前采 ...
- JavaScript的运行机制
先来看一段代码然后再来详细的说明js的运行机制,下面的一段代码执行顺序是什么 console.log(1); setTimeout(function () { console.log(2); }, 0 ...
- centos7下安装docker(13.2容器数据共享)
回想一下我们学了两种存储方式:storage driver和data volume,其中又分为bind mount和docker managed volume,我们知道storage driver就是 ...
- linked-list-cycle (快慢指针判断是否有环)
class Solution { public: bool hasCycle(ListNode *head) { if (head == NULL) return NULL; //空表 ListNod ...
- keystore密钥文件使用的算法-PBKDF2WithHmacSHA1 和Scrypt
PBKDF2 简单而言就是将salted hash进行多次重复计算,这个次数是可选择的.如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟.假如攻击一个密码所需的rainbow table ...
- checkbox选中并通过ajax传数组到后台接收
这次讲的是通过复选框,选中,点击提交,并将值chuan到后台controller.这个应用是比较广的,什么批量修改,批量添加,授权管理等等,都用到这个.其实这个还是挺简单的,并没有想象中的那么难,但我 ...
- java 迭代器遍历List Set Map
Iterator接口: 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现Iterator接口的对象 Iterator对象称作为迭代器,用以方便的对容器内元素的遍历 ...
- JavaScript设计模式 - 策略模式(表单验证)
表单提交的时候,总是要校验,不同的表单可能校验相同的功能. 为了避免代码重复的复制黏贴,使用策略模式,写出来的代码赏心悦目,且可扩展,还可以作为插件到处使用 <!DOCTYPE html> ...
- 查看Orcale数据里的表是否有变化
由于我们公司一个数据库两个应用在使用,导致一个应用修改了数据库,另一个应用用的缓存而不知道有更新还是原来的结果.原来的处理方式是采用session缓存的方式,用户登出了就清空缓存,这样只需要重新登录一 ...