<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=417&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 介绍Linux下的系统调用过程]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=417</link>
		<description><![CDATA[介绍Linux下的系统调用过程 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 01 Sep 2022 03:22:34 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[介绍Linux下的系统调用过程]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=423#p423</link>
			<description><![CDATA[<p>首先，应用程序能直接调用的是系统提供的API，这个在用户态（Ring3）下就可做到。</p><p>然后相应的API就会将相应的系统调用号保存到eax寄存器中（这一步通过内联汇编实现），之后就是使用int 0x80触发中断（内联汇编），进入到中断处理函数中（该函数是完全由汇编代码编写），这个时候就进入到了内核态（Ring0）了。</p><p>在中断处理函数中就会调用与系统调用号相对应的那个系统调用。在这个函数中，会把ds、es这两个寄存器设置为指向内核空间。这样一来，我们无法把数据从用户态中传到内核态啊（如open(const char * filename, int flag, ...)中，filename指针指向的字符串的地址是在用户空间中的，在内核空间相应的地方取的话根本没有该字符串），这该怎么办呢？中断处理函数中的fs寄存器被设置为指向了用户空间，所以问题得以解决。</p><p>在系统调用中就是进行相应的操作了，如打开文件、写文件等。</p><p>处理完后，将会返回到中断处理函数，返回值保存在eax寄存器中。</p><p>从中断处理函数中返回到API，依旧是把返回值保存到eax寄存器中。这个时候就从内核态恢复成用户态。</p><p>在API中从eax中取出值，做相应的判断返回不同的值，用以表示操作完成情况。<br />为什么使用int 0x80中断能调用那么多系统调用？</p><p>在保护模式下，有各种各样的中断，而系统调用就和0x80号中断绑定。当要调用系统调用时，就触发int 0x80，中断处理函数就通过eax获知想要调用的是哪一个系统调用。这样做的原因是系统调用数量太多，中断号会不够用，所以用一个来集中管理。</p><p>操作系统中有一个表，是用来保存各个系统调用函数的地址的。这个表是一个数组，所以通过下标就可以访问到不同函数的地址。故可以做到一个中断号+各样的系统调用号就管理多个系统调用。</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Thu, 01 Sep 2022 03:22:34 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=423#p423</guid>
		</item>
	</channel>
</rss>
