惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Latest
Security Latest
Jina AI
Jina AI
爱范儿
爱范儿
Attack and Defense Labs
Attack and Defense Labs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
GbyAI
GbyAI
N
News | PayPal Newsroom
Last Week in AI
Last Week in AI
V
Visual Studio Blog
SecWiki News
SecWiki News
H
Heimdal Security Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
腾讯CDC
L
LINUX DO - 热门话题
I
InfoQ
罗磊的独立博客
博客园_首页
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
美团技术团队
IT之家
IT之家
AWS News Blog
AWS News Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
Help Net Security
Help Net Security
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
Schneier on Security
Schneier on Security
Spread Privacy
Spread Privacy
B
Blog RSS Feed
N
News and Events Feed by Topic
L
Lohrmann on Cybersecurity
Google Online Security Blog
Google Online Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
N
News and Events Feed by Topic
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
The Register - Security
The Register - Security
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
F
Full Disclosure

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Part 4: Breaking Boundaries: TTM and Discrete GPU Memory Management
Deleon Karen · 2026-06-02 · via DEV Community

In the previous lecture, we introduced the GEM object model. For a long time, the i915 driver's memory management was designed around UMA (Unified Memory Architecture), because for nearly two decades, Intel's GPUs were all integrated graphics built into the CPU, sharing the same physical memory (system memory) with the CPU.

However, with the advent of the Intel Xe architecture and the introduction of discrete GPUs such as DG1 and DG2 (Arc series), the GPU now has its own dedicated video memory (VRAM). To manage the complex memory hierarchy across the PCIe bus, i915 brought in the veteran workhorse of the Linux kernel graphics stack for discrete memory management—TTM (Translation Table Manager).

1. Why Is TTM Needed?

In the pure integrated graphics era, GEM's core job was managing the GTT (Graphics Translation Table), mapping scattered system memory pages for the GPU. When physical memory ran low, the driver simply needed to cooperate with the Linux kernel's swap mechanism to page out the data, since the CPU and GPU faced the same physical storage.

In the discrete GPU era, however, the situation underwent a fundamental change:

  1. Asymmetric Storage: The GPU has extremely fast but limited-capacity LMEM (Local Memory / VRAM), while the motherboard has massive but slower SMEM (System Memory).
  2. Location Determines Performance: A render object (Buffer Object) must be placed in the right location. For example, a frequently read/written framebuffer must reside in LMEM, whereas temporary command data prepared by the CPU can be placed in SMEM.
  3. Data Relocation: When LMEM is full, less frequently used objects must be "moved out" to SMEM to free up space.

The core responsibility of TTM is precisely "Placements" and "Migration." It provides the driver with a common framework for defining different types of memory pools and moving data between these pools safely and synchronously.

2. Memory Region Abstraction: SMEM and LMEM

To interface with TTM, i915 abstracts the intel_memory_region structure. Each memory region acts like an independent "bank," with its own capacity, minimum page size, and allocation operations.

During driver initialization, the following common regions are probed and constructed:

// Defined in i915_memory_region.h
enum intel_region_id {
    INTEL_REGION_SMEM = 0,     // System Memory
    INTEL_REGION_LMEM_0,       // Local Memory / VRAM
    // ... for multi-die / multi-tile GPUs, there may be LMEM_1, LMEM_2
    INTEL_REGION_STOLEN_SMEM,
    INTEL_REGION_STOLEN_LMEM,
};

For a GEM object taken over by TTM, its lifetime is no longer simply bound to a fixed physical address; instead, it possesses a list of fallback placements.
For example, when creating a buffer, a userspace application can specify: "I'd prefer this object to be placed in LMEM_0, but if LMEM is full, placing it in SMEM is also acceptable."

3. Eviction and Migration

When a discrete GPU runs a large 3D game, several gigabytes of LMEM are quickly filled with texture and vertex data. When the driver tries to allocate new LMEM space but finds no free blocks, TTM triggers the eviction process.

3.1 Finding the Victim

TTM traverses the LRU (Least Recently Used) list, invoking the callback functions registered by i915: i915_ttm_eviction_valuable() and i915_ttm_evict_flags(). i915 determines which objects are currently not locked by the GPU's rendering engine and are allowed to be moved to SMEM. Once selected, this object becomes the "victim."

3.2 The Great Relocation Across PCIe

Moving data between LMEM and SMEM means the data must traverse the PCIe bus. In i915's i915_gem_ttm_move.c, the core function is i915_ttm_move.

This migration process is not performed by the CPU with a plain memcpy (which would significantly consume CPU performance and block the system), but is instead handed off to the GPU's Blitter Engine (a hardware engine specifically responsible for copying data) to be completed asynchronously.

The process is as follows:

  1. The driver allocates enough physical pages in the target region (e.g., SMEM).
  2. It constructs a hardware copy command (Blit instruction).
  3. The driver submits this instruction to the GPU's Copy/Blit engine for execution.
  4. A dma_fence (synchronization fence) is returned.
  5. TTM and subsequent rendering tasks wait on this Fence. Once the GPU reports "copy complete," the object's new physical address is updated in the page tables, and rendering tasks continue to execute, all transparent to userspace.

If the hardware copy engine happens to be hung or unusable, the code retains i915_ttm_move_memcpy as a last-resort fallback, where the CPU steps in to manually move the data.

Summary

With the introduction of discrete GPUs, i915's memory management completely broke out of the comfort zone of the original UMA architecture. By introducing TTM and abstracting intel_memory_region, i915 gained the ability to flexibly allocate data between VRAM and system memory. The eviction and migration mechanisms ensure that the most critical, frequently accessed data always resides on the fastest physical medium, all underpinned by the efficient asynchronous copy capabilities of the GPU Blitter engine.