zoukankan      html  css  js  c++  java
  • 20135220谈愈敏Blog5_系统调用(下)

    系统调用(下)

    谈愈敏 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000

    给MenuOS增加time和time-asm命令

    上周是从用户态的观点来理解系统调用,这周从内核态出发研究系统调用,通过跟踪调试,首先把上周的两个命令加到MenuOS中:

    rm menu -rf 强制删除原menu文件
    git clone http://github.com/mengning/menu.git 从github中克隆
    
    cd menu
    make rootfs 运行自动编译脚本,生成根文件系统,启动MenuOS
    
    • 更新menu代码到最新版
    • 在main函数中增加MenuConfig(一个命令一行,与上面的格式一样)
    • 增加对应的time和time-asm函数(就是上周写的两个函数)
    • make rootfs (rootfs是一个脚本,可以自动生成,编译)

    使用gdb跟踪系统调用内核函数sys_time

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
    
    gdb
    (gdb)file linux-3.18.6/vmlinux      //加载符号表
    (gdb)target remote:1234     //连接
    b sys_time:在系统调用time的位置设置断点
    c:继续执行,停在断点处
    n/s:单步运行,s进入函数,n不进入
    

    系统调用在内核代码中的处理过程

    需要主要理解的过程:int 0x80触发一个系统调用 ->执行系统调用处理函数system_call ->返回到用户态。

    返回到用户态之前有一个进程调度的时机,会跟踪到schedule

    回顾:

    • 中断向量int 0x80 ->system_call,初始化时绑定
    • 系统调用号将xyz和中断服务程序sys_xyz关联起来

    系统调用机制的初始化

    main.c中start_kernel函数:trap_init()
    
    set_system_trap_gate(SYSCALL_VECTOR,&system_call)
    SYSCALL_VECTOR:系统调用的中断向量
    &system_call:汇编代码入口
    

    一执行int 0x80,系统直接跳转到system_call。

    理解system_call到iret之间的主要代码

    系统调用返回前可能进行进程调用,里面会发生进程上下文的切换。

    从系统调用入口开始:ENTRY(system_call)
    
    SAVE_ALL //保存现场
    
    system_call:
    	call *system_call_table(,%eax,4) 
    //调用了系统调用处理函数,有系统调用号eax中,是实际的系统调用处理程序。
    
    当前任务syscall_exit_work里面有work_pending里面有
    work_notifysig //处理pending信号,不用管
    重要的是work_resched:call schedule //决定了进程调度的代码,调用完会跳转到restore_all
    
    restore_all //恢复现场
    
    INTERRUPT_RETURN //irp_return宏,中断处理过程在这结束
    

    实验

    rm menu -rf 强制删除原menu文件
    git clone http://github.com/mengning/menu.git 从github中克隆
    
    cd menu
    make rootfs 运行自动编译脚本,生成根文件系统,启动MenuOS
    

    在test.c中增加上周编写的两个函数:Getpid()和GetpidAsm()

    并修改test.c中的main函数,添加两行代码MenuConfig

    重新编译运行make rootfs,在MenuOS中输入help,发现有刚才添加的两个系统调用,分别执行getpid、getpid-asm:

    插入断点进行调试:

    从system_call开始到iret结束的流程图:

    总结

    本周前两个视频教的大概是实验内容,学会如何给内核添加新的系统调用命令,并用gdb进行跟踪调试,我们自己动手做了实验,具体函数代码上周也写过了。后面几个视频重点是理解system_call到iret之间的主要代码,它的整个流程,笔记和流程图都是它的一个总结。

  • 相关阅读:
    HDU 3565 Bi-peak Number(数位DP)题解
    FJNU Fang G and his Friends(状压DP)题解
    newcoder 小A的柱状图(单调栈)题解
    CodeForces 518E Arthur and Questions(贪心 + 思维)题解
    装饰器来激活生成器
    迭代器(Iterator)和生成器(generator)浅析
    简单的获取网页样式元素(装饰器实现)
    多层装饰器的调用及执行顺序
    三角形的输出
    简单的用户登录(文件处理)
  • 原文地址:https://www.cnblogs.com/tymjava/p/5315003.html
Copyright © 2011-2022 走看看