Linux内核分析04

扒开系统调用的三层皮(上)

一,用户态、内核态和中断

用户态、内核态和中断的处理过程

用户态和内核态的区分

内核态:代码可以执行特权指令,访问任意的物理地址,CPU的这种执行级别就对应着~

相对的用户态就对应着低级别的执行状态就是用户态,代码所掌控的范围有限。

至于为什么会划分权限,因为操作系统的发展,防止程序员写的代码造成系统运转的崩溃

划分为0、1、2、3四个级别 内核态为0,用户态则为3.

进程地址空间里所提到的地址指的是逻辑地址而不是物理地址。

中断处理是从用户态进入内核态的主要方式。

从用户态切换到内核态时必须保存用户态的上下文在寄存器里,int指令会在堆栈上保存一些寄存器的值,

系统调用只是一种特殊的中断。

中断后发生的第一件事就是保护现场,save all,例如:状态字、栈顶地址、cs:eip的值。

最后一件事是恢复现场。

二,系统调用

应用程序编程接口(API)和系统调用是不同的。

API只是一个函数定义,而系统调用通过软中断向系统内核提出明确请求。

一般情况一个系统调用对应一个封装例程,函数库再用这些封装例程定义出方便程序员使用的函数。

-1表示内核不能满足请求。

系统调用的三层皮:API xyz、中断向量  system_call、 中断服务  sys_xyz。

系统调用号将xyz和sys_xyz关联起来,指名那个系统调用,用eax%来传递。

传递参数方法是 每个参数的长度不能超过寄存器长度,也就是说不能超过六个,把寄存器当做一个指针,在内核传递。并没有看到超过六个怎么办。。

三,使用库函数API和C代码中嵌入汇编代码触发同一个系统调用

C语言程序中嵌入式汇编代码的写法:

_asm_(

  汇编代码:

  输出部分:

  输入部分:

  );

前面的笔记里也有提到过的。

用“=m”写到内存里去,不是放在寄存器了。

常用嵌入汇编语言限定符:a、r、=等等。

用汇编方式触发系统调用获取当前时间。

系统调用的第一个参数用ebx%,一般是NULL。

系统调用的返回值用eax存储,和普通函数一样。

时间: 2024-10-06 04:12:39

Linux内核分析04的相关文章

《linux内核分析》第一次课 实验作业

解释main.c的汇编码的堆栈变化 实验截图如下图所示: 下面从main函数开始进行分析(三个可变数值从上到下分别为4,7,4): 不妨假设一开始为空栈,初始位置为0,ebp=esp,以下用行号进行标记 18:esp指向位置(1),位置(1)的值为esp的地址 19:使ebp指向与esp相同的地址(位置1) 20:esp指向位置(2) 21:位置(2)的值为7 22:调用f函数(标号):esp指向位置(3),位置(3)的值为eip的地址,将f的地址放到eip中 09:esp指向位置(4),位置(

“Linux内核分析”实验三

跟踪分析Linux内核的启动过程 作者:何振豪 原创作品转载请注明出处 http://www.cnblogs.com/scoyer/p/6516032.html <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 这节课讲了如何查看linux内核源代码,构造一个简单的linux系统(算不上构造,实际上就是编译内核,然后打包git上的根文件系统,然后启动这个简单系统而已),最后还讲了如何利用gdb来跟踪调试linu

Linux内核分析作业 NO.7

可执行程序的装载 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验:Linux内核如何装载和启动一个可执行程序 首先,按照老流程,我们进入LinuxKernel,删除menu,再拷贝menu 然后我们进入menu,用test_exec和test.c中的一个覆盖另一个 我们打开test.c查看代码 和exec有关的部分,其中引入了hello 打开hello,发现hello就

《linux 内核分析》 第4周

王一 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.linux 系统的状态 Linux在x86平台下支持0内核态和3用户态.在内核态32位平台能访问0x00000000以上的空间,而用户态只能访问小于0xc0000000一下的地址空间 (此处的地址空间为逻辑地址).当用户态切换到内核态的时候主要方式为中断. 1.当int128调用时,系统会自动的两个状态下的cs:eip,ss:es

《linux 内核分析》 第二周 实验

王一 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次课的核心是通过中断机制完成进程的调度 ,在本次课程中__init my_start_kernel作为入口函数,定义0号进程的tPCB结构体,通过复制来制造其他进程的tPCB数据结构,中断时间函数被 my_timer_handler周期性的调用来修改my_need_sched 的值,而0号进程一直在检测my_need_sched 的

Linux内核分析8

周子轩 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb跟踪分析一个schedule()函数,理解Linux系统中进程调度的时机. 实验过程: 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel rm -rf menu git clone https://git

《Linux内核分析》课程第七周学习总结

姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 学习内容:Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式: 使用gdb跟踪分析一个execve系统调用内核处

LINUX内核分析第七周学习总结——可执行程序的装载

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 2.目标文件的格式ELF 3.静态链接的ELF可执行文件和进程的地址空间 (二)可执行程序.共享库和动态加载 1.装载可执行程序之前的工作 2.装载时动态链接和运行时动态链接应用举例 (三)

《Linux内核分析》第六周学习小结

进程的描述和进程的创建 一.进程的描述 进程描述符task_struct数据结构: (1)操作系统的三大功能: 进程管理.内存管理.文件系统 (2)进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 (3)进程控制块PCB——task_struct数据结构 提供了内核需要了解的信息 (4)task_struct结构庞大,有400多行代码.包含了进程状态.内核堆栈等相关信息的定义. (5)Linux的进程和操作系统原理中描述的进程状态有所不同,实际内核中,就绪和运行状态都用TASK_RU