Java中的用户程序如何进行系统调用/调用内核子程序?

Posted

技术标签:

【中文标题】Java中的用户程序如何进行系统调用/调用内核子程序?【英文标题】:How user programs like in Java, make system calls/ call kernel subroutines? 【发布时间】:2013-11-09 14:32:20 【问题描述】:

我想弄清楚用户空间程序和操作系统交互。在文件 I/O 的上下文中,我想知道像 java 文件 i/o API read() 这样的用户应用程序如何工作。 由于文件操作是通过open() close() read() write()等POSIX系统调用来访问的,那么java代码是如何调用这些系统调用的呢?

当我们编译java代码时,java read() API会被编译成什么样的指令? 据说,用户程序会引发陷阱/软件中断以进行系统调用。那么Java read() API 是否也引发了陷阱? java中是否有用于引发陷阱的API?如果是,那么这些 API 可能会被编译以捕获诸如 'INT' 之类的指令?但是,INT 是否调用更高层的 POSIX 系统调用或一些固定的 ISR(中断服务例程)?

我很困惑,并试图一步一步了解......从编译到执行 - 在这种情况下如何完成系统调用。

请帮我理解这个简单的概念。

【问题讨论】:

见JNI和JNA。 JNI 如何发起对 C/C++ 库/程序的调用? 【参考方案1】:

也许我对http://pages.cs.wisc.edu/~remzi/OSFEP/intro-syscall.pdf得到了很好的澄清 因此,我提出以下流程:Java 代码 -> JNI -> C 中的 read() 系统调用 -> 内核子例程。 但最后一个疑问:Java中的JNI如何调用C代码?

【讨论】:

以上是关于Java中的用户程序如何进行系统调用/调用内核子程序?的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核中添加系统调用接口简单示例

Linux系统调用跟我学(1)

Socket与系统调用深度分析

如何调用有参数的子程序?

系统调用

如何在windows服务程序中调用带窗口中的程序