Systemata operativa plerumque cum C coniunguntur.

Haec coniunctio intellegibilis est. C parvum, praedictibile, machinae proximum, et historice in opere nucleorum dominans est. Programmatori accessum directum ad memoriam, registra, dispositionem, et conventiones vocationis dat.

Haec sunt ipsa quae nucleus indiget.

Eadem etiam sunt quae nucleos difficiles securitate facere faciunt.

EriX praecipue in Rust scriptum est quia consilium circa unam ideam centralem aedificatur:

Auctoritas explicita esse debet.

Hoc ad facultates, structuras handoff initii, nuntios IPC, obiecta memoriae, et accessum machinarum pertinet. Etiam ad linguam implementationis pertinet. Rust evolutionem nuclei automatice tutam non facit, sed codici viam dat qua proprietas, mutatio, lifetimes, et periculum visibilia fiant.

Haec visibilitas valet.


Nucleus locus incommodus vitiis memoriae est

Vitia memoriae ubique mala sunt.

In nucleo peiora sunt.

Use-after-free in applicatione ordinaria illam applicationem corrumpere potest. Use-after-free in nucleo statum scheduler, tabulas facultatum, spatia allocationis, aut mappationes machinarum corrumpere potest.

Error finium in parsere spatii usoris unum processum cadere potest. Error finium in parsere initii afficere potest quem codicem machina deinde exsequatur.

Index malus in applicatione vitium locale est. Index malus in nucleo vitium auctoritatis esse potest.

Ideo tutela memoriae in EriX non est cura cosmetica. Nucleus pars basis computandi fidatae est. Bootloader pars basis computandi fidatae est. Plures bibliothecae parseris et ABI sunt TCB aut TCB vicinae.

Si haec componentia memoriam male tractant, exemplar isolationis deficere potest antequam ulla verificatio facultatis adiuvare possit.


Quid Rust nucleo det

Rust nucleo plures mores utiles per defaltam dat.

Dat slices finibus verificatos pro paribus indicis-longitudinis non verificatis in codice ordinario.

Dat regulas proprietatis quae aliasing fortuitum difficilius faciunt.

Dat lifetimes quae prospectus mutuatos in imagines initii, binaria ELF, blobs handoff, et buffers IPC exprimere possunt sine fictione eos repositorium subiectum possidere.

Dat Result et enums ut instrumenta ordinaria ad vias errorum explicitas faciendas.

Dat systema typorum satis forte ut multos status distinguat quos codex C saepe commentariis, flags, aut conventionibus repraesentaret.

Nihil horum necessitatem consilii nuclei tollit.

Rust non decernet quid facultas significet. Non decernet quod officium endpoint machinae accipere debeat. Non probabit protocollum IPC rectum esse. Non omne certamen in scheduler impediet.

Sed defaltam mutat.

In C, defalta est fere quamlibet functionem arithmeticam indicum sine verificatione facere posse, memoriam mutabilem aliasare, bytes ut structuras iterum interpretari, et silentio overflow pati nisi programmator ubique disciplinatus sit.

In Rust, codex ordinarius haec facere non potest nisi per unsafe aut per operationem explicite verificatam transeat.

Haec differentia securitatis practica est.


no_std ambitus normalis est

Rust nuclei non est Rust applicationis ordinariae.

Crate nuclei EriX est #![no_std]. Non super systemate operativo currit. Ipsum substratum systematis operativi est.

Multae bibliothecae EriX etiam no_std sunt, inter quas:

  • lib-bootimg
  • lib-elf
  • lib-handoff
  • lib-ipc
  • lib-capabi
  • lib-bootstrap
  • lib-console
  • lib-device
  • lib-driver
  • lib-time

Plures hae crates etiam #![deny(unsafe_code)] utuntur.

Haec coniunctio magni momenti est. Significat easdem bibliothecas in boot, in nucleo, et in officiis freestanding adhiberi posse sine officiis OS hospitis. Etiam significat codicem parseris et ABI saepe sine indicibus raw scribi posse.

Hoc unum ex aptissimis usu Rust in EriX est.

Proiectum multas crates parvas habet quarum munus non est ferramentum directe tangere. Munus earum est parsere, validare, encodare, decodare, et repudiare. Haec sunt ipsa opera in quibus Rust tutum valet.


Parseres tuti fines securitatis sunt

EriX parseres ut fines securitatis tractat.

lib-bootimg boot.img parsit et verificat. Via lectionis eius pars catenae fiduciae initii est. Structuram, alignment, fines, hashes, et signaturas validat antequam bootloader imagini fidat.

lib-elf binaria ELF64 parsit antequam bootloader segmentis onerandis utatur.

lib-handoff structuras handoff versionatas inter gradus initii et inter nucleum atque rootd validat.

lib-capabi genera facultatum, iura, constantes slot, descriptoria translationis, et auxilia validationis initii definit.

Hae crates consulto taediosae sunt.

Slices byte utuntur. Arithmeticam verificatam utuntur. Errores structos reddunt. Versiones non sustentatas, magnitudines malas, offsets malos, et tabulas male formatas repudiant.

I/O non faciunt. Auctoritatem runtime non possident. Non coniectant.

Hoc consilium in C possibile esset, sed disciplinam continuam requireret:

  • omnis index verificandus est
  • omnis offset contra fines validandus est
  • omnis operatio integra pro overflow inspicienda est
  • omnis prospectus redditus manu ad lifetime buffer input ligandus est

Rust has regulas vilius servandas facit.

Exempli gratia, imago initii parsata ex slice byte originali mutuari potest. Segmentum ELF validatum bytes mutuatos ostendere potest pro novo indice non verificato creando. Parser handoff iteratorem reddere potest qui intervallum uniuscuiusque entry ante parsing verificat.

Lingua non probat parserem semantice perfectum esse.

Tamen magnam classem errorum memoriae fortuitorum e via ordinaria parseris tollit.


unsafe non evanescit

Evolutio nuclei tota Rust tuta esse non potest.

Interface ferramenti type-safe non est. Registra CPU, tabulae paginarum, descriptoria interruptorum, port I/O, MMIO, buffers DMA, et indices ingressus initii non veniunt ut valores Rust amici.

Aliquando nucleus dicere debet:

Scio quid haec inscriptio raw significet.

Haec sententia est unsafe.

EriX unsafe habet in locis ubi machina id cogit:

  • codex ingressus initii indicem et longitudinem raw handoff in slice byte convertit
  • gluten syscall x86_64 assembly inline et ABI registrorum fixam utitur
  • context switching assembly architecturae proprium utitur
  • GDT, IDT, TSS, et initializatio syscall statum descriptorum CPU tangunt
  • tractatio tabularum paginarum lectionibus et scripturis volatile utitur
  • viae seriales et legacy port I/O utuntur
  • moderatores MMIO et DMA accessores volatile utuntur
  • quaedam runtime unius fili UnsafeCell post buffers staticos documentatos utuntur

Haec index non est defectus Rust.

Est finis honestus inter linguam et machinam.

Propositum non est nullum unsafe usquam habere. Propositum est unsafe parvum, locale, documentatum, et interfaciebus tutis circumdatum servare.


Fines unsafe angusti esse debent

Quaestio magni momenti non est:

Num codebase unsafe continet?

Quaestio magni momenti est:

Ubi est unsafe, et quod invariantum id validum facit?

In EriX, pons syscall raw in ipc-syscall_x86_64 bonum exemplum est.

Crate functiones wrapper tutas exponit sicut ipc_call, ipc_recv, ipc_reply, query_local_cap, et drop_local_cap. Intus unum finem assembly raw habet qui argumenta ad ABI registrorum syscall x86_64 transfert et valores registrorum raw reddit.

Wrapper indices usoris ipse non dereferit. Valores indicis et longitudinis ad nucleum tradit, ubi verificationes facultatum, endpoint, et longitudinis nuntii fiunt.

Haec forma recta est:

  • assembly raw segregatur
  • ABI documentatur
  • API publica typis constat
  • validatio semantica in nucleo manet

Finis context switch nuclei eundem morem sequitur. Est assembly architecturae proprium ad registra servanda et restituenda, sed reliqua pars scheduler cum structura KernelContext et trait ContextSwitcher laborare potest. Probationes hospitis switcher mollem uti possunt qui traditionem status fingit sine vero saltu CPU.

Haec divisio interest quia maximam partem logicae scheduler probabilem servat sine instructionibus privilegiatis exsequendis.


Accessus ferramenti adhuc accessus ferramenti est

Rust MMIO per se tutum non facit.

Si moderator valorem falsum in registro falso scribit, Rust machinam non servabit. Si buffer DMA male describitur, ferramentum adhuc in memoriam scribere potest. Si entry tabulae paginarum falsus est, CPU mappationem falsam efficacissime coget.

EriX hoc duobus modis tractat.

Primum, auctoritas ferramenti explicita fit. Moderator auctoritatem latam machinae accipere non debet. Tantum device frame, intervallum I/O, lineam interrupti, aut familiam endpoint qua indiget accipere debet.

Secundum, codex unsafe qui ferramentum tangit prope finem ferramenti servatur.

Exempli gratia, drv-virtio-block auxilia volatile MMIO et DMA habet. Hoc moderatori block exspectandum est. Res magni momenti est hunc codicem in moderatore spatii usoris currere cum superficie auctoritatis machinae angusta, non intra magnum nucleum monolithicum plena auctoritate machinae.

Rust intra illum moderatorem adiuvat, sed EriX adhuc architecturae nititur:

  • facultatibus machinarum explicitis
  • memoria machinae typata sicut CAP_TYPE_DEVICE_FRAME
  • endpoint kernel-control angustis
  • isolatione moderatorum in spatio usoris
  • validatione initii fail-closed

Lingua et consilium OS se invicem roborant.

Neutrum alterum substituit.


Rust cogitationi facultatum congruit

Exemplar proprietatis Rust non idem est ac systema facultatum.

Borrow Rust non est facultas EriX. Typus Rust non est auctoritas a nucleo coacta. Compilator scire non potest utrum processus frame mappare aut ad endpoint mittere liceat.

Tamen Rust et facultates bene conveniunt.

Utraque explicitudinem fovent.

In EriX, componentium agere potest solum cum rectam facultatem cum rectis iuribus tenet. In Rust, codex data mutare potest solum cum rectum genus accessus ad ea data habet.

Haec similitudo culturaliter et mechanice utilis est.

Fovet APIs ubi auctoritas ut valor traditur, non ex statu globali invenitur. Fovet functiones dicere quibus rebus indigeant. Fovet codicem initii fasciculum facultatum vere acceptum validare potius quam numerum slot pro permissione habere.

lib-capabi exemplum huius stili est. Auctoritatem runtime non cogit, sed linguam communem auctoritatis definit: IDs generum facultatum, flags iurium, constantes slot, descriptoria translationis, auxilia munerum, et validationem initii.

Quia no_std et deny(unsafe_code) est, hoc vocabularium auctoritatis late adhiberi potest sine eo ut omnis consumptor memoriae raw consumptor fiat.


Comparatio cum C

C nucleo maximum imperium minimo sumptu abstractionis dat.

Haec eius vis est.

Haec etiam eius infirmitas est.

In C, tabula facultatum extra fines indicari potest. Buffer nuntii longitudine falsa transcribi potest. Structura in disco compacta per indicem non alignatum legi potest. Index diutius vivere potest quam repositorium quod describit. Overflow integer in allocationem minorem verti potest. Functio statum per alias quem vocator non exspectavit fortuito mutare potest.

Haec omnia in C vitari possunt.

Vitantur recensione, conventione, analysi statica, sanitizers, fuzzing, et disciplina.

Haec instrumenta valent. EriX adhuc recensione, probationibus, et fuzzing indigeret si totum in Rust scriptum esset.

Differentia est quod Rust multas harum verificationum in exemplar linguae defaltum movet.

Cum EriX imaginem initii parsit, tabulam translationis percurrit, nuntium IPC aedificat, aut envelope handoff validat, repraesentatio ordinaria est slice, enum, iterator, operatio integra verificata, aut Result structum.

In C, repraesentatio ordinaria saepe esset index, longitudo, cast, et promissum.

Promissa non sunt inutilia.

Sed nuclei promissa celeriter accumulant.

Rust minuit quot ex illis promissis fidenda sint.


Rust vitia consilii non tollit

Rust non est probatio securitatis.

Non impedit ne facultas falsa concedatur.

