#MINTIA (not vibecoded)
1 messages · Page 23 of 1
Disclosed is a method, system, and program for implementing priority inheritance in an operating system. A first list includes a boost request to boost a priority of an indicated thread holding a shared resource to an indicated priority. Further included is a second list. The system processes the boost request in the first list to boost th...
lol
not NT but similar naming
The threads of a user mode process can access various different resources of a computing device, and such access can be serialized. To access a serialized resource, a thread acquires a lock for the resource. For each context switch in the computing device, a module of the operating system kernel checks for priority inversions, which is a s...
there must be thousands of priority inheritance patents there
how can it make sense
I don't get how these are enforced
the descriptions in the patents makes it look incredibly easy to accidentally replicate
they're a load of bullshit
the only reason anyone gets anywhere with them is because they can afford to bring to bear great sums of money on using them to try to extract great sums of money from other firms
which other firms lol
there are three real practical operating systems
and suing linux over patents is an awful PR move
I'm on about software patents generally
It's my understanding that they mostly file these patents in order to reward their engineers
Because it makes them legally into inventors and they can list patents X, Y, and Z that they invented
People rarely try to enforce software patents yet Microsoft files for (and receives) like 4 a week
Or more
can it be useful for getting visas for engineers?
iirc theres a visa for extraordinary ability or something like that
i doubt that's done in practice too much
back when the tech job market was overheated, h-1b was by far the most common type of visa
am i right in thinking that when you do priority inheritance you generally dont allow to release a lock from another thread
than the acquirer
Yeah that's ugly in general and becomes broken when you have PI
i looked at the struct called _KLOCK_ENTRY_LOCK_STATE and it has CrossThreadReleasable which hints that a releaser can be another thread?
Perhaps
I wouldn't allow that
If I had to guess they only support that in autoboost bc of drivers that did menacing things
KeAbMarkCrossThreadReleasable
KeAbCrossThreadRelease
KeAbCrossThreadDelete
it probably adds a lot of complexity then
Yeah it's kind of a synchronization nightmare
Might be another reason for the deferring
You’d need to be a proper good engineer to work with this.
Just the multi-level inversions were enough to make my head go round.
or some 30 year old legacy user app
Could happen if someone stupidly used a mutex as a cross thread semaphore by having thread A take the mutex and thread B release it
looks like it tries to be very efficient for user mode locks
even happened to " break" some old game
Actually yeah this probably happened a lot
especially because the win32 mutex primitives might have been the fastest way to do that at one point
since they had a noncontended fast path that doesn't enter the kernel
whereas the full semaphore or event objects always would
so I bet a lot of programs in the 90s tried to be clever
https://cookieplmonster.github.io/2025/04/23/gta-san-andreas-win11-24h2-bug/ some ntdll autoboost functions happened to break some legacy app
well it was the game's fault anyway
its just the implementation of critical section changed with some new user mode autoboost behavior
IIRC Windows also doesn't support that
And I think it must be something else
Apparently, only fast resources (Win 10+) use CrossThreadRelease
we can instead form a sort of understanding between us that we haven't the slightest shame if one of our subsystems resembles the other's
fast resources ?
i only found a mention that they can be faster in some cases https://community.osr.com/t/threads-waiting-on-eresource-and-the-locks-windbg-command/59109/5
man im washed up
people used to glaze mintia so much and it sucked total ass compared to Astral or a number of other current projects
theres only one solution: locking in...
i think the bar has been raised to the point where like rejoining the ranks of the best of the server would mean mintia2 is running on amd64 and has advanced device driver support and runs minecraft
paging gimmicks wouldnt cut it anymo
ppl here are getting too good...
this is all planned and hopefully i can get it done in a timeframe where the bar isnt further raised to the point where id have to capture 2% of the desktop market share or something
that is to say i have to get it done before we reach the year of the astral desktop
The bar is very high these days indeed
Its not like 2021 when a gdt os was considered a pretty big achievement
well a gdt os was never considered a pretty big achievement in this community
except maybe in like 2018
kind of amazing mintia1 got so much glaze just cuz it had some uncommon paging features like swapping and had a userspace, when it wasnt even SMP and only ran on a fake computer (at the time)
that might be more reflective of how suckish everything was back in like 2021-2023
the days where toaru was the most commonly cited example of a highly complete project
astral has swapping and other uncommon paging features ?
i feel like fadanoid and i introduced people to the novel idea of spending more than 2 months on your kernel before speedrunning to the window system and then we both immediately ate shit
hopefully one day we can escape mathewnd's dust cloud and be bar raisers again
lmfao
im unsure if it has swapping but its sort of irrelevant since it more than makes up for it in other areas
in terms of overall quality
its just you focus more on the kernel while other focus on getting ports and user mode stuff
mathewnd has been grinding away at his project during the whole like 2 yr period where ive been struggling with motivation on mine
as a result it has you know obviously raced by me
which is based
motivation starts a project, discipline continues it
no its not that its that im skill issued on motivation
if you just wait for motivation to strike, youre done for
youll get like nothing done
except for like some random days
where u do 10 hours of work
if things are so dire that it has come down to "discipline" then my project is over lol
i did well in the past because it was the default thing i would do in my free time rather than doomscroll which is a thing ive taken up over the last couple years and is possibly a contributor to the motivation issues
i dont think theres a single person on earth who can stay motivated on one thing for more than a year or two
well, youve obviously ran out
nope its just hiding
if doomscrolling is an issue then stop doomscrolling
nobody is holding a gun to your head
i was not asking for advice
merely stating that i have eaten mathewnd's dust and intend to resume regular work and not be a dust eater forever
things are not that dire hence i do not consider my project over
well
im merely stating that if motivation is the only thing keeping ur project going then you'll eat dust forever
well you put some effort and time into self hosted infra structure, your own compiler and language
and spent more time on research on iokit and stuff
it was written in a writeonly language with a custom toolchain
instead of speed running
i must have fallen very low that the 15 year old is doubting me
im not 15 years old
nobody glazed mintia1 for being written in df that was almost universally taken as an embarrassing thing about it lol
this is revisionism or you werent there
it was 100% for the kernel design aspects
people didnt like df but they did like the fact that it had its own compiler and stuff
no, people here took that for what it is, in the context of kernel dev, which is a largely uninteresting novelty
it was also the first hobby kernel outside of react that resembled NT
wasnt nt like completely hated and clowned on here
its cool broadly to have an nih ecosystem and i have my reasons for maintaining that but in the context of this server it like basically is not relevant lol
and rarely came up in mintia1 discussions
its tangible contributions were 100% to general knowledge of like paging dynamics and the constraints they place on kernel design since i was like the only person exploring that at the time and people got interested in it
it wasnt taken to be particularly interesting
correction, nobody who knew what they were talking about
theres always like r/osdev poster types who are going to go like "ZOMG A CUSTOM LANGUAGE??? WELCOME BACK TERRY"
for ppl who knew what they were talking about the interest was 100% in me being able to tell them how to design like dependency ordering for a swapping vmm so that you dont deadlock after 0.5 seconds
which was like completely undocumented arcane knowledge at the time
and is hard kind of
mintia2's things i wanted to focus on and explore are stuff like a really good plug n play io system and numa
(without losing any of the vmm features mintia1 had)
oh yeah and a hopefully interesting take on vfs
all yet to be implemented
that might be part of the loss of motivation too is that it took way longer than i anticipated to get to the stuff i considered interesting to work on
also im not a discord ventposter begging for extremely obvious advice
already knowing that was the whole reason i mentioned it!
if i say "i have X issue because of Y thing i can just stop doing" the "so i will not do Y anymore" is implied and i will want to cleat you in the face for saying it at me
just for future reference
i remember when nanoshell was getting glazed for its GUI
you say the "so I will not do Y anymore" is implied but i beg to differ
most people ive seen vent like this do know the issue
and they just dont fix it
because theyre addicted to it / procrastinating / whatever
we will see
I think this is true, it's impossible to stay motivated on a single thing for many years
For example, Managarm has it a lot easier to survive because it doesn't depend on a single person's continuous attention
This is also kinda true though. All things equal and for the same time investment, a custom OS written in a custom language with its own compiler will always lag behind (in pure kernel level features) a kernel that's not written in custom language. I think this is more a question of preference / personal priorities
i disagree since the language is sort of an isolated time investment aside from early compiler bugs which you do get like 99.99% sorted out
at least it is for me
after that it can easily go at the same rate as any other kernel project written in a language at the level of C
i would not agree with the idea that mintia2 is doomed in some way to lag behind other projects that arent written in custom langs
there is essentially no reason that would be true aside from extra porting effort but that is again a minor one time investment compared to the broader timescale of the project
I'm not saying that Mintia2 is doomed to lag behind other projects, I'm saying this without the specifics of Mintia2 in mind
basically it boilds down to: "first do X, then Y" is always going to be harder than "do Y"
i dont understand the point of your statement then
i feel like this is an unfair statement to make also in a thread for a project that has survived for like 8 years and is undergoing a fairly minor 2 year blip during which like 40k lines have still been written
(well, the wider fake computer project, mintia is only ~5 yrs old)
That statement was not a judgement of you or anything, it's just what I observe in general. Managarm has also been a continuous effort for 11-12 years now with same codebase, yet ppl (myself included) lose and re-gain motivation from time to time
my basic motivation for it is fairly eternal since my fixation on OS stuff is close to the core of my personality since i was a preteen and im probably too autistic for that to change
i dont see myself ever permanently stopping work on it for any reason other than maybe it becoming profoundly irrelevant in multiple ways
For me, the motivation to work on low level stuff as a hobby definitely took a hit when I started doing systems engineering as a job
something like technology moving away from the current basics of OS design in fundamental ways and a loss of a corresponding community and so on
which i dont see in the foreseeable future
OSes are going to look different in 2050 but not so different that they dont have like schedulers or memory barriers anymore
probly
the most fundamental changes are more likely to be security related
I think it also helps that you weren't focused on a single thing
Like, it's a bunch of projects instead of just one
Are you still doing that?
ive been actively rethinking my decision to aim for the computer industry for a career
inb4 you cant syscall without your government id
something i think we might see is like
that one apple silicon feature where the pte permission bits are indices into an on-chip table of the real permissions bits
and you can change the permissions of like terabytes of virtual memory at once by writing new permission bits to an entry in that table
i forget what the acronym for it is
i think thatll become ubiquitous and will be used for fairly profound kernel design features
this sounds useful but at the same time i cant think of a single use
for example you can toggle W^X memory back and forth between writable and executable
i think thats one of the things they use it for
yes but would it really make a diff unless u have like a shit ton of W^X virt memory?
which happens in JIT engines
but more profoundly you could use it to separate a monolithic kernel into separate components that might for example have read-only access to one another's data but no write access and you can call through gates that switch subsystems by writing new entries in this table
things like that
that sounds more useful
which is already being done in XNU to some extent btw
on iOS
they now isolate the page tables by doing that
along with an extra privilege ring
which is the only one allowed to modify that table of permission bits
all apple silicon specific features
now they just need a feature where the instruction's PTE also determines which permission table is used and they'll have fully re invented segmentation 
fadanoid and i discovered a feature like this in a kernel design from like 1989 called OZIX
but the way they did it was to manually set all the PTEs for data in the old subsystem to read-only and the ones for the new subsystem to read-write
which is obviously slow as shit and also has the inherent hole that anybody in kernel mode on a 1989 chip can touch the PTEs, so it only makes specific types of attacks harder
they were def missing this hardware feature
which would have made the subsystem gates instantaneous and provides the extra privilege level which makes them airtight as well
nearly
Protection keys?
thats the intel name for it, apple doesnt call it that (or do they! i dont remember)
also i think intel's impl is inherently holey in some way that apple's isnt
last i heard
Thats cool
if id known about that earlier i def would have designed it into my toy architecture and would be using it in mintia2 lol
the coolest part is that it doesnt require any tlb invalidations since the tlb caches the index which indirects into the permissions table
so it really is like
a couple cycles
no extra tlb misses
or shootdowns
cuz the contents of the changeable parts of the permissions table, are part of the thread context and are switched when threads are
its also a fairly cheap feature and it could have probably been implemented on 1989 chips
its just that nobody had thought of it
the VAX in 1978 probably could have had this
and then everything after would have it
NT's Ke vs executive separation would probably have been runtime enforced this way lol
i think this specific feature represents a real alternate reality for the last few decades of os design and possibly a future as well
xnu's already using it to isolate the page table manipulation code and it sounds like the uses of it are still expanding
xnu's security features will prob trickle down to the other major kernels
over the next 10-20 yrs
i think they have such an edge because of the vertical integration where the chip architecture design and kernel design teams can directly coordinate under the same roof and rapidly iterate on cool ideas
...if nt will still exist
i dont think nt will vanish on a 10-20 yr timescale
doesnt make much sense that it would
its unlikely to ever be cheaper for MS to try to make Linux (or whatever) walk and talk like NT to the decades of programs that want it to, than to just keep going with NT
im quite pessimistic about the future of microsoft, but yeah 10 years is too little
This is an interesting element since soon apple will be liberated from having to care about chips they didn't themselves make
we could see xnu become the most structurally exotic kernel fairly quickly if they keep this up
mostly motivated by security
For the first time since 90s we are seeing what happens when the chipmaker and kernel authors are in the same building
i think the xnu team might be like the coolest modern kernel team to work on if i got to pick
Really historically this was more of the norm and that's how we ever got a lot of the features we now consider fundamental. Without it kernels would've been stagnant
it would be cool to see some kind of macromicrokernel where you have subsystems separated by gates to the extent that theres like fault isolation
and a crash inside most subsystems doesnt panic the kernel but reinitializes the subsystem and sets the thread to return an error status to the gate caller
does this already happen
is its just an idea
just an idea
possibly the only originalish idea ive ever had since i dont think ive seen it before in any form other than the primitive form described in the ozix docs
i kinda like how windows was separated into different worlds to protect the kernel and separate the secure kernel and all that stuff
but it loses the hardware support which apple has i believe
maybe it moved further, i remember sangrealis mentioned miroexecutive
#lounge-0 message
you could avoid per-subsystem kernel thread stacks by having gate calling be 100% callback oriented too
then you can just have the one kernel stack which gets reassigned between subsystems as the thread crosses them
and is reset on each gate cross
would be kind of ass pain but it would work
would be a very unusual kernel structure
which im saving for my hypothetical master's thesis.
One of the problems of dividing a system up into multiple parts which can't share a stack is if you ever have reentrance you end up with a problem figuring out how to allocate all the stacks and not waste a lot of memory
So I think a portable stack in some form or another is a great help
from some sources it looks like xnu uses cl4 kernel for security "exclaves"
the access control might be useful then? sou they could be able to switch xnu for cl4 , with a separate set of page tables that also maps their secure page table thingy the same way as in the xnu page tables via l1
i dont think callback oriented subsystem crossing would be as annoying as callbacks normally are, probably it would be a manageable level of annoying, since callbacks get annoying when you need to maintain state about the operation out-of-line for the callback to consult, but its fairly often for the implementation of a syscall to follow sort of a straight line path from one subsystem to another or remain within one subsystem (especially if you can read the data of other subsystems)
does apples hardware limit in any way which bits you can switch ?
for example can you switch an entry that was normally rw- into rwx
RCU could be useful also as a way to like make pointers safe to look at while youre looking at a remote subsystem's readonly memory
since then you dont need to grab a lock
to maintain existence of the thing
usually you need to write to a lock to acquire it, which would violate the whole thing where another subsystem's memory is read only
then its even cooler because you can have greater granularity than you do with per-process address spaces
also does this not require tlb flushes?
it does not
ah it caches the indices
yep
depending on what you want to work on, it's unlikely that you'll be able to work on server scalability optimizations for big iron at apple
ever since apple silicon they've been doing really cool shit
well im talking about security stuff right now which they are definitely doing a lot of
iirc their security team is separate from the kernel proper one
i dont think we've heard that
well they both work on the kernel so they're both the kernel team :^)
i mean im sure they have more security-oriented people
and less security-oriented people
but im p sure theyre all on the same team
but yeah working at apple right now sounds cooler than working on NT at microsoft
would be weird otherwise
especially with MS going all in on AI while apple doesnt care that much
slowly convincing myself to add this stuff to xrarch and have the low 5 flag bits of a PTE turn into an index 0-31 into a table like this and have the firmware initialize it to be a 1:1 mapping for compatibility with the old OSes
i saw a job opening for the kernel security engineering architecture which was presented as a separate team
What's useful about it though? Like i get the point of isolating subsystems, you can only access them fully through gates etc. but if you were to gain control of the kernel couldnt you just call into the gate and do your shit there?
not that microsoft was a particularly beloved corp among technical people before ai boom
microsoft was cool in the 90s
i mean if the subsystem gate entrypoints do parameter validation then no
doesnt calling the subsystem entry point essentially give your thread access to the entire thing?
theres an iron curtain similar to the one between kernel and userspace on a syscall
except you can read across the boundary
since thats very convenient
so like:
void subsystem_do_thing(int param) {
// I can only access read-only
enter_subsystem_gate(); // Remap write
// now i can access everything
do_thing(param);
exit_gate(); // Back to read only
}
even that could be configurable on a fine grained basis though like you could have per-subsystem heaps and have one be globally readable and another be fully private
no
crossing a subsystem gate fully transfers control to some defined entrypoint in the other subsystem
what would such call look like?
a lot like a syscall
all this sounds really interesting, but I'm not sure i understand it fully
Indeed Xnu has some use of a continuation based system already
Where you sleep with a "call this function when I return" routine. The kernel stack can be dropped during that sleep
sounds useful and easy to implement
whats its name
something like that would be downright trivial to add to my kernel
before waiting you can set a field in the current thread structure for a callback pointer and another for a context
upon unblocking it notices that this is set and it resets your stack and sets it up to call onto the callback
and when the kernel stack swapper passes over you and sees that you have this set, it frees your kernel stack outright
any syscall that blocks at the end and does very little afterward could be implemented this way including the synchronous IO ones
p easily
I forgot but kqueue used it
Yes it seems a low effort nice win
also you could have it like
if your kernel stack does not fall victim to the swapper thread, the wait can still just return normally
to avoid the overhead of redirecting the thread to the callback
and then it can just call the callback or something
normally
fall onto the common codepath
you would still need to have a stack to call the callback though no?
yeah you would reallocate it when the thread is unblocked
ah the point is that you can free stacks for free
like
if its sleeping and it doesnt have to keep any context on the stack upon waking up you can free its stack easily
yeah
theres some stuff youd have to save somewhere else
like the trap frame
which you need in order to ultimately return from the syscall
normally youd have to page it out or something to keep the data if you wished you free the stack
but thats expensive
i feel like a well-optimized run length encoding could be good for kernel stacks too lol
if you zero them out every once in a while upon entering the kernel
theyll be mostly zero a lot
or even a full compression algo of the variety used for page compression and just have it fall down the normal page compression pipeline
when would you compress them?
you keep them always compressed and uncompress them when switched into?
apparently its handoff with continuation
probably when the thread has been asleep for a while
Isn't that typical though? Paging out the stack after a while
It's just that the pager is doing compression
mintia2 memory compression?
see here
.
Yeah well then it's the same as windows swapping but with compression
no its exactly the same as windows swapping
because windows already compresses these pages
literally cars 3 
no but like the bar is insane though, idek
how do people even get to minecraft and all
we literally got OSdev monopolies 
years and years of work
and mlibc being super fucking good
ah yes the ultimate savior of the world
well the 2nd ultimate but whatever 
whats the first
either jesus christ or limine
mlibc
Managerms 
I <3 mlibc
imagine writing your os in rust
to be fair
i could shit on my hard drive
and the bits that were randomly turned on by the shit
would make a better libc
than glibc
not because glibc is bad or anything
glibc kinda sucks yes
it's just written in GNU "style" (writeonly garbage)
guh-noooooooooo
what
isnt it read like goo nue
ok if you pronounce gif with j and god with j then you should pronounce gnu with a j
that makes lots of sense
I tend to pronounce it as guh-nue but I wanted to put "noooooo" instead of "nue"
makes sense

rust is balls for osdev because its most advertised feature isnt practical
i guess you just have to like the syntax
But I follows in gif but not in gnu or god
I is a softening vowel
It has this property of modifying a previous consonant in gaelic, polish, also Italian whence i assume comes the jif pronunciation for gif
if you think about it
gif should just be
G I F
nobody reads PNG like "ping"
or "MP4" as "umph four"
gif can actually be pronounced as a word unlike png
you cant pronounce png as it is, you have to add a vowel
why does this thread get so much weird yet calm almost philosophical unrelated conversations 
its pretty nice
you have to say "pung" or "ping" or whatever
or you say "p ng"
pee n gee
pee ng
im thinking gif should be pronounced as gif and not jif because in words that start with g we dont say j
jallery?
jabagool 
that's exactly how i do say png
pee en gee
jabba juul 🐸 🚬 ☁️
do you read osdev without separating the o and s
ossss-dev like as in boss? lol
yes
@twilit smelt @warm pine it seemed to me that you were well informed about the NT memory manager
I am familiar with the concept of working sets and aging, but not in the new implementation you mentioned
perhaps you could enlighten me about this virtual memory technique and explain to me what the concept of "thread fault clusters" is?
I know only that it's also subject to aging and walking (the MiThreadFaultClusterAgingThread runs alongside the working set aging thread.)
yeah that one is interesting
when a page fault happens the memory manager predicts nearby pages that will probably be used soon and materializes them in advance
although i thought this thing existed for many windows versions now and im not sure how exactly it changed in modern windows
didnt mean to ignore you
fault clustering is basically where they reduce the number of page faults by making multiple pages valid at once
the per-thread cluster length basically says the ideal number of pages to make valid at once and is changed in various situations i forget
but setting it to like
1
basically disables clustering for faults taken by that thread, and indicates that random access is being performed for example
in the new implementation they do away with the old working set array, which contained a list of the currently valid virtual pages in the process's address space, and instead scan the page tables directly
they link the page table pages of a process into per-age lists anchored in the process structure (or somewhere, theyre per-process basically)
we arent sure how the age of a whole page table is determined but its probably average age of all the contained valid pages
i believe they pop page table pages off the oldest age list and age each PTE, invalidating them and decrementing the refcount on the page frame when the age passes the maximum
presumably during this process the average age of the page table is re-calculated and it is placed on the back of the appropriate list
they parallelize this process by having multiple threads pop page tables off of these lists and age them in parallel
and im pretty sure they optimize it using a bloom filter or something to avoid scanning large ranges of invalid PTEs
thats how im planning on doing it at least
reversing this algorithm and finding out details like this would be a very helpful addition to our collective knowledge base, if you feel like taking a look
cool screenshot of mintia1 running on all 3 of its platforms for future use
that sounds very interesting, I'm intrigued by the new stuff, but I'll leave it up to you 😄
I'm making good progress with Ke, have learned a lot of new things
have you finished reversing autoboost ?
I never intended to study it in depth because I didn't know about it when I started to begin with
but over the past two weeks I think I've figured out most of the basics
i'd be interested to read any kind of analysis of that
btw , are the so called reschedule contexts needed for balancing scheduled threads or looking for a new thread ?
i did some work on mintia2 for the first time in a couple weeks
refactored the loader so that it mirrors the boot node's page directory to the other nodes correctly
at this point i should be able to draw up a numa xr/computer platform (xr/frame) and add support for it in order to test mintia2's numa support
plan is a platform with up to 4 nodes and up to 4 processors per node
so 16 total processors
at max
reschedule contexts describe the processor or processors currently being reconsidered when the scheduler searches for a replacement thread
do you plan to use a counting bloom filter to support removal operations? from my understanding, standard bloom filters do not support removal, though this may just be a squabble of semantics
a reschedule context is the scheduler's working set for one search operation
it's a temporary object that says, in effect that for this processor or this isolation unit, here are the CPUs involved, here is the ready queue association for each one, here is the current incumbent for each reschedule entry, and here is the place where a newly found winner will be stored
starting a reschedule conetext seeds each context entry with a CPU, an optional shared ready queue, and a CompareThread that is either NextThread or CurrentThreat
it also records per-entry state flags and the maximum currently observed isolation width
so, the search routine begins with a set of current "incumbents" that new candidates must beat
once the reschedule context exists, the scheduler begins the actual search, but before it enumerates anything, it locks every distinct shared ready queue referenced by the context
the search then proceeds in phases, one phase that scans ready priorities 1..31; one phase that scans SCB queues by choosing the best root SCB and then a priority within that SCB; and one final phase that scans priority 0 only
inside the ordinary non-SCB phase, a CPU can have the chosen priority represented in the local ready queue, in the shared ready queue, or in both
when only one domain has threads at that priority, the choice is trivial, and when both do, the scheduler consults "AffinitizedSelectionMask"
if the bit for the current priority is set, the enumerator examines the local ready queue first; if the bit is clear, it examines the shared ready queue first
as the enumerator yields concrete threads, each candidate must be compared against the incumbent stored in a reschedule context entry
this comparison is performed by a function called KiDoesThreadDominateRescheduleContextEntry, but if fair share scheduling is enabled, the function delegates to KiEvaluateGroupSchedulingPreemption
otherwise the rule is comparatively direct: a candidate dominates if the entry is marked as always replaceable, or if the candidate's priority is higher than the incumbent's priority, or if priorities are equal and the entry's flags or the caller's tie break request allow equal priority replacement, or if a special flag permits a non zero priority candidate to dominate
in other words, does this thread dominate the incumbent for this entry under the current flags
if CompareThread was seeded from NextThread (standby thread), then the scheduler is testing newly encountered candidates against a thread that has already won once
a standby thread is an already selected incumbent that later searches may still overturn if a stronger candidate appears before the commit finishes or before dispatch actually occurs
but not every ready thread encountered in the domain is immediately eligible for comparison
scheduling group constraints, core parking state, QoS, heterogeneity, and isolation width all affect whether a candidate is admissible and whether its win requires the whole context to be tightened and searched again
a candidate that wins is written into the entry's NewThread which a search result inside the context
the actual transition is performed only when the scheduler commits the reschedule context
in the commit step, the scheduler can keep the incumbent, choose a candidate, or use a special isolation thread as the committed thread for sibling entries in an isolated unit arrangement
in the end, the commit step installs NewThread into NextThread and places the thread into standby
qemu virtual cpu?? 
Yes
сome on, you've got me interested in seeing it for myself, but I'm not that good at virtual memory
I'm not sure about a simple average
I see the code repeatedly reads and writes the PFN bits at positions which match OldestWsleLeafEntries and OldestWsleLeafAge
and then queues the page table PFN into ActivePageTableLinks[j] for that same age j
when the count of oldest aged entries falls to zero, it calls MiRebuildPageTableAges
when a newly updated age exceeds the prior table age, it removes the PFN from the old queue and reinserts it into the newer one
so I tend to think that the queue key is based on the oldest age currently present in that leaf page table page plus a count of how many entries are at that age
I also took a look at the aging tread. MiComputeAgingNeed decides whether to age at all and fills a small control block with the age percent and trim age thresholds (I think)
MiAgeTargetedWorkingSet acquires the working set shared lock, calls MiAgeWorkingSet(..., 1, ...) for the aging pass but may also call MiAgeWorkingSet(.., 2, ...) again apparently when periodic accessed bit clearing is enabled
MiAgeWorkingSet seems to compute how many PTEs to visit as roughly: AgePerecnt / 1000 of (WorkingSetSiez - LockedEntries) and adjusted by LastAgingRemainder or LastAccessClearingRemainder
and it uses PteResumePoint[1] or [2] so the next pass can resume where the previous one stopped
inside the walk, MiAgePte is the per leaf callback function, it scans valid PTEs and handles some special cases like shadow reads and combined PTE demotion (what's that?)
and it either hands some addresses to per-CPU age/trim lists or calls MiAgePteWorker directly
the tail callback MiAgeWorkingSetTail then flushes deferred age buckets with MiFlushDeferredAgingBucket
there is alsoa per-age distribution over the working set as a whole, MiComputeAgingPercent uses _MMSUPPORT_INSTANCE::AgeDistribution[8] to choose how aggressively to age
not good at virtual memory , huh
The exact structure I was going to use was to pack two 4 bit counters (0-15) into each byte. Each counter tracks how many PTEs are valid in a range of 16. So a byte would track a range of 32, and 4 bytes would track a range of 128 PTEs. So this makes it super fast to skip over large invalid ranges since you can test a whole 4 byte set of counter bytes for being 0 in one comparison and if they are then boom don't have to look at any of those 128. Otherwise you can look more granularly inside that byte set until eventually you find the nonzero counter (maybe with binary search) and scan that linear range of 16 PTEs. It's also memory efficient, on 32 bit where there are 1024 PTEs you'd only need 1024/32=32 bytes for the bloom filter. On 64 bit where there are 512 PTEs you need 16 bytes
whats isolation unit?
a set of processors that the scheduler must treat as a single scheduling object during a reschedule search and commit
it's either one logical processor or all logical processors in a core
Thanks for this overview
I think I may have found a throttling mechanism for the next aging pass
the code accumulates elapsed aging time and aged pages; then, if the totals are nonzero, it sets MaximumPtesAgePerSecond = 10000000 / (AgingTime / AgedPages)
which is effectively a pages per second rate in 100 ns time units
MiComputeAgingPercent uses that field as a cap when deciding how aggressive the next pass may be
it reads MaximumPtesAgePerSecond, falls back to 5000000 if the value is zero, then starts with 75% of the measured rate
the capped work budget is then compared against the current age bucket totals, and the function returns an aging percentage in the range up to 1000
it's interesting to note that, for some reason, an AVL tree is used during working set walking and aging
yeah, the memory partition stores 2 AVL trees used during top level walking
there are 2 of them because the aging trhead waits on two different events, so there are 2 types of aging
normal aging and hard limit aging
i think @warm pine might be interested in some of the information above
sorry for ping if not
all those who remember that one unix edit using at&t archival footage
i thought NT should get a vaporwave edit so i just wasted like an hour on that
"SMP" was their "AI" back in the day imo
ive watched the presentation, they keep repeating that 
a hot new thing to have a computer with two processors at a time
:P
i dont even know the name of the song i used in that since it was an unlabeled part of a vaporwave mixtape on soundcloud
peak LSD music
unix
Steve Ballmer's fake Windows 1.0 promo
is windows 1.0 even a thing
well yea obviously
they had to start somewhere
i thought the first release was just called windows nt
ok tbh ik jackshit about windows history
@rare epoch would an NT hater make this.
maybe to mock NT 
seriously though I hope it's obvious I'm just kidding around, it looks like a really cool kernel and a custom language makes it 2x cooler
the cursed numa xrstation
does your kernel aim an eventual Win32 compatibility btw?
@twilit smelt another question - is your language open source
yes lol
I can't find it on GitHub
oh
ok working numa support is in mintia2, xremu, and the firmware
"xr/frame" can have up to 4 nodes, each with up to 4 processors and 64mb RAM
so fully loaded you can have 16 processors and 256mb RAM
thats legit super computer specs
is this some kind of imaginary system
holy shit you have a full documentation too
all you need is to realize this in an FPGA or something and then you can run your OS in baremetal
i can also just port the os to x86
or that
the last one i was working on already got an x86 port
are you planning doing Win32 support or anything like that?
this is it running on i386, xr17032, and fox32
on amd64 im planning for mintia2 to have linux compatibility
GNU/NT 
its not really an NT clone i just yoinked the ideas i liked from NT
on equal footing with any other ideas that i liked from any other kernels
it looks most like NT because i find NT's structure to be extremely pleasant
so the structure is a thing i yoinked
I think someone did that before but they didnt do an mmu and so mintia couldnt boot
it didnt have storage either it was just the boot rom prompt
tbf doing a MMU is rather hard, at least compared to many other components of a CPU
The xr17032 arch has a software refilled TLB so... shouldn't be that hard?!
like an x86 style MMU, yeah, I get how that would be hard, but a software-refilled TLB shouldn't be that much harder than the other parts of the CPU
iirc the status handling surrounding tlb refills is fairly complicated on xr17032
what's the striped bar at the bottom
Means in construction
why does x86 not have it
Does xrstation emulate stuff like IDE or maybe even PCI?
no it has its own devices
MMUs are really hard to make compared to the rest of the CPU IME
More generally the more complex memory subsystems you need for CPUs of that class is where my last attempt at a higher-powered CPU broke down.
not really a bus
just mmio devices scattered in random places
does this have a c compiler 
the system bus™
?
its a bit more structured than that..
yeah monkuous retargeted gcc and used it to port linux
How?
fair
i wondered if i can port my os to xrstation for the funny later, powerpc is stupid enough already but idk
"I ported Linux to my custom arch with a custom emulator"
"Fair"

i didnt do that! monkuous did that
fair
i feel like me saying "ok" instead wouldnt be that much better

the firmware (antecedent) constructs a tree like openfirmware iirc
open firmware tree is literally evil 
its not like hyperrealistic or anything but theres 'ebus' where the phys addr space is divided into 256mb "slots", 7 of which are mapped to 7 physical slots for expansion boards and the last one is mapped to integral devices on the 'motherboard'
isnt it just a device tree
sorta
Oh
it's the living version of one, it has methods in FCode
idk navigating it is painful sometimes, some devices are partially undocumented
or i couldnt find the docs

the framebuffer device address is supposedly physical but mapping it does nothing, i should probably map it in my actual OS
and the 'motherboard' itself has a bus called 'citron' which is an array of device registers mapped to various things (corresponds to the IO space of a toy CISC architecture i did a long time ago (~2017) and did a brain transplant on the emulator to replace it with the RISC ISA, which used MMIO, so the old IO space was made into an MMIO region)
fair
the old firmware did but the new firmware doesnt anymore
yeah, idk the mapping crap is an fcode thing in "mmu", at least on the power macintosh
it just builds a struct in low memory describing the devices in a more static and xrstation specific way
oh wait are yall talking about open firmware or does the xrstation firmware have fcode
the old firmware at one point had something that was a lot like fcode
it was like super overengineered beyond any use i had for it
i rewrote the firmware in jackal and the new firmware is quite simplified
when u boot aisix or mintia1 (which are OSes for the old firmware) the new firmware chainloads an image of the old firmware which then boots into the OS
also can you write C programs for the fartfirmware
since they rely on the old firmware heavily and i didnt want to change it
fair
yes
mk
i mean gcc compiles into XR binary, it should work hopefully 
fair
Lol
yeah idk i just got the idea of porting my os (which i should get it into actually existing on ANY architecture, my powerpc bootloader is taking way too long) to xrstation or whatever other weird architectures exist
firmware docs
slightly outdated as of last night bc some things were extended when the numa configurations were introduced
A4X
numa 
also is this arch 32 bit
yeah
based
woh even the fancy boot picker was stolen from the mac is present
this honestly gives me huge open firmware vibes idk
is the a3x partition table for like every OS that runs on this
yeah but an MBR partition table and a3x partition table can be present simultaneously in the same sector
the structures dont overlap
monkuous used that for his linux images

fair, i have to use apple's partition map though rn, so i just probably have to write a driver for the a3x table
does the client program just not get any callback functions like in ofw or whatever
it does
it does
oh
fair enough
does this have a custom fs too??
whatever the firmware uses to find and boot the OS idk
the firmware only knows how to read the partition tables
so you can use whatever filesystem you want
i do have a custom filesystem that i tend to use
fair
i wonder if i should write an hfs+ driver for my os just to be compatible with the mac, but thats a bit irrelevant
i think i need to check how the kernel actually gets loaded 
in mintia2 theres a fairly complicated bootloader (really more like a prekernel) but monkuous's linux bootloader is quite shrimple
it just has an ext2 driver
loads a kernel binary somewhere in memory
jumps into it
it builds a binary device tree in memory i think, for linux to consume
since linux likes having those i guess
fair
my bootloader uses firmware calls to get the kernel file that it loads into memory and pulls crap out of
which it kinda sucks since this firmware doesnt have firmware calls to get hard drive files 
Unfair
still nostalgic for LIMNstation
what's the graphics hardware in XR/station? like do you have graphics cards
what produces the graphics
8 bit palette indexed graphics
linear framebuffer
there is a "framebuffer card"
the palette is programmable with 256 entries of 24 bit RGB
nice
you make me feel bad for larping as an NT fanboy and trolling you 😭
this is the exact same thing I've worked on but never completed - a complete computer system with a DIY CPU, graphics output and OS
this motives me to get back to it
mine was considerably simpler though, with no MMU
my goal was to implement it as real hardware using off-the-shelf components
it was technically a 1-bit serial CPU, but working in 64-bit words
its ok i have thick skin from playing evil minecraft servers when i was younger
glad to hear, I genuinely thought it was obvious I wasn't serious (I mean who would seriously say "Everything about NT is good" and "anyone who hates NT has 0% NT knowledge"), if I knew it would be taken seriously I wouldn't have said anything like that
will when are you implementing xr/station on real hardware using logic gates
he needs to write his own HDL first
no more colors??? :(
just make a bad clone of verilog or something
it's not that complicated anyways
whatever, 3-3-2 RGB 
me when no true grays
im thinking of having my OS get a grayscale mode
why dont irl screens support RGBA
NeXT larp 
i want a transparent monitor
there are transparent TVs, if they could make it controllable it could exist
like imagine the monitor is very thin and doesnt really have a border
so it looks like the apps are just floating on air
how cool is that
sci fi shit
0b10010010 could be a true gray depending on how the hardware expands the fields
a lot of modern ones support a luminosity per pixel
my monitor is so old im pretty sure i changed the cap like 3 times now
i have no idea how it's still kicking
it's also the only monitor that actually lights up the room without straining my eyes
i couldnt use light mode without this
also i was thinking of how i was going to implement numa affinitization for page allocation
and i came up with a scheme where i have an array attached to each numa node that lists all the other nodes in order of increasing distance, but it sounded kind of stupid
so i looked at what linux does
linux does something WAY smarter. it have an array attached to each numa node that lists all the other nodes in order of increasing distance
i'm going to continue this in #lounge-1 if anyone's interested
i thought it was stupid because its O(n^2) in space complexity where n is number of nodes but if linux does it then its probably good
uuh why does space complexity matter here it's not like you have soo many nodes that it would actually make a difference
bc one day i want to run mintia on gigantic numa amd64 big iron
historically there have been numa machines with hundreds or thousands of nodes
if you have 1024 nodes thats like 8 mib if you store distance as int64
hmm yeah it is kinda a lot
oh wait youre not storing the distance
do the nodes have ids or something
or do you have pointers to node structures or whatever
the arrays will probably store 16 bit node IDs for space
0.5 gigs for 16384 nodes
i think it's a little too much
you can def beat linux here
there has never been a 16384 node numa machine
the largest ive ever heard of was like 2048 node SGI Origin
when i was little there was no war in iran and now there is
like
get with the times bro
anything could happen
this was in the 90s and the trend since then has been to have fewer numa nodes per system
and to instead do distributed computing over high speed network
like SGI Origin was a supercomputer arranged as a single computer in a massively complex NUMA configuration
modern supercomputers are arranged as hundreds or thousands of smaller computers (each of which may or may not be NUMA) which are connected over a network
this is more innately fault tolerant and it also scales better i think
so O(n^2) space complexity in number of numa nodes is probably fine
i have a question
why cant you just sort the nodes into a single array
and use indices into that like
because the array has to reflect increasing distance from a particular node
it's not like you can have A,B,C where C is somehow closer to A than B
i dont understand why this is
keep in mind the topology of a NUMA system is often 2 dimensional, 3 dimensional, or higher
thats an SGI origin diagram
use eucledian distance to sort?
euclidean distance from what?
the origin is the node youre on and are trying to allocate a page from
therefore there are as many origins as there are nodes
so you need an array per node
idk i feel like there has to be a way to store this in less than O(N^2)
these kinds of topologies are common for clusters (maybe not hypercubes per se though because they require too many wires)
also for scheduling affinitization ill probably be able to do something similar
thats a little more involved though
memory is easy because its just like
check my node. any pages? no? ok.
check next node. any pages? no? ok.
check next node. any pages? yes? grab one
its like a binary choice
scheduling is more difficult because you can just keep piling threads into a node
so you need to decide when its worth it to start searching for a lower load node to shove it onto
but for example El Capitan (top 500 leader rn) uses a dragonfly topology which is basically a clique of cliques
that is, you have groups of nodes that are fully connected
i dislike "mushy" choices like this where you just have to use best judgement and hand-tuned heuristics further tuned by whatever data u can collect at runtime
since they inevitably result in pathologies in the corner cases
its like trying to stomp a lump out of a rug
and then the groups themselves are also connected all-to-all (but not all nodes are connected to all nodes)
also my numa support seems to be more distributed than linux's... on linux u have to pointer chase through tables on the boot node a lot including whenever you free a page frame
my numa node lookup table is KE_NODE_SPACE_START + ((id) * KE_NODE_SPACE_SIZE)
they each get their own segment of kernel space in order to separate the page tables out, and the central per-node structure is at the base of the segment, which is not a thing linux seems to do
we both have in common the skill issue of the page struct array being centralized though
i try to map it with pages from the node but this fails if page frames from multiple different nodes lie within the same page frame of page structs
and in any case the upper levels of the page tables are always going to be on the boot node
fwiw on a real hw implementation, upper levels of kernel page tables are probably in L2 cache anyway
i know, its probably not a huge problem in practice or linux wouldnt be doing it like that
i was trying to split up absolutely everything though and i failed on like just a couple of little things which annoys me
does linux not try to map the struct pages with per-node memory?
it does
but it will also fail in this case
and the upper page table levels used to map it will always be on the boot node as well
yeah but that (= overlapping a page containing struct pages over multiple nodes) is only a small edge case overall
so you always risk hitting remote node memory when you touch a page struct for a local page
this could be "fixed" by making the page struct array be segregated per-node but this would require a less efficient indexing scheme
which could potentially be slower anyway
so all partitions operate on the global pfn db?
and each stores in some form range that can be used by this partition?
i figured it would end up being way slower in practice to try to locate the node-local parts of the page struct array inside the node-local segments of kernel space so i just made it central and global and linux seems to have made the same choice
it would work if you could get some kind of cool guarantee from the hardware that like the upper N bits of the PFN are the node ID
thatd allow super efficient indexing
but i dont think thats a portable assumption lol
in the absence of any clean scheme to compute the node ID directly from the PFN youd have to resort to a binary search over an array of PFN ranges or something
which would be fast but still much much slower than directly indexing
also for now ive failed to replicate the phys mem for the kernel text section and read-only data
which is just because the way things are linked currently, it ends up all fitting inside the same 4mb range mapped by the same page table
so you cant really get different mappings for those pages from different nodes because they share most of the upper level page tables
for now
i could fully replicate the upper level page tables that map the range in which kernel modules fall
and then do it
and i might do that
do you already have any specific plans on numa aware cpu scheduling ?
ill probably copy whatever ULE does
something ive barely been thinking at all about is per-node IO
modern numa configurations almost exclusively divide the nodes as groups of RAM and/or CPUs
with IO being shared
but that hasnt always been the case
per-node disk controllers and stuff have been a thing
they might still be im unsure
the vast majority of modern numa shares that kind of hardware though
the AViiON numa systems from the late 90s had per-node disk controllers that would negotiate to access a shared set of hard disks which they would dynamically divide between them
and change who was responsible for what disk based on demand
so if node 5 is accessing hard disk C that is currently being controlled by node 2's controller
a lot
it might decide to reassign hard disk C to node 5's controller so that it no longer has to go through node 2 to access it
this was called CLARiiON and it was the longest lived part of Data General after it got bought out because it was sick as hell
they were used into the early 2010s
im using the term "hard disk" loosely these were actually logical volumes
which could be comprised by several physical disks
i think linux scheduler domains are a better approach to this
striped and mirrored and so on
does ule support numa ?
yes
it changed a lot
it supports arbitrary topologies now p sure
unless im completely misremembering
explain 2 me
it's a bit debated as to whether or not ULE Or Linux has a better approach of load balancing on NUMA... Linux load balancing sometimes ends up having MORE than 1 thread per logical processor (leaving some logical processors with no threads) on NUMA systems if you have N threads and N logical processors
which means some CPUs have extra work, and some have none
due to load balancing heuristics
That is not correct
know about windows?
Large servers have NUMA affinity for PCIe busses
ok epic
it's quite simple, basically a "scheduler domain" is a group of CPUs that increases in size at different topology levels
a few examples of topology levels are
SMT
Node
Socket
Machine-wide
and the idea is that you traverse from the bottom going up to search for places to load balance
for example, you check your SMT sibling first, then your Node, then the socket, etc.
and as you go up, there are heuristics to say "How much more load must that other domain have for us to consider taking work from it" (e.g. the base for cross-node migration is a 25% discrepancy if i remember)
this is exactly what ULE does im pretty sure
copy cat
ya they call it cpu_group there
from local as possible to the node to the N
i was probably looking at smaller numa machines and over-extrapolated to the larger ones. i was under the impression ones large enough to warrant per-node IO wouldnt have much of an existence because at that scale people now tend to use multiple machines networked rather than a single numa machine
but i was wrog
you can tell me to rtfm but can you tell me about how that affinity works
are there multiple physical PCIe busses
per-node or maybe a smaller number
i think it doesn't have to be much slower than directly indexing in the common case (page is node-local), because you can check for that immediately with a single simple range check
you'd only have to fall back to binary search in the remote page case which is slow anyway because it's remote
thats true
i still think adding that branch and also grabbing the pointer to your own node (which is something like percpu()->node) would end up being slower since youd ultimately end up with a pretty high cache hit rate for the upper page table levels which are the real problem
im also lazy and dont want to try it
im getting sick of the numa stuff since its been occupying all of my meager hours i have to work on this for like 4 months now
once i add memory and scheduling affinitization (currently, its fully divided and you can't schedule on or allocate from a remote node) ill be done with it for now
future components like the IO subsystem (which i still somehow havent started) will be written ground up with NUMA in mind so it should be fairly easy
per-node IO databases is gonna be a thing
aside from config which i wont bother with
like device matching information for the iokit-like drivers im gonna have
since thats a driver init time thing and who cares
thatll just be global
some code exists in the IO and namespace subsystems but those are rough sketches which ill probably throw away in turn as i work on those components in earnest
how do you get current numa node isntead ?
per_cpu()->node
ah i was thinking you are doing something different
i like the 256 color tux
i feel like he could've still been given more colors though, unless the palette is just some static RGB 
i see you have a few manuals on github, when combined manuals 
"Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4"
this is such a good threat
nothing ruins technical sincerity more than... marketers...
these guys shilled robots and the scariest thing of all, symmetric multiprocessing onto us
they gotta be evil
are you referring to zonelists btw?
i just remembered u sent this message and i had a neuron activation
yeah
i thought of zonelists while thinking about how to do affinitized memory allocation and thought it sounded stupid so i went to see what linux does and it was doing zonelists
was gonna discard that idea as being obviously bad
oh well
since CPU groups/scheduling domains were kind of brought up, i figured I would bring up my idea of potentially making them more dynamic on heterogenous numa machines by representing the processor topology as a multidimensional space and using an r*tree to represent the groups (for my project)
for example, one dimension might be CPU frequencies, one might be numa distances, one might be LLC sharers
my thought was that as topology increases in complexity in non linear ways I can just add more dimensions to represent those extra dimensions of variance
I think this is probably egregiously ridiculous but it was a little idea I had
I remember reading something somewhere that used multidimensional spaces for heterogenous load balancing
AgeListWalkers?
actually it was already discovered here
#1322494605819908156 message
yes
well an "age list walker" seems clear enough, why you need an AVL tree of them i've got no idea yet
they could've done just [8] of them but they didn't
AgeListWalkers belongs to the top level enumeration of working sets, that is why it's stored in the partition aging control structure not in MMWSL_INSTANCE
when mintia age verification to comply with the Utah law enforcing age verification for all OSes in Utah??
ITS IN UTAH???
also nobody there probably can figure out how to emulate an XRstation properly so they dont even know if mintia has an account screen 
os level age verification is the dumbest shit ive ever heard of
computers dont fall out of the sky onto children's hands
just refuse
if youre not in the us, never mind californa, wha they gonna do, shake their finger at you?
and when youre prompted by windows, linux, whatever, just enter 120
im born in 1673
it seems that the scheduler took a lot of inspiration from the freebsd scheduler
is there any specific reason?
I expected to see something much more similar to NT, considering that the kernel structure is very similar
because freebsd is a good os 
ULE is nice because it's simple but works very well
It's like 10% the code of the Linux scheduler for 90% of benefits
time to uninstall linux and install arch freebsd 
that's probably a bit of an exaggeration
arch freebsd exists???
ULE was as good or a bit worse than CFS
nah i dont think so
awh
I know, and this study found a pretty important bug in freebsd, namely that the load balancer only runs once when the system starts up
it's quite surprising to me that this went unnoticed
pacman -S freebsd-kernel and hope you get linux binary compat 

apparently there used to be PacBSD which was arch but freebsd but its been discontinued
sucks
i feel like archlinux is just pacman and fastfetch images 
i think fastfetch images are in the binary itself
idk
Did they fix that bug in the study? idr
In my kernel I do exactly as freebsd for load balancing I think
Every second or so + a random jitter
yes, they did: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=223914
For the study I mean
yes, they actually ported ule to linux
the authors themselves admit that none of them became the best in all indicators
the mechanisms of my scheduler are NT's
the policy is FreeBSD's
you can tell im sophisticated rather than a hack fraud because i stole from TWO other projects rather than just one.
it's interesting that you inherit not only the priority, but also the interactivity class
it turned out to be not quite what I thought
what do you think about nts policies
or well idr why you didnt want to borrow them from nt
i just thought ULE seemed very efficient and nice
and knew whatever NT was doing was like 5x more complicated and probably not 5x better
like linux, they are probably trying to solve many more problems in their scheduler than freebsd
good programmers copy, great programmers steal
what about serenityos
its completely original
exactly
even better programmers NIH everything and make a shitty kernel with a pretty looking userspace
^
genuinely the serenityOS userpace is amazing tho
yeah it uses nih grpc
The frameworks sound nice to work with and the user apps are very cool
LibMain
how fair is windows scheduler actually
cutler cutler on the wall who is the fairest of them all
or the opposite 
NT
nt is a team though
so its different
windows __N__ot __T__oday
we love OS/2

To be fair they had compatibility restrictions
someone make an OS/2 like kernel where ring 1 and 2 are used :trel:
They had to run with old windows apps
the only problem with os2 was ibm
same with powerpc im afraid
EVIL paging™
thats only my second favorite win9x bug
my first favorite is su con
yup, except PowerPC found it's way into macs, and Xbox 360s
i made a 32-bit x86 OS that ran in ring 1 and used segmentation once
what was the experience
also the entire OS in ring 1???
it was fun honestly

yes
fair enough
Isn't it MLFQ at its essence
my first os was a 16 bit real mode os lol
Yes
im thinking of trying to make a 286 os except its even more impractical than a 386 os with segmentation
bought to life with the power of Ralph browns interrupt list
you cant even use C and nothing ever in the whole universe boots 286 pmode
sadly
idk gcc doesnt compile to 16 bit intel (especially pmode), i dont think clang or whatever will either
i wonder whats the i8/960 programming experience is like, its probably cursed to heck
risc 👍
you can probably find some ancient compiler to compile it for you if you really want to do it