You seem to be referring to this tutorial on OSDev.org.
If you’ll notice, this is not a standard C program with main()
as its entry point. In fact, the page shows two entry points: one written in Assembler in a way for GRUB to find & load, and which sets up & loads the second, kmain()
, which is written in C. The writers use the name kmain
to mean “kernel main”; presumably dmain
is the entry point for drivers & would stand for “driver main”.
C makes a distinction between “freestanding” and “hosted” implementations. Hosted is what you’re probably more familiar with; the standard C library is available, and all programs start at the main
function.
OS kernels are (often) good examples of freestanding environments. The C library will likely not be available, for example (except for certain headers like stddef.h
& stdarg.h
; see the standard for details). Also, the entry point is not defined by the standard anymore. The OSDev.org tutorial is making a special point of that fact, by explicitly defining its entry point with a different name.
You could probably run the tutorial renaming kmain
to main
, but note that it’s still void main(void*, unsigned int)
, not int main(int, char**)
; in fact that sort of confusion is likely part of the reason the writers chose to use a different name. But is is just a convention they’ve selected, not anything standardized.