Non impedit ne endpoint iura nimis lata habeat.

Non decernit utrum rootd, procd, aut deviced decisionem politicae possidere debeat.

Non automatice facit parserem omnem fasciculum semantice invalidum repudiare.

Non tollit canales laterales.

DMA cohaerens non facit.

Ordinem interruptorum simplicem non facit.

Scheduler aequum non facit.

Ideo EriX adhuc architecturam extollit:

  • TCB parvam
  • facultates explicitas
  • endpoint angusta
  • initium deterministicum
  • mores fail-closed
  • dependentias clean-room
  • officia spatii usoris
  • auctoritatem moderatorum muneri propriam

Rust substratum implementationis meliorem facit. Exemplar securitatis non substituit.


Panic non est ratio errorum

Codex nuclei claro exemplari defectuum indiget.

In EriX, defectus recuperabiles ex input externo ut errores reddi debent. Data handoff male formata, versiones non sustentatae, descriptoria translationis invalida, genera endpoint falsa, et auctoritas absens silentio reparari non debent.

Explicite deficere debent.

Panic servatur violationibus invariantium internorum, non validationi input ordinariae.

Hoc interest quia Rust panic facile facit, sed nucleus panic ut mechanismum ordinarium fluxus moderandi tractare non potest. Parser in TCB panic facere non debet ob input male formatum. Via boot fortuito per statum firmware unwind facere non debet. Officium runtime input ab oppugnatore moderatum ut causam viae recuperationis indefinitae intrandae tractare non debet.

Exemplar Rust utile est:

  • valida antequam fidis
  • Result redde
  • variantes errorum explicitas serva
  • panic statibus internis impossibilibus reserva
  • fail closed cum status securitatis ambiguus est

Hoc exemplar per crates parseris et handoff EriX apparet.


Utilitates probationum

Rust etiam probationibus prodest.

Nucleus EriX crate no_std est, sed magna pars logicae eius adhuc in hospite cum auxilio #[cfg(test)] probari potest.

Hoc utile est codici qui boot VM postulare non debet tantum ut invariantum purum validet:

  • verificationes finium parserum
  • validatio handoff
  • parsing descriptoriarum facultatum
  • logica masks iurium
  • tabulae politicae slot
  • transitiones status scheduler
  • exemplaria mollia context switch

Partes architecturae propriae adhuc probationibus integrationis indigent. Assembly inline, tractatio tabularum paginarum, traditio interruptorum, et transitiones in modum usoris probandae sunt in ambitu ubi vere currunt.

Sed Rust facilius facit logicam puram puram servare.

Hoc in micronucleo valet, quia multa componentia ad parvas machinas status deterministicas circa nuntios et facultates explicitas reduci possunt.


Cur hoc pro EriX valeat

EriX Rust non utitur quia Rust modicus est.

Rust utitur quia proposita proiecti cum viribus linguae congruunt:

  • minuere memoriam non tutam in codice fidato
  • proprietatem et mutationem visibiles facere
  • accessum ferramenti raw post fines angustos segregare
  • codicem parseris tutum, deterministicum, et inspiciendum servare
  • data protocolli et auctoritatis structuris typatis exprimere
  • codicem no_std inter boot, nucleum, et officia spatii usoris communicare
  • multa vitia ab initio difficiliora scribere

Codex unsafe residuus adhuc gravis est.

Tam diligenter inspiciendus est quam C inspiceretur. Differentia est quod EriX illam inspectionem in locos conferre potest ubi machina vere imperium raw cogit: codicem ingressus, apparatum CPU, tabulas paginarum, syscalls, context switches, MMIO, DMA, et port I/O.

Hoc est valor practicus.

Rust nucleum tutum non facit.

Partes unsafe eminere facit.


Prospiciendo

Proximus gradus est executionem sequi a primo codice a firmware onerato in nucleum.

Illa via est ubi multae ideae ex scriptis prioribus conveniunt: TCB, fines Rust, parseres validati, imagines initii signatae, structurae handoff, et prima translatio auctoritatis machinae in obiecta nuclei explicita.

Proximum scriptum processum boot EriX a firmware ad nucleum percurret: initium UEFI, exemplar handoff bootloader, et cur nucleus ut exsecutabile higher-half intretur.