linux shell 宏定义_linux内核修炼之系统调用

d129033fac3b3f5615336a4da1bdbe3b.png

fork()这个系统调用是有两个返回值的,在子进程中的返回值是0,在父进程中的返回值是PID,如下

5fb05376ceeee8e49ea7cc8960b21bad.png
图 fork一次 返回两次

关于0x80中断和特权级检查

在mian函数的sched_init()函数中调用宏:set_system_gate(0x80,&system_call);将0x80号中断安装到中断表里。可见将0x80中断安装进了head.s中定义的IDT表中的第0x80项,将中断函数入口偏移地址设置为system_call,将特权级设置为3。至于为什么没有看见可以自定义段描述符的地方,因为set_system_gate这个宏的作用是用来安装系统调用中断,而系统调用函数是内核函数,内核所在的代码段描述符值是0x8,这个是已经定死了的。安装描述符时不需要修改。

IDT表项安装好后,一旦用户程序执行0x80中断,则首先进行特权检查,用户程序的CPL为3,0x80中断的DPL也为3,因此可以执行该中断,中断将跳入内核函数中执行,硬件会自动得将0x8写入CS,将偏移地址写入EIP,从而执行systemcall,且CPL此时也已被修改为0,从而完成了特权级切换。

当使用jumpi指令进行段间跳转的时候会对比CS中的CPL和目标GDT中的代码段的DPL,段内跳转不对比;当使用mov的指令进行段间内存访问会对比DS中的CPL和目标GDT中的代码段的DPL,段内内存访问不对比,使用中断跳到中断服务程序的时候也会发生段间跳转,此时会对比CS中的CPL和IDT表项中的DPL。

8fc01fa60e7158937319117e3db2cf62.png

e1d8b1ab46aec4a71eaf0fd13fa9da13.png

d4e18eae44f591433e7abf60c3dc4b37.png
图 安装中断的宏

eab337395440d176418e256e6d81a8a4.png

使用bochs进行实验时,需要关注两个文件,一个是源码文件夹linux-0.11下的image文件,一个是oslab文件夹下的hdc-0.11-new.img 文件,源码文件夹下的image文件每次编译源码时都会重新生成,是内核代码文件;而.img是一个根文件系统镜像,他与/linux-0.11文件夹下的源码无关。

