I am reading Operating Systems book by Galvin. Galvin explains, what are kernel & user modes, instruction privileges given for both modes & also about mode-bit. But I am interested to know how mode changes from one to another. Basically I want to solve following question :

> A CPU has 2 modes, privileged and non-privileged. In order to change
> the mode from previledged to non-previledged
> 
> a) A hardware interrupt is needed
> 
> b) A software interrupt is needed.
> 
> c) A privileged instruction is needed.
> 
> d) A non-privileged instruction is need.

From what I understand, 

from user mode to kernel mode - Hardware Interrupt is needed [like in Disk I/O]. Now, in case user program tires to access an memory which is beyond its permissible range, a trap occurs, which is basically a software interrupt which will be handled by OS. Now, in user mode we cannot execute any privileged instructions. So, a non-privileged instruction such as I/O request can change user to kernel mode. So I think, to change

> from non-privileged(user) to privileged(kernel) - H/W Interrupt, S/W
> Interrupt & non-Privileged instruction will do.

Now coming to, kernel to user mode. The OS can change kernel to user mode. So, it will simply run a privileged instruction to change from kernel to user mode. It does not need to generate either H/w or S/w interrupt. So I conclude, to change 

> from previledged to non-previledged - a privileged instruction will
> do.

Am I right ? 

Also when executing in kernel mode, all interrupts will be disabled right ? So answer cannot be (a) or (b). Also, since OS is basically a software, it cannot generate H/W interrupts. 

Please let me know if I am wrong anywhere. Any help regarding this is appreciated.