Intel

ซีพียู Skylake เพิ่งเปิดตัวไป สำหรับคนส่วนมาก มันคือซีพียูที่แรงขึ้นตามรอบการอัพเกรดของอินเทล แต่นอกจากความแรงแล้ว อินเทลยังค่อยๆ ปรับปรุงสถาปัตยกรรมของซีพียูทุกรอบที่ออกรุ่นใหม่ เช่นใน Haswell ที่มีชุดคำสั่ง TSX สำหรับโมเดลการเขียนโปรแกรมแบบหลายเธรดแบบใหม่ ในสถาปัตยกรรม Skylake ชุดคำสั่งใหม่คือ Intel MPX (Memory Protection Extensions)

ชุดคำสั่ง MPX พยายามแก้ปัญหาความปลอดภัยซอฟต์แวร์ที่เป็นปัญหามายาวนาน คือ การใช้หน่วยความจำเกินกว่าที่จองไว้ (memory overflow) ความผิดพลาดที่โปรแกรมเมอร์ไม่ได้ตรวจสอบขนาดของหน่วยความจำที่จองไว้หรือขนาดข้อมูลที่กำลังเขียนลงไป สร้างช่องโหว่สำคัญๆ มากมาย ก่อนหน้านี้มีโครงการที่พยายามแก้ปัญหานี้ เช่น AddressSanitizer ที่รองรับใน GCC มาตั้งแต่รุ่น 4.8 และช่วยให้พบช่องโหว่ในเบราว์เซอร์โครมหลายจุด สำหรับชุดคำสั่ง MPX เป็นการย้ายกระบวนการตรวจสอบจากที่อยู่ในระดับซอฟต์แวร์มาอยู่ในระดับฮาร์ดแวร์ที่วงจรของซีพียูโดยตรง แต่ยังจำเป็นต้องให้ ระบบปฎิบัติการและคอมไพล์เลอร์รองรับ

ตัวอย่างโค้ดที่ MPX สามารถตรวจสอบความผิดพลาดได้ เช่นดังภาพ

upic.me

การเขียนสตริง "Intel MPXexample" ความยาวเกินขนาดหน่วยความจำที่จองไว้เพียง 4 ไบต์จะทำให้เกิดอินเตอร์รัพท์ และโปรแกรมจะเข้าฟังก์ชั่นเพื่อแจ้งความผิดพลาดทันที

upic.me

กระบวนการตรวจสอบ ทำได้โดยเคอร์เนลของระบบปฎิบัติการจะตารางค้นหาขอบเขตพอยเตอร์ (Bound Directory) เมื่อโปรเซสรันขึ้นมาก็จะสร้างตารางขอบเขตพอยเตอร์ (Bound Table) เก็บค่าขอบเขต จุดสูงสุดและต่ำสุดของพอยเตอร์ที่ใช้งานได้ หากพอยเตอร์พยายามใช้งานนอกขอบเขตนี้ก็จะเกิดอินเตอร์รัพท์

แม้ว่า Skylake จะเพิ่งออกวางตลาด แต่อินเทลก็เตรียมการสำหรับชุดคำสั่ง MPX มาล่วงหน้าหลายปี โดยส่งแบบจำลองการทำงานให้ผู้ผลิตหลายรายไว้ล่วงหน้า โครงการ AddressSanitizer มีบทความเขียนเปรียบเทียบการทำงานกับ MPX พร้อมกับตั้งข้อสงสัยว่าจริงๆ แล้วการตรวจสอบที่ระดับฮาร์ดแวร์จะได้ประสิทธิภาพเพิ่มขึ้นจริงหรือไม่ สำหรับลินุกซ์อินเทลส่งโค้ดเข้าไปยังเคอร์เนลตั้งแต่ต้นปีที่แล้ว ทำให้ลินุกซ์ตั้งแต่รุ่น 3.19 รองรับ MPX มาโดยตลอด และ GCC ก็รองรับ MPX บนลินุกซ์ตั้งแต่รุ่น 5.1 เป็นต้นมา สำหรับวินโดวส์นั้น รุ่น 8.1 เป็นต้นมาก็รองรับแล้ว แต่เอกสารของอินเทลไม่ได้พูดถึงคอมไพล์เลอร์ว่า Visual Studio รองรับหรือไม่ ระบุเพียงว่า Intel C++ รองรับบนวินโดวส์แล้ว

