Linux内核分析04

news/2024/7/4 12:50:46

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

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

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

用户态和内核态的区分

内核态:代码可以执行特权指令,访问任意的物理地址,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存储,和普通函数一样。

四,实验

我使用第20号调用,getpid按照步骤来C语言编译运行:

 

汇编编译运行:

五,疑惑

1、为什么在保存的时候不保存中断向量?

2、超过六位怎么办。。。。

 

转载于:https://www.cnblogs.com/KG35/p/5297548.html


http://www.niftyadmin.cn/n/3376640.html

相关文章

预防晕车方法大全

北方人多半都晕车,尤其是大巴车,小麦苗也是一样,晕车晕的厉害,不过近几年也许生活改善了,身体也好多了,晕车的症状也好的多了,今天看见我之前整理的关于晕车的一些预防办法,分享出来…

简单lnmp搭建及nginx反代模型的实现

简单lnmp搭建及nginx反代模型的实现转载于:https://blog.51cto.com/daerwa/1833711

mybatis like用法

针对不同的数据库,like的用法是不一样的,现在具体来说一下 1,SQL SERVER SELECT * FROM user WHERE name like %#{name}% 2,Oracle SELECT * FROM user WHERE name like %||#{name}||% 3,Mysql SELECT * FROM user WHE…

Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力...

【摘要】 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦)。 【准备篇】 Q:何为 NinePatch技术? A:…

Sublime Text 包管理工具及扩展大全

Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签&a…

练习瑜伽饮食注意事项

1、在瑜伽的第一节课,老师就严重强调我们的饮食问题,他要求我们,在练瑜伽的这天,中餐只能七八分饱(是说肠胃有余地)食物不过量,肠胃便于消化和吸收! 2、练习完后,不能立即…

mysql启动报错处理

为什么80%的码农都做不了架构师?>>> MySQL 5.7.13 版本,Linux RHEL 6.5 64 版本。 rpm方式安装完mysql后服务启动正常,但服务器重启后再次启动服务报如下错误: 2016-08-03T02:10:29.026752Z 0 [Note] Plugin FEDERATE…

C# 该行已经属于还有一个表 的解决方法

产生错误的代码: DataTable dtContract_src Oper.GetDataTable("select * from T_Contract where ProjectID" ProjectID_src " and Flag0", con_src);foreach (DataRow dr in dtContract_src.Rows){String ContractID_src dr["Contrac…