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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

9-客户端集成IdentityServer

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

js替换数组中字符串实例

这个是替换数组中的一个对象字符串&#xff1b; 直接上代码&#xff1a; 1 var aaa[ 2 {"name":"张珊","sex":"man"}, 3 {"name":"李斯","sex":"woman"}, 4 …

ie浏览器升级_微软呼吁用户停用IE浏览器 2020年将不再更新升级

驱动中国2019年2月10日消息 IE浏览器作为美国微软公司推出的一款网页浏览器成为许多人接触互联网初选&#xff0c;深受不少用户喜欢但这款流畅多年的浏览器正式遭弃用&#xff01;今日微软网络安全专家在在官方Winhows IT Pro上发帖呼吁用户停止使用IE浏览器&#xff01;微软网…

CentOS安装zookeeper

第一步&#xff0c;先去Apache下载安装包 http://mirror.bit.edu.cn/apache/zookeeper/ 第二步&#xff0c;上传到服务器并解压 tar -zxvf zookeeper-3.4.6 第三步&#xff0c;新建一个文件夹 #先改个名 mv zookeeper-3.4.6 zookeeper cd zookeeper mkdir data 第四步&#xff…

rdlc报表 矩形高固定_固定资产条码管理系统特点分析

固定资产条码管理系统的特点都有什么&#xff1f;固定资产是维持企业稳定健康发展的重要物质保障&#xff0c;若想最大化发挥固定资产的效能作用&#xff0c;满足生产经营管理的需求&#xff0c;提高应对企业内外部经营环境变化的能力&#xff0c;企业管理者就必须及时了解固定…

bzoj 2007 [Noi2010]海拔——最小割转最短路

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2007 一个点的高度一定不是0就是1。答案一定形如一个左上角的连通块全是0的点、一个右下角的连通块全是1的点。 注意从东到西还有从南到北的边也有用&#xff01;因为不一定是一个阶梯形的&#xff0c;还可以…

《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序

读书笔记第一部分对应原书的第一章&#xff0c;主要介绍了Web应用程序的发展&#xff0c;功能&#xff0c;安全状况。 Web应用程序的发展历程 早期的万维网仅由Web站点构成&#xff0c;只是包含静态文档的信息库&#xff0c;随后人们发明了Web浏览器用来检索和显示那些文档&am…

电脑入门完全自学手册_3DMAX零基础入门到精通的学习路线和教程

没有美术基础可以学建模吗&#xff1f;毋庸置疑&#xff0c;只要肯学都是可以的&#xff01;那么我们今天来说说零基础学习建模要着重注意什么。最高效最快速的入门学习方式&#xff1a;看知识兔视频课程&#xff0c;跟着知识兔老师操作&#xff0c;听知识兔老师讲解&#xff0…

Python-UiAutomator2实现Android自动化测试

本帖转自搜狗测试公众号 【一、前言】 基于Python-UiAutomator2实现Android自动化测试&#xff0c;小编在Android应用的自动化性能测试中进行了实践。本篇将简单介绍python中使用adb、aapt命令的方法以及Python-UiAutomator2使用&#xff0c;后续文章将对环境搭建以及自动化性能…

硬件信息修改大师_零成本学习之单片机硬件开发(1)

从今天开始给大家逐步讲解单片机编程&#xff0c;有兴趣的小伙伴们&#xff0c;可以关注本课程&#xff0c;完全免费本人从事从2004年大学毕业开始从事开发工作&#xff0c;先后做过单片机开发、ucOSII开发、手机开发、android APP开发、PHP开发、微信小程序开发&#xff0c;目…

ionic3 自动创建启动背景splash以及图标icon

在新建的项目文件夹下的 resources下就是我们放置图标以及启动背景图片的位置了。 如果现在我们想生成自己的图片的启动背景以及图片&#xff0c;我们需要把resources下的 icon.png 以及splash.png 替换为我们的图片。 icon 图片最好为1024x1024像素 splash 图片最好为2732x2…