Bochs会虚拟出一个软盘和一个硬盘,软盘中放image,硬盘中放.img,bochs在启动是会从软盘启动,从而将image中的之前讲的bootset 、setup、 head和 sys内核程序按照之前讲过的顺序边读入内存边执行。当执行到main()中的init()函数时,这个函数的第一句话 setup((void *) &drive_info); 就是调用setup系统调用,安装根目录文件系统,如果此时没有.img文件,则可以在虚拟机页面中看到loading system…之后便报错,报错的语句是printk("Unable to read partition table of drive %dnr", 可以在代码中搜到,即在执行setup系统调用时报错。

文件系统加载完成后,就可以在shell中用ls查看各种文件和目录。当然也可以不启动linux0.11,而是在Ubuntu中将.img文件mount到某个目录下,则点进去看到的东西跟启动linux0.11后的根文件目录ls后看到的一样。

李志军老师的系统调用试验新增三个文件:who.c 、iam.c和whoami.c三个文件。其中who.c是新增的内核文件,写好放在源码的kernel文件夹下,至于为什么要用get_fs_byte来实现内存的访问,因为内核中的ds描述符默认是内核数据段,而我们实际也需要访问用户数据段,需要用到fs描述符,因此要加一层封装,这点在李老师书里详细说明。

who.c 写好后需要重新编译内核然后bochs加载进入shell,在shell中新建iam.c和whoami.c然后进行编译。编译出来的是用户程序,这两个c文件在编译的时候需要 编译一个_syscall2(int, whoami, char*, name, unsigned int, size);这种宏,宏中有一个变量是在unistd.h中定义的,要修改这个文件不应该在linux0.11的源码中找,而应该需要在文件系统中的/usr/include文件夹中找到并修改,因为源码此时已经编译成内核转载软驱载入内存中在跑,修改源码的源文件无意义。在shell的环境中找到include的文件,并进行修改。

#include <string.h>
#include <errno.h>
#include <asm/segment.h>char msg[24];int sys_iam(const char * name)
{char tep[26];int i = 0;for(; i < 26; i++){tep[i] = get_fs_byte(name+i);if(tep[i] == '0')  break;}if (i > 23) return -(EINVAL);strcpy(msg, tep);return i;
}int sys_whoami(char * name, unsigned int size)
{int len = 0;for (;msg[len] != '0'; len++);if (len > size) {return -(EINVAL);}int i = 0;for(i = 0; i < size; i++){put_fs_byte(msg[i], name+i);if(msg[i] == '0') break;}return i;
}

图 who.c代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JPA和Hibernate有效删除数据

您可能会遇到必须对关系数据库中存储的大量数据集执行批量删除的情况。 如果您将JPA与Hibernate一起用作基础OR映射器&#xff0c;则可以尝试通过以下方式调用EntityManager的remove&#xff08;&#xff09;方法&#xff1a; public void removeById(long id) {RootEntity ro…

java21个知识点重点_java21个知识点重点

http://blog.csdn.net/jerroluo/article/details/520025851. JVM相关(包括了各个版本的特性)对于刚刚接触Java的人来说&#xff0c;JVM相关的知识不一定需要理解很深&#xff0c;对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资深开发者来说&#xf…

Django模型中字段属性choice使用

今天设计models时&#xff0c;用到了choice这个属性&#xff0c;用来限制用户做出选择的范围。比如说性别的选择&#xff08;男或女&#xff09;。 class User&#xff08;AbstractUser&#xff09;&#xff1a;。。。sex models.CharField(verbose_name性别,max_length5,choi…

面试题4,打印出100-999所有的“水仙花数”。

提示&#xff1a;水仙花数是指一个 n 位数 ( n≥3 )&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。 &#xff08;例如&#xff1a;1^3 5^3 3^3 153&#xff09; package 面试;/*** 水仙花数* author liugang* create 2018/12/19 20:07**/ public class Shuixianhu…

angularjs的$http请求方式

/*$http常用的几个参数$http服务的设置对象:1、method 字符串 表示发送的请求类型 get post jsonp等等2、url 字符串 绝对或者相对的URL,请求的目标3、params 字符串或对象 会被转化成查询字符串加到URL后面&#xff0c;如果不是字符串会被JSON序列化4、data 字符串或者对象 这…

response对象设置返回状态_postman 设置全局变量

postman大家都知道是一个测试接口的工具&#xff0c;也是目前比较流行的一种测试工具&#xff0c;但是postman只是用来将API地址和参数填入send一下就完了吗&#xff1f;其实不是&#xff0c;关于postman其实有很多玩法&#xff0c;对于测试来说我觉得掌握了postman是非常有必要…

测试过大输入的代码

在编写单元测试时&#xff0c;我们主要关注业务的正确性。 我们将竭尽所能&#xff0c;开开心心地走在最前沿。 我们有时会进行微基准测试并衡量吞吐量。 但是经常遗漏的一个方面是当输入过大时我们的代码如何表现&#xff1f; 我们测试了如何处理正常的输入文件&#xff0c;格…

资源不在java项目和构建路径上_编译单元不在Java项目的构建路径上-Maven

今天,我已经在日食中导入了一个Maven项目.当我尝试自动建议时,当我添加一些代码时,它提示我“编译单元不在Java项目的构建路径上”.我没有看到解决此问题的方法,但是都没有解决.这个应该做什么&#xff1f;xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://m…

Django 第八课 2.【MySQL相关软件 mysqlclient Navicat Premium】

MySQL 驱动程序安装&#xff1a; 我们使用 Django 来操作 MySQL&#xff0c;实际上底层还是通过 Python来操作的。因此我们想要用 Django 来操作 MySQL&#xff0c;首先还是需要安装一个驱动程序。在python3中&#xff0c;驱动程序有多种选择。比如pymysql 以及mysqlclient等。…

查看串口的驱动信息

1、查看串口的驱动信息 2、驱动安装文件&#xff1a;http://www.wch.cn/download/CH341SER_EXE.html 3、参考驱动资料:https://blog.csdn.net/jazzsoldier/article/details/70169732 转载于:https://www.cnblogs.com/qy1234/p/10146303.html

用jQuery监听浏览器窗口的变化

1 $(window).resize(function () { //当浏览器大小变化时 2 alert($(window).height()); //浏览器时下窗口可视区域高度 3 alert($(document).height()); //浏览器时下窗口文档的高度 4 alert($(document.body).height()); //浏览器时下…

java中怎么判断一段代码时线程安全还是非线程安全_Java 中的多线程你只要看这一篇就够了...

引如果对什么是线程、什么是进程仍存有疑惑&#xff0c;请先Google之&#xff0c;因为这两个概念不在本文的范围之内。用多线程只有一个目的&#xff0c;那就是更好的利用cpu的资源&#xff0c;因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对&#xff0c;因…

使用Maven设置您的应用服务器

在许多情况下&#xff0c;无需先设置应用程序就无法部署应用程序。 在JBoss AS 7.x中&#xff0c;您可能需要配置例如数据库连接。 或者&#xff0c;您必须配置一个安全领域。 也许您还想调整SLSB池…在任何一种情况下&#xff0c;团队中的所有开发人员都必须共享一个共同的或至…

[洛谷P3178][HAOI2015]树上操作

题目大意&#xff1a;有一棵点数为 $N$ 的树&#xff0c;以点 1 为根。然后有 $M$ 个操作。 1. 把 $x$ 的点权增加 $a$ 。 2. 把 $x$ 为根的子树中所有点的点权都增加 $a$ 。 3. 询问 $x$ 到根的路径中所有点的点权和。 题解&#xff1a;树链剖分模板题 卡点&#xff1a;我真的…

实现 通过数据库里一个字段值相等 则把 他合为一条数据

需求&#xff1a; 把红色合为一条数据&#xff0c;绿色合为一条数据 结果&#xff1a; 不多说直接上代码......................................................... // 先查所有数据 const goods await service.goods.findAllGoodsWithParams({where: params,offset: ctx.p…

CSS定义字体间距 字体行与行间距

1 2     letter-spacing:像素&#xff08;字母或中文字的左右间距&#xff09;3 4 word-spacing:像素&#xff08;两个单词之间的左右间距&#xff09;5 6 line-height:像素&#xff08;两行之间的间距&#xff09;7 8 text-decoration:字体的装饰&am…

float与double类型参数区别_8大基本数据类型及包装类,不知道这些点别说自己是大佬...

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&#xff0c;而不是内置数据类型的情形。为了解决这个问题&…

宣布EAXY:在Java中简化XML

Java中的XML库是一个雷区。 操作和读取XML所需的代码量令人震惊&#xff0c;使用不同的库遇到类路径问题的风险很大&#xff0c;并且命名空间的处理带来了很多混乱和错误。 最糟糕的是&#xff0c;情况似乎并没有改善。 一位同事让我意识到JOOX库。 这是解决这些问题的一个很好…

9-客户端集成IdentityServer

1-创建客户端的webapi项目 E:\coding\netcore\IdentityServerSample>dotnet new webapi --name IdentityCredentialApi 2-在需要启用授权的方法上增加Authorize标签 3-使用nuget工具安装 IdentityServer4.AccessTokenValidation 4-启用客户端授权&#xff0c; 需要配置连接…

js parseInt()与Number()区别

说到转换成数字类型&#xff0c;我首先想到的是parseInt&#xff08;&#xff09;方法&#xff0c;后来接触多了才发现还有一个Number()方法&#xff0c;同样是转换成数字类型&#xff0c;这两种方法有什么不同的呢&#xff1f; 1.parseInt&#xff08;&#xff09;&#xff1a…