动静结合学内核之 linux 系统调用浅析

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

直入主题

实验过程1-增加新的菜单

  • update the menu //git cone
  • Uhange main.c //注册菜单函数
  • Add the chmodC ,chmodASM //菜单函数的实现
  • Make rootfs //激动人心的时刻,进入menuos调用我们新函数

chmodASM代码

讲述调用chmod系统调用的嵌入式汇编代码。

    int chmodASM ()
    {
      long rc ;
      char * file_name = "/ etc / passwd " ;
      unsigned short mode =0444;
      asm (
      " int $0x80"
      : "=a" ( rc )
      : "0" ( SYS_chmod ), "b" (( long ) file_name ), "c" (( long ) mode )
          );
      if ( ( unsigned long ) rc >=( unsigned long )-123 )//123 是最小的错误码
      { errno = - rc ;   rc =-1 ;
      }
      if ( rc == -1)
      fprintf ( stderr , " chmode failed,errno =%d\n" , errno );
      else
      printf ( " chmod ok\n" );
      return 0;
}

代码展示 chmodC

讲述调用chmod系统调用c代码。

int chmodC ()
{
  long rc ;
  char * file_name = "/ etc / passwd " ;
  unsigned short mode =0444;
  rc = chmod ( file_name , mode ); //

  if ( ( unsigned long ) rc >=( unsigned long )-123 )
  {
  errno = - rc ;
  rc =-1;

  }
  if ( rc == -1)
  fprintf ( stderr , " chmode failed,errno =%d\n" , errno );
  else
  printf ( " chmod ok\n" );
  return 0;
}

主函数main

int main()
{

  PrintMenuOS();
  SetPrompt("MenuOS>>");
  MenuConfig("version","MenuOS V1.0(Based on Linux 3.18.6)",NULL);
  MenuConfig("quit","Quit from MenuOS",Quit);
  MenuConfig("time","Show System Time",Time);
  MenuConfig("time-asm","Show System Time(asm)",TimeAsm);

  MenuConfig("chmod","chmod demo",chmodC);//new
  MenuConfig("chmod-asm","chmod demo",chmodASM);//new
  ExecuteMenu();
}

综合展示

实验过程用动态图展示。

2分析system_call的流程

system_call位置在entry_32.s中,老师的伪代码框架 很棒,不过这里给上 我自己绘制了一个小时的流程图。

iret之前的进程调度时机,就是schedule函数的调用过程在这个流程图里面,很清晰的说明了。

经典的伪代码流程

采集于老师的课件

小节,就是 从system_call 到iret的整个流程,

不要被细节困扰。

系统调用过程分析

系统调用过程和一般的中断处理流程 一起分析,这里来一个经典的图吧(来自 ULK)。

这里,仅从返回过程来说,

可以看到无论是中断返回(ret_from_intr) ,还是系统调用返回,都使用了 work_pending 和resume_userspace

小结

本内容耗时12小时,本来想尝试gdb 跟踪,但是由于工具限制,不能逐代码跟踪,于是使用流程图分析。

关键点:在流程图中确定iret前的schdule时机。

系统调用,某种意义上,是一种特殊的中断。从他的初始化/出发/返回,我们都能找到共性 ,本文仅对返回过程做了初步分析。

参考要求

题目自拟,内容围绕系统调用system_call的处理过程进行;

博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。

总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。

时间: 2024-12-09 04:14:00

动静结合学内核之 linux 系统调用浅析的相关文章

(转帖)linux内核SMP负载均衡浅析

需求在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加入到一个run_queue),以便让调度程序安排它在这个run_queue对应的CPU上面运行.一个CPU对应一个run_queue这样的设计,其好处是:1.一个持续处于TASK_RUNNING状态的进程总是趋于在同一个CPU上面运行(其间,这个进程

浅析 Linux 系统调用

浅析 Linux 系统调用 用户态.内核态以及中断 具有高执行级别的程序可以执行特权指令 intel X86 CPU 具有4种级别:0 ~ 3 Linux 只用了0和3(0表示内核态,3表示用户态) 特权级的表示:使用 CS 寄存器的低2位 内核态逻辑地址空间:0xc0000000以上 用户态逻辑地址空间:0x00000000 ~ 0xbfffffff 中断是从用户态到内核态的一种方式,即通过系统调用(系统调用是一种特殊的中断) 中断过程寄存器上下文的保存 保存到什么地方?堆栈 保存的内容: 用

linux平台学x86汇编(十七):在汇编中使用linux系统调用

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在前面章节我们已经看到,启动系统调用需要使用INT指令.linux系统调用位于中断0x80,执行INT指令时,所有操作转移到内核中的系统调用处理程序,完成后执行转移到INT指令之后的下一条指令. linux的系统调用在如下文件(32位系统)可以查看: $ cat /usr/include/asm/unistd_32.h #ifndef _ASM_X86_UNISTD_32_H

linux内核学习之四 系统调用

一  概念区分 提到linux系统调用,不得不区分几个比较容易混淆的概念: 系统调用:系统调用就是一种特殊的接口.通过这个接口,用户可以访问内核空间.系统调用规定了用户进程进入内核的具体位置. 应用程序接口(API,Application Programming Interface):是一些预定义的函数.API提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节. c库:c库实现了linux的主要API,包括标准的C库函数和系统调用.同时lin

Linux系统调用详解(如何从用户空间进入内核空间)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

使用 Linux 系统调用的内核命令【转】

转自:http://www.ibm.com/developerworks/cn/linux/l-system-calls/ 探究 SCI 并添加自己的调用 Linux® 系统调用 —— 我们每天都在使用它们.不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux 系统调用接口(SCI),学习如何添加新的系统调用(以及实现这种功能的其他方法),并介绍与 SCI 有关的一些工具. 1 评论: M. Tim Jones ([email protected]), 顾问工程师, Em

分析Linux内核5.0系统调用处理过程

学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.02.qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img3.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析https://github.com/mengning/menu4.给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中

[Linux]系统调用理解(1)

本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们.从某种角度来看,系统调用和普通的函数调用非常相似.区别仅仅在于,系统调用由操作系统核心提供,运行于核心态:而普通的函数调用由函数库或用户自己提供,运行于用户态.二者在使用方式上也有相似之处,

Linux 进程调度浅析

概述 操作系统要实现多进程,进程调度必不可少.有人说,进程调度是操作系统中最为重要的一个部分.我觉得这种说法说得太绝对了一点,就像很多人动辄就说"某某函数比某某函数效率高XX倍"一样,脱离了实际环境,这些结论是比较片面的. 而进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对 TASK_RUNNING 状态的进程进行调度.如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系.所以,如果你的系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程.那么进程调度也就不会