#Zinnia
1 messages Β· Page 10 of 1
C++ does too, but you need a full compiler to decode it
why
Because it can get very very complex
With nested templates etc
Its easier to decode at compile time and feed that to your kernel

rust has that as part of the stdlib
or well, a component of it
you have to explicitly link it in
π
Does it do hidden allocations to demangle?
Maybe If it's a super complex symbol idk
nope
the demangle crate does not have a reference to alloc
it cannot make any allocations
Well that's nice
Nah you don't need a full compiler
It is somewhat annoying to decode because it allows back references but nothing that requires knowing about the actual type system etc
Yeah like u still can't just handroll it, its quite a lot of code
at least you don't want to do that, yeah
just do some macro and template magic to generate demangled names at compile time :^)
#define DEMANGLED(sym) \
[[gnu::section(".demangled")]] constinit const demangle_entry entry_##__COUNTER__ = {&sym, detail::make_demangled<sym>()};
template <auto V>
constexpr std::string_view detail::make_demangled() {
std::source_location loc = std::source_location::current();
return compiler_specific_extract_tpl_param_from(loc.function_name());
}
``` 
Is that actually a thing
wdym? yes you can stringify stuff you can feed into a template param via std::source_location
fun!
that's awesome
I mean tpl param
wtf bro
the function name would be in form detail::make_demangled() [with V = ...]
just extract the ...
there's also a __cxa_demangle function but idk which lib implements it / how hard it is to get it into the kernel
how does THIS navigate every single symbol to generate at compile time
you add it manually
Isn't that part of the c++ runtime
i think libsupc++ in gcc
or libstdc++ but i think it's the former
but why would you do that when you can do it at runtime
or... not because the itanium abi names are actually kinda readable
not like m*crosoft symbol names
i didn't find the actual definition with a quick grep so it's probably behind some alias or macro
i think the worst part about __cxa_demangle is that it mallocs the output string iirc
Lmao
not even operator new :^)
wtf just return the size if you fail to fill the provided buffer
Worse than rust
what does rust do?
The demangler interface is described in the source documentation linked to above. It is actually written in C, so you don't need to be writing C++ in order to demangle C++. (That also means we have to use crummy memory management facilities, so don't forget to free() the returned char array.)
Doesn't allocate
Idk how it works under the hood, see convo above
it just converts the symbol name during print
you give it a buffer to the mangled symbol and it impls Display
so whenever you print it, it gets demangled
ah
don't you need to invoke source_location::current as a template argument?
template<auto V, auto L=std::source_location::current()>
constexpr std::string_view make_demangled() { // ...
i don't think so
the call in the body is still dependent on the template param and will include it in the string
yeah i was too lazy to check the specific format of the string (and i think it differs between clang/gcc)
and msvc obviously
llvm-demangle isnt too heavy
it can do everything iirc
even rust demangling by the looks of it
all c++ demanglers I've seen allocate though
welp I use the llvm one in my kernel for panics (if available)
llvms ManglingParser takes an allocator as a template parameter, so you can give it a fixed buffer
it doesnt do nullptr checks though so you need exceptions for it to not crash on oom
good to know
I do have an entry in my todo list to not allocate during demangling
but my todo list is quite large and nothing is being done currently
why exactly is allocation a problem?
if rust uses Display to format in a non-allocating way, the actual output stream still needs some memory buffer to emit a contiguous line etc
itβs core::io::Write all the way through, no temporary buffers
normally, to prevent mangled logs, a lock is used on stdout
well yes but it'll go into a buffered writer at some point
otherwise, it'd do one syscall per char or similar which would obviously be worse than allocating
and if you want to store the output somewhere you obviously also need an allocation
what if the panic is caused by a memory allocation problem?
that's true, in that case it's better to preallocate
Display only operates on the stack and a static immutable buffer
that makes it really nice
allocation is used not only for the buffer (which can be easily bypassed) but during parsing as well
I guess I could have a fixed buffer and a separate allocator for it
I'm talking about llvm demangler
oh
@near tartan i found a way for native rust tls, but you are forced to use fs
fs?
fs segment register instead of gs
what abi?
you have to work around that, for interrupt handlers you would need to push fs do swap gs and move gs into fs
for syscall handler you would need to declare one register as a scratch register to store user fs in it
so how does one use the tls stuff then
libgcc iirc?
with #[thread_local]
also you need to pass tls-model=local-exec to rustc to ensure that it directly emitts fs relative accesses
maybe, the problem is the resolve tls address function for dynamic tls will break interrupt/syscall handlers, so you would have to make sure that llvm still emits fs relative accesses for those, for example by using a different tls model that uses the direct accesses for all modules that are known at compile/link time
then the tls sensitive code has to be in those modules only
eh
oh wait this is actually very useless
because then you can't access the data from other cores
my tls allows stuff like CpuData::get_from(4)
well you would need a helper function that swaps fs before the access
but also why do you need to access other threads thread local data?
load balancing?
like if you have local run queues you need to move tasks somehow, right?
those are on the heap? Then you could also store a reference to them in a global/core local struct
you can, you just can't do so with just a cpu id. taking a pointer and accessing from another cpu still works fine
they are owned by the runqueue
maybe not the best design
the runqueue stores an arc
swapgs then swap fs base using some gs-relative variables 
accessing cpu locals of other cpus in rust sounds like a lot of pain
since you can't hold refs to them unless they use interior mutability
wdym
this is already handled by the fact that local variables are static
so they have interior mutability by design
like, let foo : &u32 = get_other_cpus_u32(); is instant UB
well yeah but for thread locals you can use RefCells or similar
if you want to access the CPU local of other CPUs, you'd have to wrap them in Mutex or AtomicU32 or whatever
really?
what makes it ub?
the fact that the owning CPU could take a &mut to it
it could not
you can't have mutable references to a thread local variable in my code
or atomics
yeah
static mut is only allowed if the underlying type implements sync + send
this is what i ended up doing
my point is basically: with std rust thread_local's you can use single threaded data structures like RefCell but you can't do that if you allow access from other CPUs
so you get higher overhead
since you need to use thread-safe data structures even for CPU locals
i would use it if it didn't complicate dealing with fs and gs
you can patch llvm to use gs as the thread local register :^)
but yeah probably not a good idea
we briefly considered doing that in managarm
needing to compile llvm to build your kernel though 
we do that anyway
smh my head just be binary compatible with linux and cp it
just download binaries from a build server :^)
is this still on account of that gcc bug?
that would require actual infra 
it had some problem or other with coroutines that arsen told me about
coros in statement expressions still haven't been fixed no
some time ago i rebased our patches onto gcc 15 master when it was still unreleased to check and it still ICEd
it's hard to call this a bug because it makes use of a gcc extension
well clang supports it, and there is a comment on the bug report saying that the intention is to support it
plus at least it should print a nice error and not ICE in the frontend 
true
yeah it's not unreasonable to expect it to work
there should be no interaction between statement exprs and coroutines
there is a no-alloc (and otherwise freestanding) version floating around somewhere - libiberty iirc?
maybe I'm making shit up, one sec
I'm looking at __glibcxx_demangle_callback() in cp-demangle.c.
looks like it only really needs stddef, snprintf, some malloc/realloc/free (that was for my code
) and string.h functions.
I should clean this up and publish it, maybe that'd be easier lol
fym "jinx's llvm" π
just imagedep experimental:llvm if u want llvm 20
i think debian unstable is like llvm 19
that isnt old
whatever the debian thing uses
it was old at least
idk if it still is
but either way i use a patched llvm anyways
really
maybe not a million but still, i did tell you that at some point 
yes
@somber solar why what's the difference between instance::create and instance::mknod?
they do the same thing
because I don't actually have mknod 
they're supposed to set it up and stuff
I think
I don't really remember my thinking
bruh
ah I think it should use dev to get the appropriate ops for the file
from some sort of device registry
just store the ops per file
smh
but why do you need dev for that
dev is a value created from major and minor number combination
I don't think mknod should be implemented for each filesystem though, because it just calls create but with different ops
just code duplication
should file systems even interact with nodes?
i thought they only touch inodes
the vfs stuff doesn't need to be handled by a fs
that's why i don't get your abstraction
iiuc it should use backing
that's in my todo list now
uhh create inode should probably take type and mode as arguments?
other than that, it looks fine
i guess
ah true
yea it should
delete should also use INode instead of a shared ptr
because i assume delete will be called when no other references exist
hm
it can just fail if there are other references, no?
ideally
i have this
ah
that way i can force an invariant by just asking the caller to do that
if i don't then every implementing fs has to do this check
which is a bit meh
?
unless type is part of mode
well yes it generally is
do i bother writing a high level concept around mode_t
i already have FileType
i could make mode into bitflags
if your syscalls are going to take mode_t as an argument, you would need to translate it
i think that's fine
hmmm do you store children in vnode or inode
vnode
hmmmmm
then filesystem would need to access vnodes
for populate()
it's fineeeeeee
I should probably have sync for inodes as well
tbh idk what i was thinking with lookup
I think this is better
for fs instance
no more need for separate mknod
oops forgot to change link target
adds children to vnode
optionally you can supply name if you want to request only one child
so if they are never accessed, they don't take up memory unnecessarily
resolve calls that with needed path segment, if it can't find a child on first try
I don't like the name "backing"
resource or inode sounds better
tbf populate should return a list of backings with their respective names and I should have a separate function that adds those to vnode children
perfect 
how should I do it?
what is the purpose of populate()?
^
and why do you do that other than lookup?
that's just readdir lol
readdir (or e.g. getdents64, which readdir is based on) is usually implemented as a separate operation on the open file handle, not a vnode operation
what's wrong with this approach though?
it allocates everything all at once (at populate() time)
and this can be impractical for large directories
also it is just generally an uncomfortable interface
a function that allocates and returns a potentially very large array, in kernel space
^
is this sane
hard link vnode would just share inode with another vnode
there's no specific "best way" to do it, but typically filesystem drivers implement readdir/getdents64 themselves
why do you need this?
for vnodes
I'll just call it cache and now I'm a pro
despite having similar names, a hard link and a soft link are very different things
like, a hard link points to an actual inode, and a soft link only points to a node via a path, right?
soft link redirects vnode to another vnode
there is no such thing as a hard link
a "hard link" is a vnode which is referenced by multiple directory entries
so how should i do it
nlink
i get that part
is there a one-to-one between an Entry and an on-disk inode?
bruh
idk
Linux actually does a very nice thing here
yea dentry
and it is that the VFS deals mostly in struct dentry and the underlying fs deals mostly with struct inode (the "vnode")
why is inode the vnode
because linux
i thought inode was the inode abstraction
same thing
is your "vnode" (Entry) the same as the Linux "dentry"?
yes
so there is not much reason for the dentry to have a record about the mode of the inode it points to
so should it always point to an inode?
well, you can have a negative dentry
but generally you get the file type from the inode
negative equals not present
oh right symlinks are also inodes
i forgor
my old kernel did this on the vfs layer (dumb)
there's also gray/a dentry that hasn't been looked up (not in cache)
this is something which makes the "interface" between the VFS layer and the filesystem layer very nice in Linux
why can't I forward declare nested structs 
yes, I know
because it means you can allocate a dentry for a file, and then call inode->i_ops->lookup(inode, dentry); and lookup will populate that dentry for you.
can there be a dentry that points to nothing?
this is why in Linux, the VFS deals "mostly" with struct dentry and the filesystem "mostly" with struct inode
as in?
ohhh
and caching ENOENT can give performance boosts e.g. with shell exec, because it does lookup on all the possible PATHs it can find an executable in.
i see
cache ALL THE THINGS
good idea
basically, except maybe not named like that
I'd do Positive, Negative, Unknown, with entries defaulting to Unknown until they have been looked up
C++29 π
just one more revision
yeah, it is very bad because it is easily mixed up with other filesystemish uses of "link"
what's a synonym
connect :P
i couldn't think of anything better
node is bad imo
because that might also be confusing
Entry::inode
eh fair enough
optimisation: if your tmpfs leverages the capabilities of your VFS cache to store its hierarchy, you can leave i_ops->lookup NULL and if you see this when creating a dentry, initialize it to negative instead.
I can't wait to actually use this mostly untested vfs and have to redesign everything
it's somewhat tested, basic file lookup and stuff works (I load modules from initramfs)
yea, can not quite do null, but an empty impl should be fine
i can return enosup
yeah if you cannot leave it NULL because you are using a skill-issued language, obviously this is fine:
errno_t
tmpfs_lookup(inode *, dentry *e)
{
dentry_make_negative(e):
return ENOENT;
}
and that default trait looks like this
yeah just errno lookup(inode, dentry) is how Linux does it, I'm relatively sure
@distant cypress could you glance over my code and tell me if I'm doing anything that stands out as obviously wrong? (other than populate being meh)
tomorrow I can take a closer look
(if you remind me sometime during the day)
thanks for the pointers
if I remember myself :P
here's one more u64*
I should write some notes about filesystems and VFS design and make them available somewhere (although that'd be a slightly more longterm thing to do)
slowly but surely I am on the path of becoming a forum boomer 
why does linux return a dentry pointer π
because linux
does it just return the input?
actually the reason is some NFS stuff iirc; AFAIK everything else just returns the input dentry or a negative errno
because with NFS there's some condition where there can be multiple struct dentry for one path or something, and that is fixed by keeping a list per inode of dentries that point to it and returning one of those
real
yeah, if you already have a errno lookup(inode, dentry), changing it to a dentry_or_errno lookup(inode, dentry) shouldn't be that big of a deal.
ping
@near tartan how's the vfs going
512
I see u decided to go with air
Damn, what did that cost you
Wtf
Dammn
How big of a PSU does this thing need
my gpu is like 50 π
Ah
it's done!
Can I mine bitcoin-
what's the point of the third pcie slot being open at the end if the nearby nvme slot would be blocking any cards with larger connectors?
Smooth brained PCB
does it boot
how long does the memory test take
or just post in general
damn
only 480G of ram 
perfect machine to run gentoo
is that both cpus or just one
Maybe implement PCI kernel api so we can see the number of ops at least
which acpi tables do you want?
yes
and how bad it is due to no numa awareness
nightly builds
last build: 3 days ago
yes there have been no commits since
dead project
and we only do full rebuilds every sunday at 1am, other times it's triggered by commits
hmmm
Now try pmos
ts pmos
ts ts
oh definitely
good aml
vbios doesn't seem to work though
i cant get efi gop from a gpu
lol this board has an NMI button
hm you could try pressing it in managarm :^)
hmmmmm
idk why managarm doesn't run on any of my machines
when running correctly all the cpus that got the nmi should print some stuff
@somber solar your thing also hangs
where?
oh it works
that's the most it does
I should really initialise cores in parallel lol
is it supposed to die there?
I want to do uvm before anything else
and I'm avoiding working on it, so nothing gets done
That's probably the first uACPI test on server hw
nah
it's the first one that you see
i've ran menix before on dual xeon thinkcentres
also worked
Damn
I just noticed, so much pci
hmm it prints that it's configuring the irq but not that it has allocated slot 0 for the irq
also is it just me or does the framebuffer seem slow
it's not accelerated
uacpi-info: successfully loaded 1 AML blob, 585 ops in 0ms (avg 4486127/s)
thor: Configuring IRQ io-apic.0:9 to trigger mode: 2, polarity: 1
thor: Allocating IRQ slot 0 to io-apic.0:9
i'm curious why it says disabled for so many lapics
you should see my intel pc
THAT is slow
That's probably correct
Just reserved entries in apic
Bios just fills them in
what's the context of >256 lapics
1 per core
okay
more liek one per logical core
idk how you would handle all of them tho
still
yea but how do you address them
maybe via multiple ioapics?
address them like what
ah
in which case would you fail to address a lapic with id > 255?
or rather
when is that a problem?
for >255 apics you need to use x2apic iirc
when you wanna have more than 255 irqs
you either share vectors or route to different cpus
hmm it getting stuck before printing the last line here would imply that some other core is holding globalIrqSlotsLock and not letting go
if x2apic is supported, you should use it anyway, so there's no problem
yeah you wanna route to a cpu that's best suited to handle the interrupt
and if you use xapic you can't use some cpus
simple
yeah, x2 apic is not really hard to support
it is even simpler to use
than normal lapic
both are lapic
so it's safe to assume the x2apic is present if i have that many logical cores
ye
yes
you dont have to assume
because i don't have an x2apic on this machine 
you can check
some machines it's might even be enabled by default
yes, but it's safe to assume that x2apic is supported :P
can you even disable it?
no
bios
bios can?
once it's enabled you can't disable it
it's a cpu feature, maybe the firmware has some way to mess with it to disable it
but i doubt any board actually lets you
that's dumb
but probably very rare
my asrock am5 board lets you
crazy? I was crazy once
what
yea
or is the am5 server?
am5 is consumer
oh ok
common amd L
are u fr
bc intel doesn't have that either
shit lake
coming in summer 2026 !!!
(no bios)
at least it'll have 52 cores
Hmmm
This system has more than 256 gsis, we may not support that
CC @eternal wharf
ah hmmm
I wonder if it overflows the gsi vector
kernel/thor/arch/x86/pic.cpp
730:void setupIoApic(int apic_id, int gsi_base, PhysicalAddr address) {
741: globalSystemIrqs[gsi_base + i] = pin;
this smells bad
globalSystemIrqs is sized to be 256 entries long
i wonder if we write past the end of it and end up corrupting the globalIrqSlotsLock object
is globalSystemIrqs a static array?
yes
not enabled by default
technically it doesn't make sense for it to be an array, because there might be hardware with IOAPIC 0 on GSI0...23 and IOAPIC 1 on GSI1337420...1337499
although this is very unlikely
yeah i think this assumption doesn't make sense
I may have done that because I assumed that all IRQs should be routable to a single CPU but that's not really a reasonable assumption
this is a struct irq_pin_or_whatever * array?
yeah this maps ACPI GSI numbers to our IRQ struct
yeah so just a map<uint32_t, IRQ *> or something would probably work
true
or it can be optimised by grouping together GSIs that belong to the same IOAPIC or are otherwise contiguous
that's not necessary, this is not on a hot path
yeah
it's only used during configuration, not during IRQ handling
we should also move this from x86 specific to acpi code (such that we can enable acpi on aarch64 and riscv64)
who wants to do the work? :^)
in 99% of cases this would probably result in a single entry with all the GSIs because they are most likely contiguous
well, this system apparently has 9 I/O APICs
and they are probably assigned to GSIs 0-23 24-47 48-63 etc.
it's 280 since all but the first i/o apic have 32 pins according to the log
if no one does it before this weekend I can try to setup a managarm dev env on my machine and do this
oh, even more then
cool
i tought ioapics only had 24 pins
you read it from IOAPIC_VER iirc
what do you even need 280 GSIs for now that there's MSI?
i read them like this
it's crazy i have no idea what this is about
need to learn
in the meanwhile i figured out the dead ram stick
gg
512 gigs now
im installing opensuse and then we test an llvm compile
the idle temps are actually insanely good
33C according to btop
which is perfect for my homelab
actually
ill finish vfs stuff
then i can look into smp
when i have smp i should also look into initgraphs
instead of throwing every init function in the same init array
oh god initgraphs in rust
not fun
idek how to start doing that
initgraphs?
what @somber solar and managarm use for init
look at managarm
ah ok
initialization is done using a graph
which is fucking cool tbh
instead of good ol init_a(); init_b(); init_c();
it's not fun at all to do in rust btw
i tried
maybe i am retarded but i could not get it done lol
of course not without allocating
or unsafe
Hm
maybe by preallocating the steps?
yeah it probably needs unsafe
that makes no sense
to emulate [[constructor]]
in rust the issue is the backlink from node to engine
that's a cyclic reference
i was basically tying to rewrite managarm initgraph tho
Cyclic &'static refs are fine though
that sounds like pain
it is lmao
i cant do 'static though
unless i have a global instance of the engine
again, idk what the proper terminology is or what that means exactly
just using managarm initgraph terms
that's what Managarm does though
oh really?
i must have been blind then
it makes sense tbh
and i was definitely blind
it's passed through the constructor
so it has to be global
it should be possible and relatively easy to parse the source code for initgraph declarations and emit calls to them using an external tool, no?
why though
in C++ you could also use a non-global one but doing that in Rust would add a lot of complexity
so no allocations + check acyclicity at compile-time
managarm doesn't allocate either
if i wanted to do this in Rust I'd probably write a macro that emits whatever unsafe code you need to put a ctor into .init_array
for each init graph task
such that it can register itself with the engine
yea i dont think i can get around a macro
why would you need non static lifetimes?
i thought all graph nodes are a comptime element
i think a macro is nice either way, so you can do stuff like menix::init_stage!("x86:discover-lapic", || { // ... });
or just a function as the 2nd arg works too
oh ya i like this
by string would be braindead
maybe identifier?
i think so yes
proc macro to turn the string into a ref to the stage object
π€’
then you could just mark a function as init stage
menix::init_stage!("x86:discover-lapic", &[memmap_ready], lapic_ready, || /*...*/);
something like this?
that's not how that works
wdym
or you could make it work like that
interesting
Rust-Based Redox OS Begins Implements X11 Support, GTK3 Port
shit
i need to hurry up
need to be the first rust os
first rust os to have a gui
rust kernel*
when i mount a FS, should that mount on a dentry or an inode π€
dentry imo
you mount a filesystem on a path
the mountpoint is a path
you can have e.g. the following:
- fs1 mounted on /media/a and /media/b
- fs2 mounted on /media/a/foo
a lookup in /media/b/foo will not resolve to a path within fs2
(and the path consists of parent mount and dentry)
Huh what about Aero?
i fiorgot
Rust has the petgraph crate for graph structures
tbh i prefer writing my own
Though why x11
Why wouldn't they opt to implement the wayland protocol (I've not read the article yet)
Yeah
And they are implementing x11 inside their window server
So why not implement wayland instead?
wait wat
they have their own window server?
X11 support has begun to be implemented within the Oribtal display server so that X11 apps will be able to work gracefully on Redox without display-related changes.
Read the article
i missed that
wtf
Which is why I had the doubt why not implement wayland instead?
Menix should run Weston /s
Though isn't there a wayland compositor for bsds that doesn't on drm and epoll?
eventfd is easy
I signalfd should be easy with a reasonable implementation of signals
I don't recall correctly but it was portable
I forgot what else it needs
Ok so signals as well
Probably I'll do that after networking
does redox not already have a gui?
it's a joke reference
yes
ah
@vast lotus following #x86 , so are IRQs always known beforehand and the controller maps the handler internally?
you mean the index parameter in open? that's pretty much just an opaque value whose meaning is IRQ controller dependent
on a pic controller it'd be the pin number which is known at compile time for most devices
on a PCI controller it'd be A/B/C/D which you get from the PCI header
etc
neat
then i think i understand it
my open should probably return an Arc<Interrupt> which gets dropped if the device handling it is dropped
duh
Some programs use the fd pulled from wayland for that
did they respond to you on xitter
No but Tristan did
damn
Ok, I understand that, but it was just strange that I could assign it to a variable and then it worked. In my mind, the same type would be assigned to the variable and to the expression. The same type solutions should still exist. -corey
this is the stupidest issue i've come across so far
fixed by doing this
if i'm creating an inode, which has no idea of its own name, how does a filesystem record its file name?
you pass the name during creation
filesystem can store that name if it wants to
hm
you link the inode into a directory at a later time :^)
what later time
on sync()?
i mean you have a separate link operation that links it in
both for the initial link and extra hard links
ah I misunderstood
oh so when i do e.g. mknod i first run create_inode and then link_inode
and link_inode gets passed the name?
what's the point of that?
well inode has no idea what its name is
idk if that's right
and inodes also have no reference to a dentry
yes so that's why you pass the name during creation
link() has no idea of vnode/dentry either
because it works on inodes
im confused
i mean idk what your idea is but in managarm you first create a unowned inode that you then link into a particular directory
This is because using an arc with the explicit type does not use the trait vtable, only has struct pointer under the hood
rust
i'm just confused
confuzzled
ilobilix :P
BadgerOS also has working tmpfs with sym- and hardlink support too
well i can't really use yours because your vfs design is a bit different to mine
everyone's design is different
yes but iirc you always connect a vnode to an inode
yes
@eternal wharf where in managarm would i find tmpfs?
posix-subsystem
why is that?
ig ontologically the inode is separate from the dirent
it is, but what use is there for inode that doesn't do anything?
but ig usually when you're creating something, you want to link it immediately anyway
BadgerOS basically just says inode management is the filesystem's problem

All it does is make sure the same one will not be opened more than once at a time
(from the FS driver perspective)
exactly
the vfs doesn't concern itself with inode management
https://github.com/badgeteam/BadgerOS/blob/main/kernel/src/filesystem/fs_ramfs.c if you're interested in my impl
It's a bit wacky with the dirents though
managarm doesn't have much of a distinction between inodes and vnodes since stuff is done via inheritance in posix-subsystem
inode == vnode
really?
Doesn't vnode just refer to the in memory representation of an inode?
It can be slightly more than that but that's what I was pretty sure it is
name?
yes
That's a "link" in Managarm's language and on linux it's called a dentry
the in memory representation of an inode is what i call INode
technically inode is on-disk and vnode is in-memory
Not sure what the bsd term is but somebody else will probably know
but using linux terms it's inode and dentry
Namecache entry IIRC?
ah true
This many OSDV's is a beautiful sight
there are incore inodes too
it's not?
@near tartan Redox implemented Unix sockets partially
What tool did you use for that?
probably graphviz
could it perhaps be possible to find symbols by literally parsing the executable from the filesystem and looking for the symbol at an address because I think it would be really funny to do that for panic traces once I have a working filesystem driver for iso9660
i mean yeah but why not use the executable image that's already in memory for that
you can just tell the linker to put the symbol table in an allocated section
understandable, I will attempt both for the meme tho
realistically the biggest issue (other than that there's a far more practical and easier solution) with the filesystem approach is that you want your panic code to be as simple as possible so you don't get recursive panics
alrighty ππ