สำหรับโปรแกรมเมอร์ที่ยังเขียนภาษาซีกันอยู่ MPX ก็เป็นอีกเครื่องมือที่จะช่วยให้ความผิดพลาดถูกพบได้ง่ายขึ้น และไม่กลายเป็นช่องโหว่อันตรายไปเสียก่อน สำหรับผู้ใช้ทั่วไปหากนักพัฒนาไลบรารียอมรับประสิทธิภาพของ MPX และเปิดใช้งานกันเป็นมาตรฐาน ก็จะมีตัวช่วยป้องกันช่องโหว่ซอฟต์แวร์เพิ่มเติมมาอีกชั้น

ที่มา - Intel (PDF)

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call

คนละเรื่องกันครับ อันนี้ไ่ม่เกี่ยวกับการแก้ปัญหา memory leak
ถึงมีชุดคำสั่งนี้ ถ้าเขียนโปรแกรมโดยใช้ภาษาที่ไม่มี GC เช่น C/C++ อย่างไงคนเขียนก็ต้องคอยดูเรื่องการคืนหน่วยความจำเอง (นอกจากจะใช้ smart pointer)

ชุดคำสั่งนี้แค่ช่วยเพิ่มความปลอดภัยโดยการเช็คขอบเขตของหน่วยความจำแค่นั้น ถ้าเกินระบบปฎิบัติการมันก็ตรวจจับได้แล้วก็โยนเป็น exception ออกมา

แสดงว่าถ้าคอมไพล์ซอร์สโค้ดกับคอมไพเลอร์ที่มีฟีเจอร์นี้ ต่อไปนี้เวลาจองหน่วยความจำ ก็ต้องใช้ system call ตลอดเพื่อให้ kernel บันทึกขอบเขตของหน่วยความจำก้อนนั้นๆไว้
อย่างนี้โปรแกรมก็น่าจะมีประสิทธิภาพลดลงเพราะเกิด context switch ตลอดเวลา

หรือไม่ก็น่าจะต้องใช้กับโค้ดที่ต้องการความปลอดภัยสูง ดังนั้นเวลาคอมไพล์คงจะต้องระบุ flag กับคอมไพเลอร์โดยเฉพาะในกรณีถ้าอยากจะใช้ชุดคำสั่งใหม่นี้จริงๆ

ถ้าเป็นโค้ดที่ต้องการประสิทธิภาพสูง แล้วมีการจองหน่วยความจำบ่อยๆ นี่น่าจะทำอะไรผิดสักอย่างแล้วนะครับ เช่น สร้าง object pool เพื่อ reuse หน่อยความจำ ถ้าจะให้ malloc/free จัดการเก็บ freelist ให้นี่ วันดีคือดีเจอ malloc ที่สั่ง mmap/VirtualAlloc ทุกรอบประสิทธิภาพไม่แย่ไปเลยเหรอครับ

ถ้าเป็นโค้ดปกติ เช่น UI หรือ network อันนี้ก็ใช้ system call มโหฬารอยู่แล้ว น่าจะไม่ค่อยต่างมั้งครับ

เห็นด้วยเรื่องการใช้ memory pool ครับ

แต่ผมเคยลองเหมือนกัน โค้ดที่ผมลองเป็นโค้ดที่สร้างกราฟที่มี vertex กับ edge
เป็นล้านๆ แล้วลองจับเวลาระหว่างสองเวอร์ชั่นดู เวอร์ชั่นแรกคือใช้ new กับ delete แบบปกติ กับอีกเวอร์ชั่นที่จองพื้นที่หน่วยความจำไว้เป็น pool ไว้ล่วงหน้า พอเวลาจะสร้าง vertex หรือ edge ก็แค่ดึงจาก pool มาอีกที
ผลการทดสอบปรากฎว่า แบบ pool ไม่ได้ดีกว่าแบบปกติอย่างมีนัยยะอะไร

ส่วนกรณีของโปรแกรมประเภท GUI กับ network นี่มันเป็น IO-Bound เรื่องเวลาคงจะไม่ใช่ปัญหาหลักอยู่แล้วมั้งครับ

ในบทความของ AddressSanitizer ที่ตอนนั้นรายงานกับคอมไพล์เลอร์จำลองที่อินเทลออกมาก่อนหน้านี้ก็พูดเรื่องนี้ครับ ว่าอาจจะมีปัญหาประสิทธิภาพในบางกรณี แต่ตอนนั้นเป็นแค่คอมไพล์เลอร์จำลองยังไม่มีซีพียูจริงก็พูดยาก การศึกษาที่ทำได้คือกระบวนการแบบนี้จับบั๊กแบบใดได้บ้างไม่ได้บ้าง (มีบางกรณี false positive ด้วย)

