Për Linux 5.18 është planifikuar të zhvendoset kodi në një version më aktual të C për të zgjidhur probleme të ndryshme. 

Çfarë është Linux dhe për çfarë shërben?

Gjatë procesit të diskutim zhvilluesi të kernelit linux rreth dhel tema e një grupi të arna për të rregulluar dobësitë e Spectre në kodin për të punuar me listat e lidhura, u bë e qartë për shumë zhvillues që problemi mund të zgjidhet më lehtë nëse lejohej në kodin e kernelit C que përputhet me një version më të ri të standardit. 

Dhe është se aktualisht kodi i shtuar në Kernel Linux duhet të përputhet me specifikimin ANSI C (C89), i cili u formua në 1989.

Kjo është arsyeja pse problemi që lidhet me Spectre në kod ishte sepse se vazhdoi të përdorte një përsëritës të përcaktuara veçmas pas lakut.

Pavarësisht natyrës së tij përgjithësisht të shpejtë, projekti i kernelit mbështetet në një numër mjetesh më të vjetra. Ndërsa kritikët pëlqejnë të fokusohen në përdorimin e gjerë të emailit nga komuniteti, një anakronizëm ndoshta më domethënës është përdorimi i versionit 1989 të standardit të gjuhës C për kodin e kernelit, një standard që u kodifikua përpara se projekti i kernelit të fillonte mbi 30 vjet më parë. Duket se kjo praktikë e gjatë mund të marrë fund sapo kernel 5.18, që pritet në maj të këtij viti.

Përmendet se një makro përdoret për të përsëritur mbi elementët e listës së lidhur, dhe meqenëse përsëritësi i ciklit kalon në këtë makro, ai përcaktohet jashtë vetë ciklit dhe mbetet i disponueshëm pas ciklit. Përdorimi i standardit C99 do t'i lejonte zhvilluesit të përcaktojnë variabla për ciklin në bllokun for(), i cili do ta zgjidhte problemin pa shpikur zgjidhje.

Fatkeqësisht, ka shumë vendndodhje në kernel ku është lista
iterator përdoret pas ciklit që prishet në një ndryshim të tillë. Për fat të mirë
ekziston skripti use_after_iter.cocci i cili mund të përdoret për të identifikuar të tilla
vendndodhjet e kodit. Më duhej ta përshtatja pak skenarin pasi redukton falsitetin
pozitive në rastin e përdorimit origjinal, por ato janë të rëndësishme për këtë patch.

Një larmi e madhe vendndodhjesh kodesh të raportuara përdorin vetëm përsëritësin e listës pas
cikli nëse ka pasur një dalje të hershme (break/goto) dhe prandaj nuk janë
relevant.

Nga ana e saj, Linus Torvalds u pajtua me idenë për të qenë në gjendje të zbatojë mbështetje për specifikimet më të reja dhe sugjeroi më tej lëvizjen në kernel 5.18 për të përdorur standardin C11, të lëshuar në 2011.

Pas kësaj, gjatë verifikimit paraprak, montimi në GCC dhe Clang në modalitetin e ri kaloi pa devijime. Nëse nuk shfaqen probleme të paparashikuara për shkak të testimit më të gjerë, skriptet e ndërtimit të kernelit 5.18 do të ndryshojnë opsionin '–std=gnu89' në '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds nuk i pëlqeu shumë patch-i dhe nuk e pa se si lidhej me dobësitë spekulative të ekzekutimit. Sidoqoftë, pasi Koschel shpjegoi më tej situatën, Torvalds ra dakord se "ky është thjesht një gabim normal, i thjeshtë dhe i thjeshtë" dhe tha se duhet të rregullohet pavarësisht nga seritë më të mëdha. Por më pas ai u thellua në burimin e vërtetë të problemit: që përsëritësi i kaluar në listën e makrove të përshkimit duhet të deklarohet në një shtrirje jashtë vetë ciklit:

Arsyeja kryesore që mund të ndodhë ky lloj gabimi jospekulativ është se historikisht ne nuk kishim "deklarimin e variablave në sythe" të stilit C99. Pra list_for_each_entry() - dhe të gjitha të tjerat - në thelb gjithmonë filtrojeni hyrjen e fundit HEAD jashtë ciklit, thjesht sepse nuk mund ta deklaronim variablin iterator në vetë ciklin.

Vlen të përmendet gjithashtu se u konsiderua mundësia e përdorimit të standardit C17, por në këtë rast do të ishte e nevojshme të rritet versioni minimal i mbështetur i GCC, pasi përfshirja e mbështetjes për C11 përputhet me kërkesat aktuale për versionin GCC (5.1).

Më në fund nëse jeni të interesuar të dini më shumë për të, ju mund të kontrolloni detajet në lidhja vijuese.


Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: AB Internet Networks 2008 SL
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.