[Autogenerated] This brings us to the end of this module.
We've looked at thread stacks, every threat must have a stack.
This is where local variables are stored.
This is how parameters are passed to functions if there are more
parameters than can be passed in registers.
This is where return addresses are being stored.
And we've seen that every threat at least a usable threat has a
kernel stack and user stack so this is necessary.
kernel stack always exists and it is in Iran in most of
the time and definitely it's in Iran,
it must be in Iran while the threat is in the ready or running state.
And we've seen that the kernel stack is fairly small.
In fact there are specialized functions to extend it,
but they're not often used in user space.
We have much easier way in terms of specifying stack sizes,
they can be specified in the P with some default and we can change at least
to some extent stack size on a thread by thread basis.
In the next module we'll start looking at code,
will code some threats and see how they can be used in
practice when writing applications