From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,fe5641bca012dada X-Google-Attributes: gid103376,public From: Markus Kuhn Subject: Re: help about handling interrupts Date: 1998/04/07 Message-ID: <352A14FA.6E9E4778@cl.cam.ac.uk>#1/1 X-Deja-AN: 341676947 Content-Transfer-Encoding: 7bit References: <3528B9E0.6F0F@bipa162.bi.ehu.es> <3529047A.44EE08B8@cl.cam.ac.uk> Content-Type: text/plain; charset=us-ascii Organization: Cambridge University, Computer Laboratory Mime-Version: 1.0 Newsgroups: comp.lang.ada Date: 1998-04-07T00:00:00+00:00 List-Id: Matthew Heaney wrote: > Markus Kuhn wrote: > >User processes cannot directly handle interrupts under Linux. > >If you want to write an interrupt handler yourself, you have to > >do this in a loadable kernel module. You can write loadable kernel > >modules in Ada just like you can do this in C. You have to call a > >kernel function at module load time that registers your Ada > >procedure as an interrupt handler, and then the Linux kernel > >will call your Ada procedure whenever this interrupt comes in. > > I don't understand this response. > > In Ada 95, you attach protected procedure of a protected object to an > interrupt. Section 19.6, INTERRUPT HANDLING, in Norm Cohen's book is > dedicated to this very topic. > > No, the OS doesn't make any difference. The syntax for specifying an > interrupt handler in Ada is the same for all platforms. > > Basically, you declare a protected object, and use pragma Attach_Handler to > designate a protected procedure as the interrupt handler. > > See also pragma Interrupt_Handler and package Ada.Interrupts. Have you actually tried this under Linux? There is no way this will work. Unless you do lots of special things (see the documentation of how to compile a Linux loadable kernel module), GNAT will produce an ELF output file that can only be started as a normal user process. And normal user processes CAN NOT handle interrupts directly. The sections in the RM you quoted have been intended for compilers for embedded systems, where the Ada runtime library does everything that on a PC is done by the operating system or where there is a special real-time operating system used. All this does not apply for a compiler that produces normal Unix application programms. The Ada standard does not make it unnecessary that you get familiar with the mechanisms of your operating system if you want to access the hardware directly, including handling interrupts! One of the main purpose of a time-sharing operating system is to prevent you from directly accessing the hardware. The GNAT RM says: "C.3.1(20-21): Protected Procedure Handlers Whenever possible, the implementation should allow interrupt handlers to be called directly by the hardware. Followed on any target where the underlying operating system permits such direct calls." Well, any Unix operating system I know is not a platform that allows procedures in user processes to be called by hardware interrupts. This has nothing to do with the programming language used, this is an operating system issue. Markus -- Markus G. Kuhn, Security Group, Computer Lab, Cambridge University, UK email: mkuhn at acm.org, home page: