THE LINUX FOUNDATION PROJECTS
Category

Working Group

When “Probably Safe” Is Not Safe Enough - ELISA Project blog - Alessandro Carminati, NVIDIA

When “Probably Safe” Is Not Safe Enough

By Ambassadors, Blog, Working Group

This blog is written by Alessandro Carminati, TSC member and Linux Features WG Chair at the ELISA Project and an engineer at NVIDIA.

If you ever worked with Linux, you probably heard something like:

“User space and kernel space are isolated.”

Which is true. And also… not entirely comforting.

Because, as Murphy politely reminds us:

“Anything that can go wrong, will go wrong.”

At the ELISA LFSCS working group, we try to look at Linux from a functional safety perspective. That means we are not satisfied with “it usually works”… we want to understand what could go wrong.

At the ELISA LFSCS working group, we try to look at Linux from a functional safety perspective. That means we are not satisfied with “it usually works”… we want to understand what could go wrong.

From Munich: A Suspicious Idea

During the Munich 2025 session, we discussed what we called the linear mapping threat.

The idea is simple:

  • Linux keeps a linear mapping of physical memory
  • This mapping includes all RAM
  • Kernel objects and user pages come from the same pool

So in theory:

A kernel object page could sit right next to a user page.

Not a fault… Not a bug… Just… how memory is laid out.

And that alone raises a question.

Because if a kernel bug causes an overflow, adjacency matters much more than isolation:

  • overflow → likely direction → next page
  • underflow → possible, but statistically less common
    So the interesting case becomes:

kernel page → next → user page

At that point, this was still a hypothesis. A reasonable one… But still a hypothesis.

From Hypothesis to Observation

So we asked:

Can we observe this situation?

Not in theory. Not in diagrams. But in actual memory.

To be clear, not the fault happening… just the fact that Kernel objects pages and userspace pages can sit next to each other.

The Tool (a.k.a. “Let’s Peek at PFNs”)

Initially, the plan was simple:

“Let’s write a kernel module and scan the linear mapping.” Because… that’s what kernel people do. (Maslow’s Hammer: If the only tool you have is a hammer, you tend to see every problem as a nail)

Then came the slightly embarrassing realization:

“Wait… I can already see this from userspace.”

Using /proc/kpageflags.

And suddenly:

  • no kernel module needed
  • no patching
  • no special hooks

Just a userspace tool reading kernel-exposed data.

Small Technical Box: /proc/kpageflags

/proc/kpageflags exposes metadata for each physical page frame (PFN).

With it, you can:

  • iterate over physical memory
  • classify pages (anonymous, slab, huge, etc.)
  • build a PFN-level view of the system

In practice, the tool:

  • scans PFNs sequentially
  • assigns a category per page
  • renders a colored raster

Think of it as:

a “topographic map” of memory… where mountains are slab pages and plains are user memory. (Yes, the legend is still under construction.)

First Results: “This Looks… Too Clean”

Using the tool on a real system (x86), results were promising:

  • memory looked mixed
  • user and kernel pages were interleaved
  • adjacency was visible

Good.

But the LFSCS working group set its reference platform as aarch64 many moons ago and when if came to the ARM64 VM we’re targeting:

  • almost no user pages
  • almost no slab pages
  • everything looked… suspiciously clean

At this point, either:

  1. the tool was wrong
  2. the kernel was lying
  3. or the system was too nice

What We Learned (a.k.a. “The Plot Thickens”)

Huge Pages Were Hiding Reality

Disabling THP:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

suddenly changed everything.

Why?

Because:

  • userspace sees memory at page granularity (4KB)
  • linear mapping may represent the same memory as huge pages

So we had:

fine-grained user memory vs coarse-grained linear mapping view

Disabling THP aligned the two worlds and revealed the real distribution.

Slab Pages Don’t Like Attention

The SLAB flag is only set on compound head pages.

Meaning:

most kernel objects are there… just not explicitly labeled

So the absence of slab in the visualization was… misleading.

The System Was Too Clean

The VM had:

  • low workload
  • low fragmentation
  • limited kernel activity

In short:

not enough chaos to trigger interesting behavior

Forcing Reality (a.k.a. “Adding Some Chaos”)

One missing piece was understanding that:

a real system naturally creates fragmentation a virtual machine… usually does not

So to observe the phenomenon in a controlled environment, we needed to give to the kernel an helping foot.

The approach was to introduce controlled memory pressure and fragmentation using a small kernel-side helper.

The idea is simple:

  • allocate many temporary objects
  • insert a few persistent objects in between
  • free the temporary ones

Swiss Cheese Kernel Heap

This leaves behind memory pages that are:

  • partially used
  • not reclaimable
  • and therefore fragmented

This creates a layout where:

kernel allocations are spread across many partially filled pages

Which is exactly the condition needed to increase the chance of:

kernel page → next → user page adjacency

Think of memory like a block of cheese:

  • temporary allocations = drilling holes
  • persistent objects = small solid parts left behind

After removing the temporary allocations:

you don’t get a clean empty block you get a holey structure the kernel cannot easily compact

The Key Result

After:

  • fixing classification
  • aligning granularity
  • adding controlled fragmentation

We can say:

Kernel and user pages can be physically adjacent. Not always. Not everywhere. But definitely possible.

And importantly: this can happen naturally on a real system while in a VM it may require forcing conditions

Looking Closer (a.k.a. “What Exactly Is Sitting at the Edge?”)

At this point, we knew that: kernel pages and user pages can be physically adjacent. Which is already interesting.

But adjacency alone does not tell us how easy it is for trouble to cross the border.

If the last object in the kernel page ends hundreds of bytes before the page boundary, then an overflow would need to be fairly enthusiastic.

If instead the object ends exactly at the page boundary…

then even a tiny mistake can immediately step into the next page.

So the obvious next question was: “What is actually sitting at the very end of the slab page?”

Teaching the Tool Some Slab Archaeology

The original direct_map_view PoC was good at classifying pages.

The updated version became slightly more nosy.

Given a user page, it now:

  • looks at the preceding PFN,
  • checks whether that PFN is slab-backed,
  • scans the page,
  • and identifies the kernel object closest to the end of the page.

Using kmem_dump_obj(), the probe can determine which slab cache owns the object and where the object begins.

In other words: we stopped looking only at pages and started looking at what is actually living inside them.

A Typical Result

[   66.010479] pfn_slab_probe: input_pfn=1078469 checked_pfn=1078468 flags=0xbfffe0000000200
[   66.010862] pfn_slab_probe: checked PFN 1078468 is slab-backed, scanning [ffff0000c74c4000 - ffff0000c74c5000)
[   66.011652] slab kmalloc-512 start ffff0000c74c4e00 pointer offset 504 size 512
[   66.013007] pfn_slab_probe: nearest candidate object at ffff0000c74c4ff8, offset 0xff8 into PFN 1078468

The probe did not find an object starting at 0xff8.

It found itself standing 8 bytes before the edge of the page, inside a kmalloc-512 object, at offset 504 from the beginning of that object.

So the math is:

0xff8 - 504 = 0xe00

The object starts at 0xe00 and, being 512 bytes long, ends at 0x1000.

Exactly at the page boundary. Which is the memory-management equivalent of parking with the bumper touching the wall.

Turning Logs into Pictures

Because hexadecimal offsets are excellent at convincing computers but less effective with humans, a small script was added to convert the logs into SVG diagrams.

The result is a picture showing:

  • the slab page,
  • the last kernel object,
  • the page boundary,
  • and the user page immediately after it.

Sometimes, a drawing is worth several hundred printk()s.

From “Interesting Layout” to “Well… That Escalated Quickly”

At this point, we had demonstrated that:

  • a kernel object can sit at the end of a page,
  • the next physical page can belongs to a user process.

The next question was unavoidable: “What happens if the kernel writes past that boundary?”

Fortunately for science, and slightly less fortunately for the victim process, we now have a PoC for that too.

The Victim (a.k.a. “The Simplest Program We Could Get Away With”)

The userspace target is a tiny assembly program, available for both:

Its behavior is intentionally boring:

  1. print the address of a string,
  2. wait,
  3. print the string,
  4. exit.

That is all. No threads. No libraries. No excuses. If something changes, we know exactly who to blame.

Was it that simple?

The PoC script: poc.sh

Coordinates with the kernel module: umem_poke.c

The script does not do magic address translation in bash.

Which is probably good news for everyone. It only coordinates the experiment: it starts the victim, gets the address printed by the process, and passes that VMA address to the module.

The module is the one doing the kernel-side work. It uses GUP to resolve the userspace address to the underlying page, computes the linear mapping address destination byte, and then performs the write.

After all that machinery, the corruption itself is still disappointingly simple:

*dst_target = act.value;

That is it.

  • No ptrace().
  • No copy_to_user().
  • No access_ok().
  • No “Dear Kernel, may I please touch userspace?”

Just a normal assignment. From the kernel’s point of view, this is simply a write to a valid pointer.

Which leads to a slightly uncomfortable realization: once a userspace page is reached through the linear mapping, it stops being special. It is just memory. And the kernel is very good at writing to memory.

“But Surely Read-Only Memory Is Safe?”

A reasonable objection is: “Fine, but this probably works only on writable pages.” That would be reassuring… Would it really?

Even then, the wall would still have a door. Unfortunately, reality is even less reassuring.

The experiment works even when the target string is moved from .bss to .rodata.

In other words, the process sees the page as read-only. The process itself cannot modify the string.

And yet, after the userspace address has been translated to its corresponding location in the linear mapping, changing the supposedly immutable data still requires nothing more sophisticated than:

*dst_target = act.value;

  • No page permissions are changed.
  • No special write mechanism is invoked.
  • No dedicated “modify userspace memory” API is used.

Just a normal store through a valid kernel pointer.

So the surprising part is not that the kernel, in principle, has enough privilege to modify the page. The surprising part is that once the page is reached through the linear mapping, the actual modification is indistinguishable from writing to any other ordinary kernel address.

Same physical page. Different virtual permissions. Same single dereference.

The Grand Finale

Before the write, the program prints one string.

After the write, it prints a different one.

buildroot login: root
# /usr/umem_poke/poc.sh 
running without corruption
message address: 0x0000000000400168
<TOKEN>

running again with corruption
[   27.675393] umem_poke: loading out-of-tree module taints kernel.
message address: 0x0000000000400168
[   28.751270] umem_poke: req: poke memory for pid=107 mem[400168]=1074707572726f63
[   28.752020] umem_poke: act: poke memory for pid=107 mem[400168]=1074707572726f63
corrupt
# 

The process does not crash. The kernel does not panic. No alarms ring. No dramatic music starts.

The application simply continues running with modified data. Which, from a functional safety perspective, is often the most interesting outcome.

Not: “The system exploded.”

But: “The system kept working… incorrectly.”

From Layout Curiosity to Concrete Effect

At this point, the full chain becomes visible:

+---------------------------+
|   shared physical memory  |
+---------------------------+
              |
             \ /
              V
+---------------------------+
|     possible adjacency    |
+---------------------------+
              |
             \ /
              V
+---------------------------+
| kernel object at page end |
+---------------------------+
              |
             \ /
              V
+---------------------------+
|   kernel write defect     |
+---------------------------+
              |
             \ /
              V
+---------------------------+
|   ordinary pointer store  |
+---------------------------+
              |
             \ /
              V
+---------------------------+
| userspace data corruption |
+---------------------------+
              |
             \ /
              V
+---------------------------+
|  incorrect but apparently |
|       normal behavior     |
+---------------------------+

So the original question: “Can kernel and user pages be physically adjacent?”

Now has a more complete answer: Yes. And if a kernel write goes in the wrong direction, the next page may belong to a perfectly innocent process. That process may continue running as if nothing happened, except for the small detail that its data is no longer what it thinks it is.

Why This Matters

From a safety perspective, the concern is not: user → kernel corruption (blocked by MMU)

The concern is:

kernel → anything else

Because in the linear mapping:

  • everything shares the same physical space
  • adjacency is not controlled
  • allocators optimize for performance, not isolation

So when something goes wrong: the target is simply “the next page”

And what that page is… depends on the moment.

Bigger Picture

This PoC is not proving a vulnerability.

It is proving something more subtle: Linux enforces virtual access separation, but does not guarantee physical separation between kernel and userspace allocations.

And in safety: lack of guarantees is already a problem.

Final Thought

The tool didn’t find a bug and this article does not imply Linux is unsafe. It found something more annoying: an assumption that is not always true.

Meaning that physical separation is not an inherent property of the Linux memory manager and must be established through additional architectural controls if required by a safety case.

ELISA blog – All Aboard The New Railways Special Interest Group

All Aboard the new Railways SIG

By Announcement, Blog, Working Group

This blog is written by Henrik Brändle, Chair of the new Railways SIG.

The ELISA (Enabling Linux in Safety Applications) Project continues to advance the use of Linux in safety-critical and regulated systems. By bridging the gap between the flexibility of Linux and the demands of safety-critical certification, the ELISA community is ensuring that the future of autonomous and connected technology is built on a foundation of trust.

Dedicated groups like Automotive, Aerospace, Safety Architecture and the Space Grade Linux Special Interest Group (SIG) have been the engine of ELISA’s progress.

All Aboard: The Railways SIG

Safety-critical systems span more than just the roads for automotives and airplanes.  In fact, rail is the third-most used means of transport [1, fig. 21]. Today, we are excited to announce the launch of the Railways SIG.

This new initiative marks a significant milestone as we bring ELISA’s methodology to the rail industry. The Railways SIG will focus on aligning Linux development with standards, addressing everything from signaling and control systems to automated train operations. It aims to inform all railway stakeholders about the extensive capabilities that open source already offers in the safety domain. At the same time, it represents their specific needs towards the ELISA community, to ensure that future developments continue to benefit railway systems worldwide. 

History of Open Source and Railways

Historically, the railway industry viewed open source with skepticism, believing that public code and community governance couldn’t meet the demands of safety certification. However, in recent years, multiple initiatives have started to challenge this belief by proving that open source projects can achieve high-level functional safety certification while maintaining transparency and collaboration [2][3].

The continuous rise in expected features will lead to an explosion in resulting software complexity. Since the available development resources are not keeping up with the demands, the railway industry willhave to rely on collaboration across sectors to keep delivering software at the expected quality and pace. 

The Vision

The idea for a dedicated Railway SIG was introduced at FOSDEM 2025, where the Railways and Open Transport track served as a launchpad for the vision. Throughout the following year, a diverse community of stakeholders shared their points of view, aligned their vision and collaborated on a path towards a sustainable SIG. 

Following a reconfirmation of interest at FOSDEM 2026, a formal SIG application was submitted in March. As a new group within the ELISA Project umbrella, the Railways SIG will help shape these efforts by bringing forward the specific requirements, development processes, and standards of our industry. This ensures the rail sector benefits from the significant work taking place globally.

Join us!

The first Railways SIG will take place on Tuesday, May 19. Participants can register for the meeting by visiting the ELISA Project public meeting calendar here. Subscribe to the mailing list or learn more information here. We invite all interested parties to join us in shaping the future of safety-critical Linux for railway infrastructure.

If you are interested in the ELISA Project, we invite you to join one of the ELISA working groups and contribute to advancing safety practices in open source together.

To keep up to date about the project, subscribe to the quarterly newsletter or connect with us on ELISA Project LinkedIn or the  ELISA Discord Channel to talk with community and TSC members.

Sources:

[1] [TUMI Transport Outlook 1.5°C (2021)](https://www.transformative-mobility.org/wp-content/uploads/2023/03/TUMI-Transport-Outlook-SoI1tB.pdf)

[2][Ferrocene: This is Rust for critical systems](https://ferrocene.dev/)

[3][Zephyr Safety Overview] (https://docs.zephyrproject.org/latest/safety/safety_overview.html)

Safety Critical Linux Features - Annual Update (Feb 11, 2026) Alessandro Carminati, NVIDIA

Recap – Safety Critical Linux Features – Annual Update (Feb 11, 2026)

By Blog, Technical Update, Working Group

On February 11–12, the ELISA Project community gathered for the 2026 Working Group (WG) and Special Interest Group (SIG) Annual Updates. Over two focused sessions, group leads shared key milestones from 2025, current technical priorities, and what lies ahead in 2026, along with concrete opportunities for collaboration and contribution.

The annual updates serve as a checkpoint for the project: a moment to reflect on progress, align on priorities, and welcome new contributors into the work of advancing Linux in safety-critical systems.

This week we highlight the session on Safety Critical Linux Features by Alessandro Carminati, NVIDIA.

As part of the ELISA Project Working Group and Special Interest Group Annual Updates held on February 11–12, 2026, Alessandro Carminati (NVIDIA) presented the latest progress from the Linux Features for Safety-Critical Systems (LFSCS) Working Group, outlining 2025 activities, current technical investigations, and priorities for 2026.

The LFSCS Working Group approaches Linux from a safety perspective by asking not whether it works, but how it could fail within a safety-critical system. Its role is not to certify systems or build safety cases, but to investigate Linux kernel and, where relevant, user space behavior to identify where safety assumptions may break. The group focuses on areas such as memory isolation, allocation behavior, and process boundaries domains where failures could have real safety implications. These investigations are translated into structured scenarios and reproducible technical questions that can be shared across the open source ecosystem.

Operating as a horizontal working group within ELISA, LFSCS works across domains including automotive, aerospace, and industrial systems. Vertical working groups bring real-world requirements, and LFSCS maps those needs to Linux features, identifying where implementation details or system behavior may challenge safety expectations. This model allows the group to build a foundational understanding of safety-relevant Linux behavior that can be reused and validated across industries.

Key work in 2025:

In 2025, the group focused on several key technical areas driven by emerging questions and contributor input. One major effort examined the concept of a minimal Linux footprint identifying the smallest functional system required for safety-critical deployments by tracing real application behavior and mapping which kernel features are actually used. This work helps reduce system complexity and provides insight into the runtime surface exposed in safety environments. Another central investigation focused on memory isolation, particularly Virtual Memory Areas (VMAs), which are core to process and context separation in Linux. The group analyzed lifecycle behavior, mapping evolution, allocation interactions, and system behavior under stress to better understand isolation guarantees and where flexibility in the system may conflict with deterministic safety expectations. In addition, exploratory topics such as pointer safety models were discussed, reflecting the group’s openness to contributor-driven ideas and emerging areas of interest.

The output of the LFSCS Working Group is primarily investigative and is shared through documentation, workshops, and public discussions to ensure visibility and reuse. The session also emphasized the importance of collaboration, particularly with other working groups, to connect analytical findings with tooling and reproducible validation. 

Looking ahead to 2026, the group will continue advancing analysis of Linux features in safety contexts, expanding collaboration across domains, supporting integration with tooling efforts, and encouraging community participation. 

The working group meets regularly and welcomes contributors through meetings, mailing lists, and GitHub. This session highlighted how LFSCS is building a deeper technical understanding of Linux behavior in safety-critical systems helping the ecosystem better identify risks and support the adoption of Linux where safety is essential.

Learn more about the ELISA Project and how to get involved.

ELISA Lighthouse SIG – Annual Update (February 12, 2026) | Philipp Ahmann, ETAS

Recap of ELISA Lighthouse SIG – Annual Update (February 12, 2026)

By Ambassadors, Blog, Technical Update, Working Group

On February 11–12, the ELISA Project community gathered for the 2026 Working Group (WG) and Special Interest Group (SIG) Annual Updates. Over two focused sessions, group leads shared key milestones from 2025, current technical priorities, and what lies ahead in 2026, along with concrete opportunities for collaboration and contribution.

The annual updates serve as a checkpoint for the project: a moment to reflect on progress, align on priorities, and welcome new contributors into the work of advancing Linux in safety-critical systems.

This week we highlight the session on ELISA Lighthouse Special Interests Group presented by Philipp Ahmann, ETAS.

The Lighthouse SIG focuses on best practices for open source software in safety-critical systems. Philipp explained that many existing quality and safety standards were designed for proprietary software development, while open source communities often work through code-first, CI-driven, and agile processes. The group is exploring how established open source practices can be evaluated, documented, and eventually shaped into guidance or a standard that regulated industries can use.

In 2025, the SIG worked to understand the current landscape. The group reviewed existing safety, quality, and security standards, conducted literature research, and began assessing open source projects. Early work included creating a template to evaluate process robustness and evidence confidence across different criteria. Initial project assessments included Yocto, Xen, and LLVM, with plans to expand to projects such as Linux, curl, and OpenSSL.

The session also highlighted collaboration with other communities, including Eclipse automotive efforts, CHAOSS, OpenSSF Scorecard, LFX Insights, OpenSSF Best Practices, OpenChain, and the Joint Development Foundation. The goal is to avoid duplication, learn from existing work, and align with broader open source and standards communities.

Looking ahead to 2026, the Lighthouse SIG plans to refine its maturity model, review more projects, evaluate existing badges and scorecards, and continue preparing for possible standards work. The group is also exploring how to define and measure quality in open source projects more clearly.

Philipp closed by inviting new contributors to join the Lighthouse SIG. The group meets every other Friday and welcomes participation through its meetings, mailing list, Discord channel, GitHub repository, and meeting minutes.

Watch the full session to learn how the Lighthouse SIG is progressing and how you can get involved.

ELISA Project - BASIL & Tools Working Group Evolution – Annual Update (Feb 12, 2026)

Recap of BASIL and Tools Working Group Evolution – Annual Update (Feb 12, 2026)

By Blog, Technical Update, Working Group

On February 11–12, the ELISA Project community gathered for the 2026 Working Group (WG) and Special Interest Group (SIG) Annual Updates. Over two focused sessions, group leads shared key milestones from 2025, current technical priorities, and what lies ahead in 2026, along with concrete opportunities for collaboration and contribution.

The annual updates serve as a checkpoint for the project: a moment to reflect on progress, align on priorities, and welcome new contributors into the work of advancing Linux in safety-critical systems.

This week we highlight the session on BASIL & Tools Working Group Evolution.

In this session from the ELISA Project Annual Updates, Luigi Pellecchia presents a recap of the BASIL tool’s development in 2025 and outlines planned directions for 2026. BASIL is described as a collaborative, web-based tool for traceability management, supporting multi-user environments, granular permissions, and detailed relationships between code, requirements, and test artifacts. It also integrates with internal and external test infrastructures and provides multiple export formats, including SPDX, HTML, and PDF.

The 2025 update highlights incremental improvements across the year, including enhancements to AI-assisted features, user experience refinements, support for importing external work items, and expanded browser compatibility. Infrastructure improvements include container optimization, security fixes, integration with additional testing frameworks, and the introduction of API code coverage monitoring. A major architectural change was the migration from SQLite to PostgreSQL to better support concurrent usage.

A key development in late 2025 is the introduction of “traceability as code,” an initial proposal to define traceability relationships through configuration files, enabling connections between distributed artifacts such as source code, test cases, and test results across different repositories and systems.

Looking ahead to 2026, planned efforts include extending traceability features (e.g., linking test results), introducing baseline snapshots of traceability states, improving test coverage, and continuing iterative development based on community feedback. The session also highlights available resources such as a public BASIL instance, documentation, and communication channels, and encourages community participation in both BASIL and the broader Tools Working Group.

Overall, the session focuses on the progress, ongoing development, and open collaboration around tooling to support traceability in safety-critical Linux environments.

ELISA Aerospace Working Group – ELISA Project - Annual Update (Feb 12, 2026)

Recap – ELISA Aerospace Working Group – ELISA Project – Annual Update (Feb 12, 2026)

By Blog, Working Group

This session, part of the ELISA Project Working Group & SIG Annual Updates, was presented by Matthew Weber (The Boeing Company) and co-led with Dr. Martin Hall. It provides an overview of the Aerospace Working Group’s progress in 2025 and outlines priorities for 2026.

The Aerospace Working Group focuses on advancing the adoption of Linux in safety-critical aerospace and space systems by addressing technical, process, and certification challenges through collaboration and shared best practices.

Key Highlights from 2025

  • Strong and consistent community engagement, with diverse participation from industry, academia, and government
  • Introduction of a weekly technical call to develop reference demos and use cases, leading to increased contributions (code, documentation, and examples)
  • Completion of the cabin lights demo, a foundational reference system demonstrating safety-relevant behavior and validation concepts
  • Extension of the demo using NASA Core Flight System (cFS), incorporating telemetry, monitoring, and auto-generated safety checks
  • Development of a product classification template to characterize aerospace and space systems by safety level and system attributes
  • Collaboration with other ELISA groups (e.g., Systems WG) on reference architectures and cross-domain concepts such as mixed-criticality systems
  • Progress in industry papers and research contributions, including submission to the Digital Avionics Systems Conference

Focus Areas and Priorities for 2026

  • Expanding system and product classification models (including NASA-class systems)
  • Enhancing and scaling reference demos and baseline system studies
  • Strengthening collaboration with the Space Grade Linux initiative
  • Advancing industry papers and formal publications
  • Continuing improvements in tooling, CI environments, and documentation processes

Opportunities for Collaboration

  • Open monthly and weekly meetings covering general topics, demos, and paper development
  • Active contribution areas including demos, documentation, linting, and research
    Engagement via GitHub, mailing lists, and community channels

This session highlighted how the Aerospace Working Group is building practical artifacts, frameworks, and collaborative momentum to enable Linux in safety-critical aerospace environments, while inviting broader participation from the community. To learn more watch the session here.

ELISA Working Group and Special Interest Group Annual Updates 2026

Recap of ELISA Working Group and Special Interest Group Annual Updates 2026

By Ambassadors, Blog, Working Group

On February 11–12, the ELISA Project community gathered for the 2026 Working Group (WG) and Special Interest Group (SIG) Annual Updates. Over two focused sessions, group leads shared key milestones from 2025, current technical priorities, and what lies ahead in 2026, along with concrete opportunities for collaboration and contribution.

The annual updates serve as a checkpoint for the project: a moment to reflect on progress, align on priorities, and welcome new contributors into the work of advancing Linux in safety-critical systems.

The first day opened with an ELISA Project overview from Technical Steering Committee Chair Philipp Ahmann (ETAS), highlighting overall progress and reinforcing ELISA’s mission to define and maintain common elements, processes, and tools that support safety certification for Linux-based systems.

The first day highlighted progress across ELISA’s core Working Groups:

Open Source Engineering Process – Paul Albertella (Codethink) shared updates on process alignment and best practices to support safety certification efforts.

Systems and Automotive – Philipp Ahmann discussed advancements in aligning Linux with functional safety requirements for automotive and system-level applications.

Safety Architecture – Gabriele Paoloni (Red Hat) presented ongoing architectural work supporting safety use cases.

Linux Features for Safety-Critical Systems – Alessandro Carminati (NVIDIA) outlined kernel and feature-level progress enabling dependable Linux deployments.

The second day focused on use-case driven Working Groups and SIGs:

Aerospace – Matthew Weber (The Boeing Company) shared updates on Linux in aerospace systems.

Space Grade Linux – Ramon Roche (The Linux Foundation) discussed the evolution of Space Grade Linux and its relationship with ELISA.

BASIL & Tools WG Evolution – Luigi Pellecchia (Red Hat) highlighted progress in tooling and traceability efforts.

Lighthouse SIG – Philipp Ahmann provided insights into cross-domain collaboration and coordination.

The event concluded with closing reflections and a forward-looking discussion on collaboration opportunities in 2026.

Continuing the Work

The WG & SIG Annual Updates are more than a status review, they are a coordination point for the year ahead. As Linux adoption in safety-critical systems continues to expand across automotive, aerospace, industrial, and emerging domains, ELISA remains committed to open collaboration, practical tooling, and shared technical foundations.

Thank you to all speakers, contributors, and attendees who helped make the 2026 updates a success.

We look forward to another year of advancing Linux in safety-critical environments together.

ELISA Project - Blog: When Kernel Comments Get Weird: The Tale of `drivers/char/mem.c`

When Kernel Comments Get Weird: The Tale of `drivers/char/mem.c`

By Ambassadors, Blog, Working Group

This blog is written by Alessandro Carminati, Principal Software Engineer at Red Hat and lead for the ELISA Project’s Linux Features for Safety-Critical Systems (LFSCS) WG.

As part of the ELISA community, we spend a good chunk of our time spelunking through the Linux kernel codebase. It’s like code archeology: you don’t always find treasure, but you _do_ find lots of comments left behind by developers from the ’90s that make you go, “Wait… really?”

One of the ideas we’ve been chasing is to make kernel comments a bit smarter: not only human-readable, but also machine-readable. Imagine comments that could be turned into tests, so they’re always checked against reality. Less “code poetry from 1993”, more “living documentation”.

Speaking of code poetry, [here] one gem we stumbled across in `mem.c`:

```
/* The memory devices use the full 32/64 bits of the offset,
 * and so we cannot check against negative addresses: they are ok.
 * The return value is weird, though, in that case (0).
 */
 ```

This beauty has been hanging around since **Linux 0.99.14**… back when Bill Clinton was still president-elect, “Mosaic” was the hot new browser,
and PDP-11 was still produced and sold.

Back then, it made sense, and reflected exactley what the code did.

Fast-forward thirty years, and the comment still kind of applies
but mostly in obscure corners of the architecture zoo.
On the CPUs people actually use every day?

 

```
$ cat lseek.asm
BITS 64

%define SYS_read    0
%define SYS_write   1
%define SYS_open    2
%define SYS_lseek   8
%define SYS_exit   60

; flags
%define O_RDONLY    0
%define SEEK_SET    0

section .data
    path:    db "/dev/mem",0
section .bss
    align 8
    buf:     resq 1

section .text
global _start
_start:
    mov     rax, SYS_open
    lea     rdi, [rel path]
    xor     esi, esi
    xor     edx, edx
    syscall
    mov     r12, rax        ; save fd in r12

    mov     rax, SYS_lseek
    mov     rdi, r12
    mov     rsi, 0x8000000000000001
    xor     edx, edx
    syscall

    mov     [rel buf], rax

    mov     rax, SYS_write
    mov     edi, 1
    lea     rsi, [rel buf]
    mov     edx, 8
    syscall

    mov     rax, SYS_exit
    xor     edi, edi
    syscall
$ nasm -f elf64 lseek.asm -o lseek.o
$ ld lseek.o -o lseek
$ sudo ./lseek| hexdump -C
00000000  01 00 00 00 00 00 00 80                           |........|
00000008
$ # this is not what I expect, let's double check
$ sudo gdb ./lseek
GNU gdb (Fedora Linux) 16.3-1.fc42
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./lseek...
(No debugging symbols found in ./lseek)
(gdb) b _start
Breakpoint 1 at 0x4000b0
(gdb) r
Starting program: /tmp/lseek

Breakpoint 1, 0x00000000004000b0 in _start ()
(gdb) x/30i $pc
=> 0x4000b0 <_start>:   mov    $0x2,%eax
   0x4000b5 <_start+5>: lea    0xf44(%rip),%rdi        # 0x401000
   0x4000bc <_start+12>:        xor    %esi,%esi
   0x4000be <_start+14>:        xor    %edx,%edx
   0x4000c0 <_start+16>:        syscall
   0x4000c2 <_start+18>:        mov    %rax,%r12
   0x4000c5 <_start+21>:        mov    $0x8,%eax
   0x4000ca <_start+26>:        mov    %r12,%rdi
   0x4000cd <_start+29>:        movabs $0x8000000000000001,%rsi
   0x4000d7 <_start+39>:        xor    %edx,%edx
   0x4000d9 <_start+41>:        syscall
   0x4000db <_start+43>:        mov    %rax,0xf2e(%rip)        # 0x401010
   0x4000e2 <_start+50>:        mov    $0x1,%eax
   0x4000e7 <_start+55>:        mov    $0x1,%edi
   0x4000ec <_start+60>:        lea    0xf1d(%rip),%rsi        # 0x401010
   0x4000f3 <_start+67>:        mov    $0x8,%edx
   0x4000f8 <_start+72>:        syscall
   0x4000fa <_start+74>:        mov    $0x3c,%eax
   0x4000ff <_start+79>:        xor    %edi,%edi
   0x400101 <_start+81>:        syscall
   0x400103:    add    %al,(%rax)
   0x400105:    add    %al,(%rax)
   0x400107:    add    %al,(%rax)
   0x400109:    add    %al,(%rax)
   0x40010b:    add    %al,(%rax)
   0x40010d:    add    %al,(%rax)
   0x40010f:    add    %al,(%rax)
   0x400111:    add    %al,(%rax)
   0x400113:    add    %al,(%rax)
   0x400115:    add    %al,(%rax)
(gdb) b *0x4000c2
Breakpoint 2 at 0x4000c2
(gdb) b *0x4000db
Breakpoint 3 at 0x4000db
(gdb) c
Continuing.

Breakpoint 2, 0x00000000004000c2 in _start ()
(gdb) i r
rax            0x3                 3
rbx            0x0                 0
rcx            0x4000c2            4194498
rdx            0x0                 0
rsi            0x0                 0
rdi            0x401000            4198400
rbp            0x0                 0x0
rsp            0x7fffffffe3a0      0x7fffffffe3a0
r8             0x0                 0
r9             0x0                 0
r10            0x0                 0
r11            0x246               582
r12            0x0                 0
r13            0x0                 0
r14            0x0                 0
r15            0x0                 0
rip            0x4000c2            0x4000c2 <_start+18>
eflags         0x246               [ PF ZF IF ]
cs             0x33                51
ss             0x2b                43
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0
fs_base        0x0                 0
gs_base        0x0                 0
(gdb) # fd is just fine rax=3 as expected.
(gdb) c
Continuing.

Breakpoint 3, 0x00000000004000db in _start ()
(gdb) i r
rax            0x8000000000000001  -9223372036854775807
rbx            0x0                 0
rcx            0x4000db            4194523
rdx            0x0                 0
rsi            0x8000000000000001  -9223372036854775807
rdi            0x3                 3
rbp            0x0                 0x0
rsp            0x7fffffffe3a0      0x7fffffffe3a0
r8             0x0                 0
r9             0x0                 0
r10            0x0                 0
r11            0x246               582
r12            0x3                 3
r13            0x0                 0
r14            0x0                 0
r15            0x0                 0
rip            0x4000db            0x4000db <_start+43>
eflags         0x246               [ PF ZF IF ]
cs             0x33                51
ss             0x2b                43
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0
fs_base        0x0                 0
gs_base        0x0                 0
(gdb) # According to that comment, rax should have been 0, but it is not.
(gdb) c
Continuing.
�[Inferior 1 (process 186746) exited normally]
(gdb) 
```

Not so much. Seeking at `0x8000000000000001`…
Returns `0x8000000000000001` not `0` as anticipated in the comment.
We’re basically facing the kernel version of that “Under Construction”
GIF on websites from the 90s, still there, but mostly just nostalgic
decoration now.

## The Mysterious Line in `read_mem`

Let’s zoom in on one particular bit of code in [`read_mem`](https://elixir.bootlin.com/linux/v6.17-rc2/source/drivers/char/mem.c#L82):

```
	phys_addr_t p = *ppos;
	/* ... other code ... */
	if (p != *ppos) return  0;
```

At first glance, this looks like a no-op; why would `p` be different from
`*ppos` when you just copied it?
It’s like testing if gravity still works by dropping your phone…
**spoiler: it does.**

But as usual with kernel code, the weirdness has a reason.

## The Problem: Truncation on 32-bit Systems

Here’s what’s going on:

– `*ppos` is a `loff_t`, which is a 64-bit signed integer.
– `p` is a `phys_addr_t`, which holds a physical address.

On a 64-bit system, both are 64 bits wide. Assignment is clean, the check
always fails (and compilers just toss it out).

But on a 32-bit system, `phys_addr_t` is only 32 bits. Assign a big 64-bit
offset to it, and **boom**, the top half vanishes.
Truncated, like your favorite TV series canceled after season 1.

That `if (p != *ppos)` check is the safety net.
It spots when truncation happens and bails out early, instead of letting
some unlucky app read from la-la land.

## Assembly Time: 64-bit vs. 32-bit

On 64-bit builds (say, AArch64), the compiler optimizes away the check.

```
┌ 736: sym.read_mem (int64_t arg2, int64_t arg3, int64_t arg4);
│ `- args(x1, x2, x3) vars(13:sp[0x8..0x70])
│           0x08000b10      1f2003d5       nop
│           0x08000b14      1f2003d5       nop
│           0x08000b18      3f2303d5       paciasp
│           0x08000b1c      fd7bb9a9       stp x29, x30, [sp, -0x70]!
│           0x08000b20      fd030091       mov x29, sp
│           0x08000b24      f35301a9       stp x19, x20, [var_10h]
│           0x08000b28      f40301aa       mov x20, x1
│           0x08000b2c      f55b02a9       stp x21, x22, [var_20h]
│           0x08000b30      f30302aa       mov x19, x2
│           0x08000b34      750040f9       ldr x21, [x3]
│           0x08000b38      e10302aa       mov x1, x2
│           0x08000b3c      e33700f9       str x3, [var_68h]        ; phys_addr_t p = *ppos;
│           0x08000b40      e00315aa       mov x0, x21
│           0x08000b44      00000094       bl valid_phys_addr_range
│       ┌─< 0x08000b48      40150034       cbz w0, 0x8000df0        ;if (!valid_phys_addr_range(p, count))
│       │   0x08000b4c      00000090       adrp x0, segment.ehdr
│       │   0x08000b50      020082d2       mov x2, 0x1000
│       │   0x08000b54      000040f9       ldr x0, [x0]
│       │   0x08000b58      01988152       mov w1, 0xcc0
│       │   0x08000b5c      f76303a9       stp x23, x24, [var_30h]
[...]
```
Nothing to see here, move along.
But on 32-bit builds (like old-school i386), the check shows up loud and 
proud in the assembly. 
```
[0x080003e0]> pdf
┌ 392: sym.read_mem (int32_t arg_8h);
│ `- args(sp[0x4..0x4]) vars(5:sp[0x14..0x24])
│           0x080003e0      55             push ebp
│           0x080003e1      89e5           mov ebp, esp
│           0x080003e3      57             push edi
│           0x080003e4      56             push esi
│           0x080003e5      53             push ebx
│           0x080003e6      83ec14         sub esp, 0x14
│           0x080003e9      8955f0         mov dword [var_10h], edx
│           0x080003ec      8b5d08         mov ebx, dword [arg_8h]
│           0x080003ef      c745ec0000..   mov dword [var_14h], 0
│           0x080003f6      8b4304         mov eax, dword [ebx + 4] 
│           0x080003f9      8b33           mov esi, dword [ebx]     ; phys_addr_t p = *ppos;
│           0x080003fb      85c0           test eax, eax
│       ┌─< 0x080003fd      7411           je 0x8000410             ; if (!valid_phys_addr_range(p, count))
│     ┌┌──> 0x080003ff      8b45ec         mov eax, dword [var_14h]
│     ╎╎│   0x08000402      83c414         add esp, 0x14
│     ╎╎│   0x08000405      5b             pop ebx
│     ╎╎│   0x08000406      5e             pop esi
│     ╎╎│   0x08000407      5f             pop edi
│     ╎╎│   0x08000408      5d             pop ebp
│     ╎╎│   0x08000409      c3             ret
[...]
```

The CPU literally does a compare-and-jump to enforce it. So yes, this is a _real_ guard, not some leftover fluff.

## Return Value Oddities

Now, here’s where things get even funnier. If the check fails in `read_mem`, the function returns `0`. That’s “no bytes read”, which in file I/O land is totally fine.

But in the twin function `write_mem`, the same situation returns `-EFAULT`. That’s kernel-speak for “Nope, invalid address, stop poking me”.

So, reading from a bad address? You get a polite shrug. Writing to it? You get a slap on the wrist. Fair enough, writing garbage into memory is way more dangerous than failing to read it. Come on, probably here we need to fix things up.

Wrapping It Up

This little dive shows how a single “weird” line of code carries decades of context, architecture quirks, type definitions, and evolving assumptions.
It also shows why comments like the one from 0.99.14 are dangerous: they freeze a moment in time, but reality keeps moving.

Our mission in Elisa Architecture WG is to bring comments back to life: keep them up-to-date, tie them to tests, and make sure they still tell the truth. Because otherwise, thirty years later, we’re all squinting at a line saying “the return value is weird though” and wondering if the developer was talking about code… or just their day.

And now, a brief word from our *sponsors* (a.k.a. me in a different hat): When I’m not digging up ancient kernel comments with the Architecture WG, I’m also leading the Linux Features for Safety-Critical Systems (LFSCS) WG. We’re cooking up some pretty exciting stuff there too.

So if you enjoy the kind of archaeology/renovation work we’re doing there, come check out LFSCS as well: same Linux, different adventure.

F Prime and Linux

By Blog, Space Grade Linux, Working Group

In the last ELISA Project Workshop, hosted at the NASA Goddard Space Flight Center in Greenbelt, Maryland, from December 10 to 12, 2024, speaker Michael Starch, Flight Software Engineer at NASA, gave a presentation, “F Prime and Linux.”

 

Watch the video below or check out the presentation here.

 

The ELISA Workshop, which had than 30 in-person and 40 virtual attendees, brought together experts from various organizations, including ELISA Project member companies such as Red Hat, and Bosch, as well as representatives from NASA, Wind River, TelePIX, the Linux Foundation and more. This diverse group of professionals engaged in discussions and presentations on advancing Linux systems for space-grade applications.

Check out the ELISA Workshop @ NASA Youtube playlist to watch other videos or access the materials on the ELISA Project’s directory. Or, learn more about the next ELISA Workshop, happening in Lund, Sweden on May 7-9. Register here.

Additional Resources:

ELISA Project Achievements and Updates

By Blog, Working Group

Written by Gabriele Paoloni, ELISA Project Governing Board Chair, and Philipp Ahmann, ELISA Project TSC Chair

The ELISA community held its annual project updates virtually on February 12 – 13, 2025, bringing together members and newcomers. Working group leaders shared their 2024 accomplishments, challenges, and collaborative opportunities for 2025. All videos can be found on the ELISA Project Youtube Channel in the Annual Update Playlist.

2024: A Year of Significant Progress

There was substantial progress for ELISA including: 

  • The Aerospace Working Group significantly advanced the adoption of Linux in safety-critical aerospace applications, presenting successful sessions at the Linux Plumbers Conference that led to the formation of the Space Grade Linux initiative at a NASA-hosted ELISA workshop. 
  • Meanwhile, the System Working Group impressed at Embedded World with a demo of reproducible heterogeneous software composition. 
  • The Medical Device Working Group completed its STPA analysis for the Open APS use case and is now searching for a new project. 
  • The Tool Working Group released initial versions of several key tools (Basil, KS-Nav, llvm-cov, and DeltaKernel).
  • The Safety Architecture Working Group improved Linux Kernel documentation based on safety standards, presenting their findings at Linux Plumbers 2024 and subsequently developing a template for Linux Kernel Requirements. 
  • The Linux Features for Safety-Critical Systems working group completed investigations about the minimal Linux Kernel configuration and focused on the minimal set Kernel features required to support a safety application (the main goal being to figure out the Kernel subsystems and drivers to prioritize for safety activities).
  • The Open Source Engineering Process Working Group focused on best practices for safety-critical FOSS contributions, analyzing the factors that could impact the safety strategy associated with the use of Linux and finally it defined an approach for publishing peer-review material developed by the different working groups.

2025: Collaborative Goals and Technical Advancements

The ELISA Project 2025 vision centers on coordinating working groups towards shared technical and community goals including: 

  • The Automotive Working Group will define a use case and collaborate with the Eclipse SDV project. 
  • The Aerospace Working Group will partner with the Architecture Working Group on Kernel requirements for a Cabin Lighting use case.
  • The Architecture Working Group will upstream initial requirements and a management framework to the Linux Kernel, establishing a community baseline before collaborating on further requirements definition. 
  • The Linux Features for Safety-Critical Systems Working Group will define requirements and analyze key drivers and subsystems for safety applications. 
  • The Open Source Engineering Process Working Group will continue defining best methodologies, including developing processes for documentation review and publishing, and a supply chain responsibilities model. 
  • The Tool Working Group will experiment with its tools across software lifecycle phases. 
  • The System Working Group will launch the “Good Practices in Open Source” specification/standard and extend its development platform to new ARM-based hardware. Collaboration with the Kernel-CI project will also allow for the evaluation of existing Kernel tests and their mapping to Kernel specifications and requirements.

Looking Ahead and Invitation to Participate

The achievements of 2024 provide a strong foundation for the ambitious goals set for 2025. We are excited about the collaborative opportunities ahead and the potential impact of the work on the safety and reliability of open-source systems in critical sectors. We encourage anyone interested in contributing to these efforts to join the ELISA community. Your expertise and dedication can significantly advance our progress toward a safer and more reliable open-source ecosystem. Visit https://elisa.tech/ to learn more and get involved.

Finally ELISA should also consider the evaluation of the currently available Kernel tests, in collaboration with the Kernel-CI project, and the respective mapping to the Kernel specifications and requirements.

ELISA Project Resources: