Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why some kernel actions cannot be written in C

Tags:

c

assembly

kernel

I apologize if this should sound trivial and unsubtle but I couldn't figure out an intuitive way to google it, Why are some kernel actions like saving the current state of the registers and the stack(just to mention a few) written in Assembly? Why can't they be written in C because after all, presumably, when compilation is done, all we get is object code? Besides when you use ollydbg, you notice that before a function call(in C), the current state of the register is pushed to the stack

like image 453
Clinton Kavai Avatar asked Mar 09 '23 14:03

Clinton Kavai


1 Answers

When writing an OS the main goal is to maintain the highest abstraction to make the code reusable on different architectures, but at the end inevitably there is the architecture.

Each machine performs the very low level functions in such a specialized way that no general programming language can sustain.

Task switching, bus control, device interrupt handling, just to name few, cannot be coded efficiently using an high level language (consider instruction sequences, involved registers, and eventual critical CPU timings and priority levels).

On the other hand, it is not even convenient to use mixed programming, i.e. inline assembler, because the crafted module will be no more abstract, containing specific architecture code that can't be reused.

The common solution is to write all code following the highest abstraction level, reducing to a few modules the specialized code. These routines, fully written in assembly, are normally well defined in terms of supplied input and expected output, so the programmer can produce same results on different architectures.

Compiling for different CPU is then done by simply switching the set of assembly routines.

like image 121
Frankie_C Avatar answered Mar 11 '23 03:03

Frankie_C