แต่โค้ดที่ทั่วๆ ไปพวกอย่างพวกเว็บเซิร์ฟเวอร์ ที่เสี่ยงต่อการถูกยิงข้อมูลเข้ามาโจมตี จะต้อง malloc บ่อยขนาดนั้น?

ไม่ทราบเหมือนกันครับว่าพวกเว็บเซิร์ฟเวอร์จะต้อง malloc บ่อยๆหรือเปล่า แต่เดาว่าไม่น่าจะบ่อยนะครับ
ถ้าเป็นอย่างนี้แสดงว่าชุดคำสั่งใหม่นี้ไม่น่าจะมีผลกระทบอะไรมากเพราะอย่างที่คุณ lew บอกไปก่อนหน้าแล้วว่า ถ้าจะใช้ชุดคำสั่งนี้ต้องระบุ flag จะได้ไม่กระทบกับโค้ดปกติอื่นๆ

ถ้าใช้ new/delete ในกรณีทั่วๆ ไป (คือใช้ gcc/libstdc++, msvc/crt บนระบบปฎิบัติการทั่วไป Linux/Win/OSX ล่าสุด) มันคงไม่ได้ต่างกันเท่าไรครับ แต่วันดีคืนดีมีคนเอาไปใช้บนรันไทม์หรือระบบปฏิบัติการแปลกๆ หรือเจอไดรเวอร์แปลกๆ อาจจะทำให้ช้ากว่าทำ pool เองครับ ยกตัวอย่างเช่นรันไทม์ที่เรียกใช้ mmap/VirtualAlloc ทุกครั้งที่ malloc

อาจจะใช้ตอนทดสอบหาบั๊ก แล้วปิดในโปรแกรมรุ่นที่ใช้งานจริงก็ได้
หรือจะทำให้ผู้ใช้เลือกเปิดปิดได้ในโปรแกรมรุ่นที่ใช้งานจริงก็ได้

