CN102063303A - 使Linux内核支持WinCE/WM的kdata页面的方法 - Google Patents
使Linux内核支持WinCE/WM的kdata页面的方法 Download PDFInfo
- Publication number
- CN102063303A CN102063303A CN2010106195448A CN201010619544A CN102063303A CN 102063303 A CN102063303 A CN 102063303A CN 2010106195448 A CN2010106195448 A CN 2010106195448A CN 201010619544 A CN201010619544 A CN 201010619544A CN 102063303 A CN102063303 A CN 102063303A
- Authority
- CN
- China
- Prior art keywords
- kdata
- page
- thread
- wince
- linux kernel
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Exchange Systems With Centralized Control (AREA)
Abstract
本发明涉及一种使Linux内核支持WinCE/WM的kdata页面的方法,(1)为Linux内核增设一个系统调用,用来为WinCE/WM线程分配一个物理页面用于该线程的Kdata数据结构,称为“kdata页面”;(2)在WinCE/WM应用软件所依赖的动态连接库Ntdll.dll中每当创建线程时就调用一次这个新增的系统调用,为所创建的线程分配Kdata页面;(3)在线程控制块task struct数据结构中增设一个指针,使其指向本线程的Kdata页面;(4)每当切换线程时,都把目标线程的Kdata页面映射到地址为0xffffc000的位置上,并将这个页面的访问权限设置成允许用户态读写。本发明有益的效果是:通过少量修改Linux内核的程序代码,使其支持Kdata的方法。其效果是按此方法修改后的Linux内核支持WinCE/WM的内存格局,使WinCE/WM应用直接在Linux内核上运行成为可能。
Description
技术领域
本发明涉及一种在计算机操作系统中实现跨系统兼容的方法,尤其是一种使Linux内核支持WinCE/WM的kdata页面的方法。
背景技术
以手机为代表的智能化移动终端设备是计算机技术的一个重要发展方向。无论是手机、上网本、还是平板电脑,本质上都是计算机。而操作系统,则相当于计算机的灵魂,任何计算机都离不开操作系统,同时也都受操作系统的限制,所有的应用软件都是基于某种特定操作系统的,都只能在这种特定的操作系统上运行,搬到别的操作系统上就不能运行。操作系统的核心称为“内核”,内核为应用软件提供特定的运行环境、并提供基本的操作能力,因此所谓“基于某种特定操作系统”实际上首先和主要是基于某种操作系统内核。应用软件的运行环境是由多种因素决定的,其中之一就是用户空间的内存格局。之所以说“用户空间”内存格局,是因为应用软件的运行只跟用户空间有关,而与“系统空间”无关。
目前,在手机和移动设备领域占统治地位的操作系统有这么几种:
●开源的Linux操作系统。由谷歌公司推出的Android,还有由多家公司联合推出的MeeGo,以及由中国移动推出的OPhone都是基于Linux的,都采用Linux内核。
●微软的WinCE和Windows Mobile(缩写为WM)操作系统。这是由微软在Windows的基础上针对手机和移动设备开发的两种操作系统,这二者很相似,大体上可以认为是同一种操作系统的不同版本。市场上有许多手机都采用WinCE/WM操作系统。
●苹果公司的Mac操作系统。Mac操作系统是由Unix操作系统演变而来的,与Linux有着相同的源头。
●诺基亚的Symbian操作系统。
如上所述,所有应用软件都是基于某种特定操作系统的。既然有四种操作系统,自然就有四大类不同的应用软件,例如基于Linux的应用软件就统称为Linux应用,拿到别的操作系统上就不能运行。如果某公司开发了一个Linux应用,又希望在WinCE/WM上也有同样的应用,就需要通过“移植”,反之亦然。
显然,如果能让基于一种操作系统的应用不经移植就能直接在另一种操作系统上运行,那将是很有意义的。举例言之,如果能让WinCE/WM应用直接在采用Linux的手机例如OPhone上运行,那就使Linux手机的用户平添了许多的选择。
但是这并非易事,困难来自很多方面,其中之一就是内存格局的问题。
内存格局是构成应用软件运行环境的一个重要因素,每一个操作系统都有对于用户空间内存格局的明确定义,应用软件无法在一个与预想不符的环境中运行。WinCE/WM与Linux在用户空间的格局安排上有着重要的不同,主要表现在两个方面。
一般而言,32位计算机整个逻辑内存空间、即地址空间的大小是4GB。WinCE/WM把这4GB的空间对分,把地址较高的2GB作为系统空间、即用于内核,另外2GB则用于用户空间、即用于应用软件。而Linux,则把地址较高的1GB作为系统空间,而把剩下的3GB用于用户空间。不过这并不成为问题,因为3GB大于2GB,WinCE/WM应用软件尽可只用其中的2GB,而1GB的内核空间也已经够Linux内核只用了。
可是,另一方面,WinCE/WM的内存格局还有个特殊性,就是在地址为0xffffc800、本属于系统空间的位置上放上了一个特殊的数据结构,称为Kdata,意为“来自内核(Kernel)的数据”。这个数据结构一方面可以用来在应用软件和内核之间交换一些特殊的数据,另一方面也用来存放一些专属于具体“线程”的数据。这些数据因不同线程而异,但是应用软件运行时的每一个线程都在相同的地址上读写这些数据,通常还根据这些数据决定下一步的操作和行程。也就是说,如果有属于同一个进程的两个不同线程,二者都以同样的地址从Kdata读出,那么二者所读出的数据必须是属于其自己的版本,因而可能是不同的。然而Linux却根本就没有这样的安排。这样,只要一个WinCE/WM应用软件在运行时需要按WinCE/WM的许诺用到这些数据,其运行就注定会失败。事实上,应用软件只要企图访问属于系统空间的任何地址,就会引起系统的内存访问“异常”而结束运行,这是操作系统的一个保护机制。
其实Kdata中的数据几乎全是由具体的线程在用户空间填写进去的,对于一个特定的线程而言,只要以后从Kdata读回的数据就是当初自己写进去的版本就行。可是,由于Linux没有相应的安排,这一点恰恰是成问题的。这是因为,属于同一个进程的所有线程都共享相同的地址空间,也即它们的用户空间是相同的,更确切地说是共享同一个页面映射表。这样,当属于同一个进程的两个线程用相同的地址访问一个内存单元时,他们所访问的确实就是同一个物理内存单元,因此就有了不同线程之间互相干扰的问题。例如,假定一个线程往Kdata的某个单元里面写了数据1;但是后来轮到另一个线程运行了,那个线程往这个单元里写了1000;然后又轮到原先这个进程运行,这个线程从Kdata读回数据,这数据本应该是1,现在却变成了1000。
所以,这里要解决的问题分成两个方面:
1、使应用程序可以正常访问本属于系统空间而不允许用户程序访问的kdata数据结构。
2、使运行WinCE/WM应用软件的每个线程都有自己的kdata,并且都可以按同样的地址(0xffffc800)访问自己的kdata,互不干扰。
其中的第一个方面容易解决,只要将页面映射表中相应的页面设置成用户态可访问就行了。而第二个方面则比较麻烦。
很明显,Kdata的问题是WinCE/WM内存格局问题的核心,解决了Kdata的问题,就解决了WinCE/WM内存格局的问题。这个问题是必须要解决的,否则就无法在Linux内核上直接运行WinCE/WM应用。
发明内容
为解决Kdata的问题,本发明提供了一种使Linux内核支持WinCE/WM的kdata页面的方法,使Linux操作系统内核支持WinCE/WM操作系统内存格局所特有的kdata内存页面,替WinCE/WM应用软件提供一个视在的虚拟WinCE/WM内存环境,为WinCE/WM应用软件直接在Linux内核上运行创造条件。
本发明解决其技术问题采用的技术方案:这种使Linux内核支持WinCE/WM的kdata页面的方法,这个方法包括以下几方面的代码修改:
(1)、为Linux内核增设一个系统调用,用来为WinCE/WM线程分配一个物理页面用于该线程的Kdata数据结构,称为“kdata页面”;
(2)、在WinCE/WM应用软件所依赖的动态连接库Ntdll.dll中每当创建线程时就调用一次这个新增的系统调用,为所创建的线程分配Kdata页面;
(3)、在线程控制块task_struct数据结构中增设一个指针,使其指向本线程的Kdata页面;
(4)、每当切换线程时,都把目标线程的Kdata页面映射到地址为0xffffc000的位置上,并将这个页面的访问权限设置成允许用户态读写。
这样,当WinCE/WM应用软件在Linux内核上运行,并且其中的某个线程按WinCE/WM操作系统约定的地址0xffffc800访问Kdata数据结构中的数据时,由于上述修改使Linux内核在切换线程时已将这个线程的Kdata数据结构所在的页面映射到这个地址上,所访问的实际上是内核中为这个线程分配的物理页面。每个线程都有自己专用的Kdata页面,并且每当切换线程时都会使用户空间的这个地址指向当前线程的Kdata数据结构,所以这个页面的内容不会受到来自其它线程的干扰。
这样做的结果就是:虽然属于同一个进程的不同线程使用同一个页面映射表;但是,当其中的任何一个线程运行时,这个页面映射表中用于Kdata的表项却总是指向这个线程自己的Kdata。于是就避免了不同线程之间的互相干扰。
下面用一个假想的运行过程作为例子加以进一步的说明。
1、启动一个WinCE/WM应用在修改后的Linux内核上运行,假定其原始线程为T1,此时运行这个应用的进程中只有一个线程。
2、T1在运行中创建了线程T2,于是同一个进程中便有了两个线程。也就是说,T1和T2这两个线程属于同一个进程,因此公用同一个页面映射表。但是,由于对Linux内核的前述修改,T1和T2各有自己的Kdata数据结构。
3、由于对Linux内核的前述修改,载有Kdata数据结构的物理页面被映射到约定的地址上,成为允许应用程序访问的Kdata数据结构。由于存储映射机制的作用,以及对Linux内核的前述修改,T1和T2通过相同的地址访问Kdata数据结构,实际上却指向不同的物理页面。
4、假定T1在运行过程中按约定的地址访问用户空间的Kdata数据结构,使用并修改了Kdata数据结构中的数据,那么其所使用和修改的数据实际上在其自己的Kdata页面中。
5、现在假定内核调度另一个线程Tn运行,则会将当前页面映射表替换成Tn的页面映射表,这是Linux内核本来就有的功能。在这个映射表中:
●如果Tn也是WinCE/WM线程,就有自己的Kdata页面,此时映射表中的相应表项将指向Tn自己的Kdata。这样,Tn从用户空间访问Kdata时所实际访问的是Tn自己的Kdata,与T1的Kdata无关。
●如果Tn不是WinCE/WM线程,则不使用Kdata,上述代码修改对其没有影响。
6、过一段时间之后,假定内核又调度T1运行,则又换成T1的页面映射表,于是又回到上面的步骤4。
可见,对Linux内核代码的上述修改解决了Kdata页面的问题,既使运行于用户态的应用程序可以访问Kdata数据结构,又避免了线程之间的互相干扰,从而使WinCE/WM应用软件直接在Linux内核上运行成为可能。
本发明有益的效果是:本发明提供了一种利用CPU的存储页面映射机制,通过少量修改Linux内核的程序代码,使其支持Kdata的方法。其效果是按此方法修改后的Linux内核支持WinCE/WM的内存格局,使WinCE/WM应用直接在Linux内核上运行成为可能。
附图说明
图1是本发明中WinCE/WM和Linux的内存格局示意图;
图2是本发明中新添内核函数kdata_open()的流程示意图;
图3是本发明中切换线程时为支持Kdata所需的流程示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明:
附图1中,整个32位逻辑地址空间的大小是4GB,地址范围从0x00000000到0xffffffff。其中地址最低的2GB,即图中白色的两大块,在WinCE/WM和Linux中都用作用户空间,其地址范围为0x00000000到0x7fffffff(即0x80000000-1),应用程序就在用户空间运行。再上面的1GB,即图中画上斜线的部分,地址为0x80000000到0xbfffffff(即0xc0000000-1),在WinCE/WM中是系统空间的一部分,而在Linux中却是用户空间的一部分。所以,Linux的系统空间比WinCE/WM小,但是已经够了,因为Linux内核比WinCE/WM内核小。然后,最上面的1GB,即图中黑色的部分,地址为0xc0000000到0xffffffff,在WinCE/WM和Linux中都用作系统空间,操作系统内核在系统空间中运行。注意这黑色区间中的一条白带,它代表着一个页面、即大小为4KB的一小块区间,其地址为0xffffc000到0xffffcffff(即0xffffd000-1)。在WinCE/WM中,这就是用于Kdata的页面,这个页面允许从用户态访问,所以在图中也是白色的,就好像系统空间的一个向用户态开放的空洞。但是在Linux中则不存在这样的空洞,只要从用户态访问这个区间就会引起内存访问异常(exception)。注意Kdata数据结构的地址是0xffffc800,但内存是按页面分配的,而且必须与页面分界对齐,一个页面的大小是4KB,所以Kdata数据结构正好落在从0xffffc000到0xffffcffff的这个页面中。
附图2所示的这个流程很简单,就是为当前线程分配一个用于Kdata的物理页面并加以初始化,再将其纪录在当前线程的线程控制块task_struct中,为此需要在task_struct中增添一个字段。
每当成功创建了一个WinCE/WM线程后,就以所创建线程的线程号为参数调用这个系统调用,为其分配Kdata页面。
附图3则是线程切换时的程序流程。切换线程时,要判断即将运行的目标线程是否WinCE/WM线程,这可以根据其task_struct中用来记录Kdata页面的指针是否为空加以判断;如果是WinCE/WM线程就设置页面映射表的相应表项,使其指向目标线程的Kdata物理页面,并将其访问权限设置成允许用户态的读/写。
本方法的具体实施涉及对Linux内核和Wine源代码的修改,这二者都是开源软件,其源代码都可从有关网站获取。下面分四个方面说明本方法的一个实施例。注意同一个方法可以有多种不同的实施,这里所提供的只是其中之一。
1、在线程控制块task_struct中增设一个指针
为记录每个WinCE/WM线程的Kdata页面,需要在task_struct数据结构中增添一个字段,用来指向代表着本线程Kdata页面的page数据结构:
对于WinCE/WM线程,指针kdata用来指向其Kdata页面;对于Linux线程则该指针为空。
2、为Linux内核增添一个新的系统调用kdata_open()
为Linux内核增添系统调用的方法有很多,这里采用一个简化的方法,即在/proc下面创建一个特殊文件节点/proc/kdata。这样,只要应用程序要求打开这个特殊文件,即针对/proc/kdata进行系统调用open(),就会进入内核并调用这个特殊文件的open函数kdata_open()。
在/proc下面增添特殊文件节点并创建内核中有关驱动程序框架的方法对于对Linux设备驱动程序有所了解的程序员并非难事,具体可参考“Linux Device Drivers”等有关专著。此外,可以将Linux内核源代码中/fs/proc/cpuinfo.c的代码用作样板,所不同的是对于kdata只需提供一个函数就是kdata_open(),比cpuinfo还简单。因此,其file_operations结构定义为:
static const struct file_operations pro_kdata_operations={
.open =kdata_open,
};
至于在/proc目录下创建节点,那也很简单:
static int_init proc_kdata_init(void)
{
proc_create(″kdata″,0,NULL,&proc_kdata_operations);
return 0;
}
下面是kdata_open()的伪代码描述:
int kdata_open(int tid)
{
通过内核函数alloc_pages()为当前线程分配一个物理页面;
使当前线程的task_struct数据结构中的字段kdata指向这个页面;
}
3、修改Linux内核中的线程切换函数_switch_to()
Linux通过内核函数_switch_to()进行线程切换。通过switch_mm()
4、从用户空间调用新添的系统调用kdata_open
所有的WinCE/WM应用程序、即EXE程序、都依赖于几个系统级的动态连接库,即DLL。虽然这些DLL运行于用户空间,实际上却应看作是操作系统的一部分。这样的DLL主要有三个,就是kernel32.dll、user32.dll、和ntdll.dll。为避免涉及微软的知识产权,开源项目Wine开发了自有知识产权的DLL,并开源提供给公众,其中就包括这些系统DLL。
凡WinCE/WM线程都是通过kernel32.dll中的API函数CreateThread()创建的,被创建的线程首次投入运行时都要先执行一个初始化函数thread_init()。所以我们可以在这个函数的末尾加上一行代码,让它调用我们新添的系统调用kdata_open(),这个函数在Wine源代码的dlls/ntdll/thread.c中:
通过以上四方面的修改,就解决了使Linux操作系统为WinCE/WM应用提供Kdata支持的问题,使WinCE/WM应用直接在Linux内核上运行成为可能。
除上述实施例外,本发明还可以有其他实施方式。凡采用等同替换或等效变换形成的技术方案,均落在本发明要求的保护范围。
Claims (2)
1.一种使Linux内核支持WinCE/WM的kdata页面的方法,其特征在于:
(1)、为Linux内核增设一个系统调用,用来为WinCE/WM线程分配一个物理页面用于该线程的Kdata数据结构,称为“kdata页面”;
(2)、在WinCE/WM应用软件所依赖的动态连接库Ntdll.dll中每当创建线程时就调用一次这个新增的系统调用,为所创建的线程分配Kdata页面;
(3)、在线程控制块task struct数据结构中增设一个指针,使其指向本线程的Kdata页面;
(4)、每当切换线程时,都把目标线程的Kdata页面映射到地址为0xffffc000的位置上,并将这个页面的访问权限设置成允许用户态读写。
2.根据权利要求1所述的使Linux内核支持WinCE/WM的kdata页面的方法,其特征在于:当WinCE/WM应用软件在Linux内核上运行,并且其中的某个线程按WinCE/WM操作系统约定的地址0xffffc800访问Kdata数据结构中的数据时,使Linux内核在切换线程时已将这个线程的Kdata数据结构所在的页面映射到这个地址上,所访问的实际上是内核中为这个线程分配的物理页面,每个线程都有自己专用的Kdata页面,并且每当切换线程时都会使用户空间的这个地址指向当前线程的Kdata数据结构。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010619544 CN102063303B (zh) | 2010-12-22 | 2010-12-22 | 使Linux内核支持WinCE/WM的kdata页面的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010619544 CN102063303B (zh) | 2010-12-22 | 2010-12-22 | 使Linux内核支持WinCE/WM的kdata页面的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102063303A true CN102063303A (zh) | 2011-05-18 |
CN102063303B CN102063303B (zh) | 2013-07-31 |
Family
ID=43998592
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010619544 Active CN102063303B (zh) | 2010-12-22 | 2010-12-22 | 使Linux内核支持WinCE/WM的kdata页面的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102063303B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354011A (zh) * | 2015-12-08 | 2016-02-24 | 中国人民解放军国防科学技术大学 | 面向多核并行程序的确定性懒惰释放一致性实现方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851675A (zh) * | 2006-04-04 | 2006-10-25 | 浙江大学 | 处理器高速数据缓存重配置方法 |
CN101615129A (zh) * | 2009-07-29 | 2009-12-30 | 中兴通讯股份有限公司 | 应用于分布式系统中的升级方法及版本管理客户端 |
CN101814020A (zh) * | 2010-04-15 | 2010-08-25 | 长沙理工大学 | 一种基于嵌入式的程序快速执行方法及系统 |
CN101872312A (zh) * | 2009-04-21 | 2010-10-27 | 张纪胜 | VMM动态获取客户机Linux中进程描述符的方法 |
-
2010
- 2010-12-22 CN CN 201010619544 patent/CN102063303B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851675A (zh) * | 2006-04-04 | 2006-10-25 | 浙江大学 | 处理器高速数据缓存重配置方法 |
CN101872312A (zh) * | 2009-04-21 | 2010-10-27 | 张纪胜 | VMM动态获取客户机Linux中进程描述符的方法 |
CN101615129A (zh) * | 2009-07-29 | 2009-12-30 | 中兴通讯股份有限公司 | 应用于分布式系统中的升级方法及版本管理客户端 |
CN101814020A (zh) * | 2010-04-15 | 2010-08-25 | 长沙理工大学 | 一种基于嵌入式的程序快速执行方法及系统 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354011A (zh) * | 2015-12-08 | 2016-02-24 | 中国人民解放军国防科学技术大学 | 面向多核并行程序的确定性懒惰释放一致性实现方法 |
CN105354011B (zh) * | 2015-12-08 | 2017-10-27 | 中国人民解放军国防科学技术大学 | 面向多核并行程序的确定性懒惰释放一致性实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102063303B (zh) | 2013-07-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10157268B2 (en) | Return flow guard using control stack identified by processor register | |
US9864702B2 (en) | Techniques to prelink software to improve memory de-duplication in a virtual system | |
JP5735070B2 (ja) | パーティション分割されたシステムにおいて、デバイスがメモリにアクセスするための、ゲスト・アドレスからホスト・アドレスへの変換 | |
US11171983B2 (en) | Techniques to provide function-level isolation with capability-based security | |
US20100031276A1 (en) | Method for Constructing Virtual Operating System | |
US9507613B2 (en) | Methods and apparatus for dynamically preloading classes | |
CN101630276B (zh) | 一种高效的内存访问方法 | |
US10061701B2 (en) | Sharing of class data among virtual machine applications running on guests in virtualized environment using memory management facility | |
US11693722B2 (en) | Fast memory mapped IO support by register switch | |
WO2023124968A1 (zh) | 软件操作系统调用Android动态库HAL接口的方法、设备及介质 | |
CN101484876A (zh) | 多任务虚拟机的堆组织 | |
TW202225976A (zh) | 虛擬化寄存器裝置和存取該裝置的方法和電腦程式產品 | |
US8910136B2 (en) | Generating code that calls functions based on types of memory | |
US20090254919A1 (en) | Sharing Operating System Sub-Processes Across Tasks | |
CN102063303B (zh) | 使Linux内核支持WinCE/WM的kdata页面的方法 | |
CN113792299B (zh) | 一种基于ftrace技术的Linux系统保护方法 | |
US10496555B2 (en) | Implementing per-thread memory access permissions | |
US11900142B2 (en) | Improving memory access handling for nested virtual machines | |
US20230342172A1 (en) | Scalable asynchronous communication for encrypted virtual machines | |
Marzi et al. | Microkernel based real-time embedded operating systems efficiency improvement | |
US20230350710A1 (en) | Fast memory mapped io support by register switch | |
Yang et al. | A RISC-V On-chip Operating System Based on Rust | |
McKitterick | Development of benos: an x86 operating system | |
Lee et al. | Alleviating I/O Interference in Virtualized Systems With VM-Aware Persistency Control | |
Ahn et al. | A Design of Kernel-Level Remote Memory Extension System |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |