[操作系统理论] 2, 系统调用的实现

一, 操作系统的保护机制

1, 直观的想法

  假设有一个系统调用whoami(), 这个系统调用的功能是显示出当前计算机的所有者. 假设这台计算机是我的, 那么在操作系统的内核部分的内存中的某一个地方存放着我的名字: "aixiangfei", 假设这个内存的地址是100.

  对于whoami()的实现, 最直观的想法就是: 直接把地址100处的字符串复制过来, 然后打印到到屏幕上.

  如果真的是这种实现方法, 那么这个操作系统是非常不安全的! 比如说: 我们的密码肯定也是被保存在了操作系统的内存中, 那么任何人都可以轻松地获取系统的密码. 这样肯定是不行的.

2, 内核态和用户态

  为了操作系统的安全, 一定不能让应用程序直接访问操作系统内核中的数据. 要实现这种想法, 必须通过硬件来实现. 实际上, CPU可以把内存分割成两个部分: 用户态和内核态. 内核态的程序可以访问内存的任何数据, 而用户态不能访问内核的数据.

  这样表述可能有些抽象, 具体来说, 就是通过段寄存器和GDT表来实现的. ecs寄存器的低两位, 叫做CPL (current Privilege Level 当前特权级). 虽然2个位可以表示4种状态, 但是在linux 0.11中,只用到了两种状态, 就是0和3. 用0表示内核态, 用3表示用户态. 而代码段GDT描述符表中的13位和14位, 叫做DPL(Descriptor Privilege Level目标特权级). 只有当DPL>=CPL时, CPU才允许应用程序进入到内核中. 比如说: 当CPL=0, DPL=0 或者 CPL=0, DPL=3, 应用程序就可以进入到内核中了. 而cs寄存器的值是不能够随意更改的, 只有int 0x80中断指令才能使CPL才会变成0, 这时就可以进入到内核了! 这是用户程序发起调用内核代码的唯一方式.

  所以, 用户程序想要访问内核数据的方法是:

  (1) 用户程序中包含一段包含int 0x80中断指令的代码

  (2) 操作系统写中断处理

  (3) 操作系统根据编号执行相应代码

  这就是操作系统的基本的保护机制

二, printf()函数的实现

时间: 2024-08-01 22:43:00

[操作系统理论] 2, 系统调用的实现的相关文章

操作系统理论

操作系统理论: 1. 操作系统是什么? 操作系统是一个协调\管理\控制计算机硬件资源与应用软件资源的一段控制程序 有两大功能: 1. 将复杂的硬件操作封装成简单的接口给应用程序或者用户去使用 2. 将多个进程对硬件的竞争变得有序 操作系统发展史 并发: 多个任务看起来是同时运行的 串行:一个任务完完整整地运行完毕,才能运行下一个任务 多道技术:(复用=>共享/共用) 1. 空间上的复用:多个任务复用内存空间 2. 时间上的复用:多个任务复用cpu的时间 1. 一个任务占用cpu时间过长会被操作系

Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误

Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.c > Author: > Mail: > Created Time: Tue 10 Feb 2015 01:23:58 AM PST **********************************

操作系统理论与多道技术

什么是操作系统 操作系统是一个协调,控制,管理计算机硬件与软件的控制程序. 细说的话,操作系统应该分成两部分功能: #一:隐藏了丑陋的硬件调用接口,为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口). 应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可. 例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作, 有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动,移动磁头读写数据等细节), #二:将应用程序对硬件资源的竞态

文件操作(Linux系统调用)

1.创建文件int creat(const char *filename, mode_t mode)filename:要创建的文件名(包含路径,缺省为当前路径)mode:创建的文件的模式/访问权限常见模式:S_IRUSR 可读S_IWUSR 可写S_IXUSR 可执行S_IRWXU 可读.可写.可执行还可以直接使用数字来表示文件的访问权限:可执行 1可写 2可读 4上述三个值的和,如可读可写可执行 7(1+2+4)无任何权限 0 1 #include <stdio.h> 2 #include

4月23日 python学习总结 套接字UDP和 操作系统理论,多道理论

一.套接字UDP udp是无链接的,先启动哪一端都不会报错 UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务.不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了. 即面向消息的通信是有消息保护边界的.   服务器 #服务器 ss = socket

文件操作接口的系统调用分析---SYSCALL_DEFINEx

linux/arch/arm/kernel/call.S ... CALL(sys_read) CALL(sys_write) CALL(sys_open) CALL(sys_close) ... 以read,write接口举栗子: linux/fs/read_write.c SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) {      struct file *file;      ssize

[操作系统理论] 1, 操作系统的启动

一, 执行BIOS程序 x86 PC刚开机的时候, CPU处于实模式, 实模式和保护模式相对应, 实模式的寻址是cs:ip (CS左移4位+ip). 开机时, cs=0xFFFF, ip=0x0000, 也就是说cpu从0xFFFF0地址处开始执行, 但是我们发现0xFFFF0这个地址距离0xFFFFF只有16个字节, 这16个字节并不能做什么事情, 所以在0xFFFF0处的指令是一个跳转指令 jmp far f000:e05b 跳转到对应的地址处执行. 这里的代码具体的任务是检查硬件, 如RA

【Linux】文件操作系统调用

一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的文件描述符,即标准输入.标准输出.和标准错误,他们的文件描述符的值分别为0.1.2. 文件描述符是文件系统中连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程,进程用这个文件描述符来对文件进行操作. 二. 打开.创建文件o

Linux 文件操作总结

http://blog.163.com/he_junwei/blog/static/19793764620152592737741/ ioctl?? lseek?? 文件是linux中的一个重要概念.在Linux中,一切(几乎一切)都是文件.简单的说,C中基本的的printf()函数,scanf()函数,其实都属于文件操作. 对于文件操作,虽然都是通过函数调用的方式实现,却还是能分为两类:系统调用和库函数. 这篇文章将先介绍linux中文件的概念,系统调用和库函数的概念 ,然后具体的讨论两种方式