Apple
public://topics-images/apple_webp.png
SCB10X
public://topics-images/347823389_774095087711602_515970870797767330_n_webp.png
Windows 11
public://topics-images/hero-bloom-logo.jpg
Huawei
public://topics-images/huawei_standard_logo.svg_.png
Google Keep
public://topics-images/google_keep_2020_logo.svg_.png
Instagram
public://topics-images/instagram_logo_2022.svg_.png
SCB
public://topics-images/9crhwyxv_400x400.jpg
Microsoft
public://topics-images/microsoft_logo.svg_.png
Basecamp
public://topics-images/bwpepdi0_400x400.jpg
Tinder
public://topics-images/hwizi8ny_400x400.jpg
FTC
public://topics-images/seal_of_the_united_states_federal_trade_commission.svg_.png
Pinterest
public://topics-images/pinterest.png
Palantir
public://topics-images/-nzsuc6w_400x400.png
AIS Business
public://topics-images/logo-business-2021-1.png
PostgreSQL
public://topics-images/images.png
JetBrains
public://topics-images/icx8y2ta_400x400.png
Krungthai
public://topics-images/aam1jxs6_400x400.jpg
Palworld
public://topics-images/mccyhcqf_400x400.jpg
Bill Gates
public://topics-images/bill_gates-september_2024.jpg
VMware
public://topics-images/1nj4i1gp_400x400.jpg
Take-Two Interactive
public://topics-images/0khle7nh_400x400.jpg
OpenAI
public://topics-images/ztsar0jw_400x400.jpg
Thailand
public://topics-images/flag_of_thailand.svg_.png
NVIDIA
public://topics-images/srvczsfq_400x400.jpg
ServiceNow
public://topics-images/ytnrfphe_400x400.png
Klarna
public://topics-images/urcllpjp_400x400.png
Google Play
public://topics-images/play.png
Drupal
public://topics-images/drupal.png
Virtua Fighter
public://topics-images/virtua_figther_2024_logo.png
Paradox Interactive
public://topics-images/paradox_interactive_logo.svg_.png
Europa Universalis
public://topics-images/europa-icon.png
Nintendo Switch 2
public://topics-images/mainvisual.png
Cloudflare
public://topics-images/cloudflare_logo.svg_.png
Samsung
public://topics-images/samsung.png
Google
public://topics-images/google_2015_logo.svg_.png
Uber
public://topics-images/uber.png
Microsoft 365
public://topics-images/m365.png
USA
public://topics-images/flag_of_the_united_states.svg_.png
GM
public://topics-images/0pe0po-z_400x400.jpg
Perplexity
public://topics-images/perplex.jpg
Xperia
public://topics-images/xperia.png
iOS 18
public://topics-images/ios-18-num-96x96_2x.png
True
public://topics-images/true_logo.png
SoftBank
public://topics-images/softbank.jpg
Pac-Man
public://topics-images/pacman.png
Harry Potter
public://topics-images/harry.png
Marvel
public://topics-images/marvel.png
Skydance
public://topics-images/skydance.png
SEA
public://topics-images/sealogo.png
Find My Device
public://topics-images/find.png
Gemini
public://topics-images/google_gemini_logo.svg__1.png
Accessibility
public://topics-images/accessibility-128x128_2x.png
Material Design
public://topics-images/m3-favicon-apple-touch.png
Android 16
public://topics-images/android16.png
Android
public://topics-images/android_0.png
Firefox
public://topics-images/firefox_logo-2019.svg_.png
Google Messages
public://topics-images/messages.png
Notepad
public://topics-images/notepad.png
Singapore
public://topics-images/flag_of_singapore.svg_.png
Airbnb
public://topics-images/airbnb.png
PS5
public://topics-images/ps5.png
Krafton
public://topics-images/krafton.png
Doom
public://topics-images/doom-game-s_logo.svg_.png
AMD
public://topics-images/amd_logo.svg_.png
GTA
public://topics-images/gta_0.png
DoorDash
public://topics-images/doordash.png
YouTube
public://topics-images/yt.png
YouTube Music
public://topics-images/yt-music.png
Facebook
public://topics-images/fb.png
iQiyi
public://topics-images/iqiyi_0.png
Viu
public://topics-images/viu.png
Amazon Prime Video
public://topics-images/prime-vid.png
Spotify
public://topics-images/spotify.jpg
Apple TV
public://topics-images/apple-tv.png
HBO Max
public://topics-images/max.png
Threads
public://topics-images/threads.png
Alexa
public://topics-images/alexa.png
Kindle App
public://topics-images/kindle.png
Shopee
public://topics-images/shopee.png
Waze
public://topics-images/waze.png
Bilibili
public://topics-images/bili.png
Google Maps
public://topics-images/maps.png
Apple Music
public://topics-images/apple-music.png
Claude
public://topics-images/claude.png
TikTok
public://topics-images/tiktok.png
Xbox
public://topics-images/xbox.png
Tesla
public://topics-images/tesla.png
Chrome
public://topics-images/chrome.png
Google Calendar
public://topics-images/gcal.png
Google Home
public://topics-images/ghome.png
Google Meet
public://topics-images/meet.png
NotebookLM
public://topics-images/notebooklm.png
Reddit
public://topics-images/reddit.png
Assassin’s Creed
public://topics-images/ac.png
Mark Zuckerberg
public://topics-images/zuck.jpg
Meta
public://topics-images/meta.png
Meta AI
public://topics-images/meta-ai.png
Epic Games
public://topics-images/epic_games_logo.svg_.png
Unreal
public://topics-images/unreal_engine_logo-new_typeface-svg.png
Fortnite
public://topics-images/fortnite.png
DeepMind
public://topics-images/deepmind.png
Databricks
public://topics-images/databricks.png
Netflix
public://topics-images/netflix-logo.png
Microsoft Azure
public://topics-images/azure.png
Microsoft Copilot
public://topics-images/microsoft_copilot_icon.svg_.png
Bing
public://topics-images/bing.png
EA
public://topics-images/ea.png
Intel
public://topics-images/intel.png
Amazon
public://topics-images/amazon.png
AWS
public://topics-images/aws.png
Zoom
public://topics-images/zoom.png
Dropbox
public://topics-images/dropbox_0.png
Roblox
public://topics-images/roblox.png
Dell Technologies
public://topics-images/dell-tech.png
Nothing
public://topics-images/nothing.svg_.png
Microsoft Teams
public://topics-images/teams.png
Mojang
public://topics-images/mojang.png
Minecraft
public://topics-images/minecraft.png
Redis
public://topics-images/redis_logo.svg_.png
Ubisoft
public://topics-images/ubisoft_logo.svg_.png
Elden Ring
public://topics-images/elden.png
Brave
public://topics-images/brave.png
Opera
public://topics-images/opera.png
Vivaldi
public://topics-images/vivaldi.png
Microsoft Edge
public://topics-images/edge.png