⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal13c1-2.4.24.patch

📁 rtai-3.1-test3的源代码(Real-Time Application Interface )
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
diff -uNrp linux-2.4.24/Documentation/adeos.txt linux-2.4.24-adeos/Documentation/adeos.txt--- linux-2.4.24/Documentation/adeos.txt	1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.24-adeos/Documentation/adeos.txt	2004-03-21 18:28:04.000000000 +0100@@ -0,0 +1,172 @@++The Adeos nanokernel is based on research and publications made in the+early '90s on the subject of nanokernels. Our basic method was to+reverse the approach described in most of the papers on the subject.+Instead of first building the nanokernel and then building the client+OSes, we started from a live and known-to-be-functional OS, Linux, and+inserted a nanokernel beneath it. Starting from Adeos, other client+OSes can now be put side-by-side with the Linux kernel.++To this end, Adeos enables multiple domains to exist simultaneously on+the same hardware. None of these domains see each other, but all of+them see Adeos. A domain is most probably a complete OS, but there is+no assumption being made regarding the sophistication of what's in+a domain.++To share the hardware among the different OSes, Adeos implements an+interrupt pipeline (ipipe). Every OS domain has an entry in the ipipe.+Each interrupt that comes in the ipipe is passed on to every domain+in the ipipe. Instead of disabling/enabling interrupts, each domain+in the pipeline only needs to stall/unstall his pipeline stage. If+an ipipe stage is stalled, then the interrupts do not progress in the+ipipe until that stage has been unstalled. Each stage of the ipipe+can, of course, decide to do a number of things with an interrupt.+Among other things, it can decide that it's the last recipient of the+interrupt. In that case, the ipipe does not propagate the interrupt+to the rest of the domains in the ipipe.++No hosted domain is allowed to use the real hardware cli/sti. But this+is OK, since the stall/unstall calls achieve the same functionality.++Our approach is based on the following papers (links to these+papers are provided at the bottom of this message):+[1] D. Probert, J. Bruno, and M. Karzaorman. "Space: a new approach to+operating system abstraction." In: International Workshop on Object+Orientation in Operating Systems, pages 133-137, October 1991.+[2] D. Probert, J. Bruno. "Building fundamentally extensible application-+specific operating systems in Space", March 1995.+[3] D. Cheriton, K. Duda. "A caching model of operating system kernel+functionality". In: Proc. Symp. on Operating Systems Design and+Implementation, pages 179-194, Monterey CA (USA), 1994.+[4] D. Engler, M. Kaashoek, and J. O'Toole Jr. "Exokernel: an operating+system architecture for application-specific resource management",+December 1995.++If you don't want to go fetch the complete papers, here's a summary.+The first 2 discuss the Space nanokernel, the 3rd discussed the cache+nanokernel, and the last discusses exokernel.++The complete Adeos approach has been thoroughly documented in a whitepaper+published more than a year ago entitled "Adaptive Domain Environment+for Operating Systems" and available here: http://www.opersys.com/adeos+The current implementation is slightly different. Mainly, we do not+implement the functionality to move Linux out of ring 0. Although of+interest, this approach is not very portable.++Instead, our patch taps right into Linux's main source of control+over the hardware, the interrupt dispatching code, and inserts an+interrupt pipeline which can then serve all the nanokernel's clients,+including Linux.++This is not a novelty in itself. Other OSes have been modified in such+a way for a wide range of purposes. One of the most interesting+examples is described by Stodolsky, Chen, and Bershad in a paper+entitled "Fast Interrupt Priority Management in Operating System+Kernels" published in 1993 as part of the Usenix Microkernels and+Other Kernel Architectures Symposium. In that case, cli/sti were+replaced by virtual cli/sti which did not modify the real interrupt+mask in any way. Instead, interrupts were defered and delivered to+the OS upon a call to the virtualized sti.++Mainly, this resulted in increased performance for the OS. Although+we haven't done any measurements on Linux's interrupt handling+performance with Adeos, our nanokernel includes by definition the+code implementing the technique described in the abovementioned+Stodolsky paper, which we use to redirect the hardware interrupt flow+to the pipeline.++i386 and armnommu are currently supported. Most of the+architecture-dependent code is easily portable to other architectures.++Aside of adding the Adeos module (driver/adeos), we also modified some+files to tap into Linux interrupt and system event dispatching (all+the modifications are encapsulated in #ifdef CONFIG_ADEOS_*/#endif).++We modified the idle task so it gives control back to Adeos in order for+the ipipe to continue propagation.++We modified init/main.c to initialize Adeos very early in the startup.++Of course, we also added the appropriate makefile modifications and+config options so that you can choose to enable/disable Adeos as+part of the kernel build configuration.++Adeos' public API is fully documented here:+http://home.gna.org/adeos/doc/api/index.html.++In Linux's case, adeos_register_domain() is called very early during+system startup.++To add your domain to the ipipe, you need to:+1) Register your domain with Adeos using adeos_register_domain()+2) Call adeos_virtualize_irq() for all the IRQs you wish to be+notified about in the ipipe.++That's it. Provided you gave Adeos appropriate handlers in step+#2, your interrupts will be delivered via the ipipe.++During runtime, you may change your position in the ipipe using+adeos_renice_domain(). You may also stall/unstall the pipeline+and change the ipipe's handling of the interrupts according to your+needs.++Over x86, Adeos supports SMP, and local/IO-APIC on UP.++Here are some of the possible uses for Adeos (this list is far+from complete):+1) Much like User-Mode Linux, it should now be possible to have 2+Linux kernels living side-by-side on the same hardware. In contrast+to UML, this would not be 2 kernels one ontop of the other, but+really side-by-side. Since Linux can be told at boot time to use+only one portion of the available RAM, on a 128MB machine this+would mean that the first could be made to use the 0-64MB space and+the second would use the 64-128MB space. We realize that many+modifications are required. Among other things, one of the 2 kernels+will not need to conduct hardware initialization. Nevertheless, this+possibility should be studied closer.++2) It follows from #1 that adding other kernels beside Linux should+be feasible. BSD is a prime candidate, but it would also be nice to+see what virtualizers such as VMWare and Plex86 could do with Adeos.+Proprietary operating systems could potentially also be accomodated.++3) All the previous work that has been done on nanokernels should now+be easily ported to Linux. Mainly, we would be very interested to+hear about extensions to Adeos. Primarily, we have no mechanisms+currently enabling multiple domains to share information. The papers+mentioned earlier provide such mechanisms, but we'd like to see+actual practical examples.++4) Kernel debuggers' main problem (tapping into the kernel's+interrupts) is solved and it should then be possible to provide+patchless kernel debuggers. They would then become loadable kernel+modules.++5) Drivers who require absolute priority and dislike other kernel+portions who use cli/sti can now create a domain of their own+and place themselves before Linux in the ipipe. This provides a+mechanism for the implementation of systems that can provide guaranteed+realtime response.++Philippe Gerum <rpm@xenomai.org>+Karim Yaghmour <karim@opersys.com>++----------------------------------------------------------------------+Links to papers:+1-+http://citeseer.nj.nec.com/probert91space.html+ftp://ftp.cs.ucsb.edu/pub/papers/space/iwooos91.ps.gz (not working)+http://www4.informatik.uni-erlangen.de/~tsthiel/Papers/Space-iwooos91.ps.gz++2-+http://www.cs.ucsb.edu/research/trcs/abstracts/1995-06.shtml+http://www4.informatik.uni-erlangen.de/~tsthiel/Papers/Space-trcs95-06.ps.gz++3-+http://citeseer.nj.nec.com/kenneth94caching.html+http://guir.cs.berkeley.edu/projects/osprelims/papers/cachmodel-OSkernel.ps.gz++4-+http://citeseer.nj.nec.com/engler95exokernel.html+ftp://ftp.cag.lcs.mit.edu/multiscale/exokernel.ps.Z+----------------------------------------------------------------------diff -uNrp linux-2.4.24/Makefile linux-2.4.24-adeos/Makefile--- linux-2.4.24/Makefile	2004-01-05 14:53:56.000000000 +0100+++ linux-2.4.24-adeos/Makefile	2004-03-20 15:25:28.000000000 +0100@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 24-EXTRAVERSION =+EXTRAVERSION = -adeos  KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) @@ -74,7 +74,7 @@ endif # images.  Uncomment if you want to place them anywhere other than root. # -#export	INSTALL_PATH=/boot+export	INSTALL_PATH=/boot  # # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory@@ -128,13 +128,14 @@ CORE_FILES	=kernel/kernel.o mm/mm.o fs/f NETWORKS	=net/network.o  LIBS		=$(TOPDIR)/lib/lib.a-SUBDIRS		=kernel drivers mm fs net ipc lib crypto+SUBDIRS		=kernel adeos drivers mm fs net ipc lib crypto  DRIVERS-n := DRIVERS-y := DRIVERS-m := DRIVERS-  := +DRIVERS-$(CONFIG_ADEOS) += adeos/built-in.o DRIVERS-$(CONFIG_ACPI_BOOT) += drivers/acpi/acpi.o DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o DRIVERS-y += drivers/char/char.o \diff -uNrp linux-2.4.24/adeos/Makefile linux-2.4.24-adeos/adeos/Makefile--- linux-2.4.24/adeos/Makefile	1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.24-adeos/adeos/Makefile	2004-03-20 12:25:18.000000000 +0100@@ -0,0 +1,28 @@+#+# Makefile for the Adeos layer.+#++O_TARGET := built-in.o++list-multi	:= adeos.o+export-objs	:= generic.o+adeos-objs	:= generic.o++ifdef CONFIG_X86+adeos-objs	+= x86.o+endif++ifdef CONFIG_ARM+ifdef CONFIG_UCLINUX+adeos-objs	+= armnommu.o+else+adeos-objs	+= armv.o+endif+endif++obj-$(CONFIG_ADEOS)	+= adeos.o++include $(TOPDIR)/Rules.make++adeos.o: $(adeos-objs)+	$(LD) -r -o $@ $(adeos-objs)diff -uNrp linux-2.4.24/adeos/generic.c linux-2.4.24-adeos/adeos/generic.c--- linux-2.4.24/adeos/generic.c	1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.24-adeos/adeos/generic.c	2004-04-02 11:23:53.000000000 +0200@@ -0,0 +1,790 @@+/*+ *   linux/adeos/generic.c+ *+ *   Copyright (C) 2002 Philippe Gerum.+ *+ *   This program is free software; you can redistribute it and/or modify+ *   it under the terms of the GNU General Public License as published by+ *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,+ *   USA; either version 2 of the License, or (at your option) any later+ *   version.+ *+ *   This program is distributed in the hope that it will be useful,+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ *   GNU General Public License for more details.+ *+ *   You should have received a copy of the GNU General Public License+ *   along with this program; if not, write to the Free Software+ *   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.+ *+ *   Architecture-independent ADEOS services.+ */++#include <linux/version.h>+#include <linux/module.h>+#include <linux/wrapper.h>+#include <linux/init.h>+#include <linux/kernel.h>+#include <linux/sched.h>++MODULE_DESCRIPTION("Adeos nanokernel");+MODULE_AUTHOR("Philippe Gerum");+MODULE_LICENSE("GPL");++extern spinlock_t __adeos_pipelock;++extern struct list_head __adeos_pipeline;++/* adeos_register_domain() -- Add a new domain to the system. All+   client domains must call this routine to register themselves to+   ADEOS before using its services. */++int adeos_register_domain (adomain_t *adp, adattr_t *attr)++{+    struct list_head *pos;+    unsigned long flags;+    int n;++    if (adp_current != adp_root)+	{+	printk(KERN_WARNING "Adeos: Only the root domain may register a new domain.\n");+	return -EPERM;+	}++    flags = adeos_critical_enter(NULL);++    list_for_each(pos,&__adeos_pipeline) {+    	adomain_t *_adp = list_entry(pos,adomain_t,p_link);+	if (_adp->domid == attr->domid)+            break;+    }++    adeos_critical_exit(flags);++    if (pos != &__adeos_pipeline)+	/* A domain with the given id already exists -- fail. */+	return -EBUSY;++    for (n = 0; n < ADEOS_NR_CPUS; n++)+	adp->cpudata[n].status = 0;++    /* A special case for domains who won't process events (i.e. no+       entry). We have to mark them as suspended so that+       adeos_suspend_domain() won't consider them, unless they+       _actually_ receive events, which would lead to a panic+       situation since they have no stack context... :o> */++    for (n = 0; n < ADEOS_NR_CPUS; n++)+	{+	set_bit(IPIPE_SLEEP_FLAG,&adp->cpudata[n].status);++	if (attr->entry == NULL)+	    adp->estackbase[n] = NULL;+	}++    adp->name = attr->name;+    adp->priority = attr->priority;+    adp->domid = attr->domid;+    adp->dswitch = attr->dswitch;+    adp->flags = 0;+    adp->ptd_setfun = attr->ptdset;+    adp->ptd_getfun = attr->ptdget;+    adp->ptd_keymap = 0;+    adp->ptd_keycount = 0;+    adp->ptd_keymax = attr->nptdkeys;++    for (n = 0; n < ADEOS_NR_EVENTS; n++)+	/* Event handlers must be cleared before the i-pipe stage is+	   inserted since an exception may occur on behalf of the new+	   emerging domain. */+	adp->events[n].handler = NULL;++    if (attr->entry != NULL)+	__adeos_init_domain(adp,attr);++    /* Insert the domain in the interrupt pipeline last, so it won't+       be resumed for processing interrupts until it has a valid stack+       context. */++    __adeos_init_stage(adp);++    INIT_LIST_HEAD(&adp->p_link);++    flags = adeos_critical_enter(NULL);++    list_for_each(pos,&__adeos_pipeline) {+    	adomain_t *_adp = list_entry(pos,adomain_t,p_link);+	if (adp->priority > _adp->priority)+            break;+    }++    list_add_tail(&adp->p_link,pos);++    adeos_critical_exit(flags);++    printk(KERN_WARNING "Adeos: Domain %s registered.\n",adp->name);++    /* Finally, allow the new domain to perform its initialization+       chores on behalf of its own stack context. */++    if (attr->entry != NULL)+	{+	adeos_declare_cpuid;++	adeos_get_cpu(flags);++	__adeos_switch_to(adp,cpuid);++	adeos_load_cpuid();	/* Processor might have changed. */++	if (!test_bit(IPIPE_STALL_FLAG,&adp_root->cpudata[cpuid].status) &&+	    adp_root->cpudata[cpuid].irq_pending_hi != 0)+	    __adeos_sync_stage(IPIPE_IRQMASK_ANY);++	adeos_put_cpu(flags);+	}++    return 0;+}++/* adeos_unregister_domain() -- Remove a domain from the system. All+   client domains must call this routine to unregister themselves from+   the ADEOS layer. */++int adeos_unregister_domain (adomain_t *adp)++{+    unsigned long flags;+    unsigned event;++    if (adp_current != adp_root)+	{+	printk(KERN_WARNING "Adeos: Only the root domain may unregister a domain.\n");+	return -EPERM;+	}++    if (adp == adp_root)+	{+	printk(KERN_WARNING "Adeos: Cannot unregister the root domain.\n");+	return -EPERM;+	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -