分析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

    ...

    .endm

      ENTRY(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内核分析-系统中断在内核中的实现的更多相关文章

  1. Linux内核分析课程总结

    Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...

  2. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  3. 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业

    1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...

  4. Linux内核分析--内核中的数据结构双向链表【转】

    本文转自:http://blog.csdn.net/yusiguyuan/article/details/19840065 一.首先介绍内核中链表 内核中定义的链表是双向链表,在上篇文章--libev ...

  5. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  6. Linux内核分析之扒开系统调用的三层皮(下)

    一.实验内容 1. 通过内核的方式使用系统调用 需要使用的命令 rm menu -rf //强制删除当前menugit clone http://github.com/mengning/menu.gi ...

  7. Linux内核分析——可执行程序的装载

    链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...

  8. Linux内核分析——Linux内核学习总结

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...

  9. Linux内核分析——期中总结

    期中总结 一.MOOC课程 (一)计算机是如何工作的 1.冯诺依曼体系结构的核心思想是存储程序计算机. 2.CPU在实际取指令时根据cs:eip来准确定位一个指令. 3.寄存器模式,以%开头的寄存器标 ...

随机推荐

  1. Mysql基础之 基础知识解释

    Mysql基础知识 RDBMS:关系型数据库管理系统.是将数据组织成相关的行和列的系统 存储过程:是存储在数据库中的一段声明性语句.触发器.java.php等都可以调用其存储过程.早期的mysql版本 ...

  2. indexOf() 使用方法(数组去重)

    对于indexOf()的用法一直停留在查找第几个字符串,却不知道它能用到数组去重中,首先还是温顾下indexOf()的语法: <!DOCTYPE html> <html lang=& ...

  3. js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...

  4. Excel中concatenate函数的使用方法

    你还在为Excel中concatenate函数的使用方法而苦恼吗,今天小编教你Excel中concatenate函数的使用方法,让你告别Excel中concatenate函数的使用方法的烦恼. 经验主 ...

  5. 转载 [深入学习C#]C#实现多线程的方式:使用Parallel类

    简介 在C#中实现多线程的另一个方式是使用Parallel类. 在.NET4中 ,另一个新增的抽象线程是Parallel类 .这个类定义了并行的for和foreach的 静态方法.在为 for和 fo ...

  6. Centos6.8配置HTTPS

    HTTPS服务http+openssl 环境要求:CA证书: 192.168.1.103网站服务器: 192.168.1.104客户端: 192.168.1.107 (linux图形化界面) 内核:( ...

  7. android 工具大集合

    http://www.androiddevtools.cn/ http://www.sourcetreeapp.com/

  8. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  9. C#中用OLEDB操作EXCEL时,单元格内容长度超过255被截断

    C#中Microsoft.ACE.OLEDB.12.0 驱动读取excel,会读取前8行来判定每列的数据类型,假如没有超过255个字符,那么会被设置为nvarchar(255),从第9行开始,超过25 ...

  10. React-页面路由参数传递的两种方法

    list页->detail页 方法一:路由参数 路由导航: 用“/” <Link to={'/detail/'+item.get('id')} key={index}> 路由map: ...