1. Which stack does the bottom halves use for their execution ? Modern "bottom-half" implementations built on top of kernel threads use the stack of the underlying thread. (just like how any thread on the system does)
2. Why can't we sleep in bottom halves ? We can! Modern bottom half implementations can sleep i.e. relinquish CPU to other threads.
Q. What are Bottom Halves? Ans. A piece of code that is... a. scheduled/executed asynchronously from the triggering event (interrupt). (compared to the "top-half" i.e. the ISR that is executed synchronously) b. and usually can take significant amount of time. (compared to the time taken by the "top-half" i.e. ISR) Over the years, several implementations of the "Bottom Halves" concept have been developed on the Linux kernel. Co-incidentally, one of the oldest (now deprecated) implementation was itself called Bottom-Halves. There are several modern implementations of bottom-halves : Soft-IRQs, Tasklets, and Workqueues. The latter/recent approaches to implementing bottom-halves are wrappers around Linux kernel threads. I have tried to summarize these various "Bottom Half" implementations within the Linux kernel and provide some commentary of their development over the years in the following slide deck: https://thecodeartist.blogspot.com/2018/06/bottom-halves-on-linux.html For more details, checkout the various links to wikis and articles in the last slide "References / Recommended Reading" in the above slide-deck. regards CVS