<div dir="ltr">Hi Pranay,<div><br></div><div>Thanks a bunch for nice explanation.</div><div><br></div><div>Best Regards,</div><div>Krishna</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 27, 2014 at 10:34 PM, Pranay Srivastava <span dir="ltr">&lt;<a href="mailto:pranjas@gmail.com" target="_blank">pranjas@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Oct 27, 2014 at 8:08 PM, Er Krishna &lt;<a href="mailto:erkrishna@gmail.com">erkrishna@gmail.com</a>&gt; wrote:<br>
&gt; Hi Valdis,<br>
&gt;<br>
&gt; Many thanks for the mail and quick answers. Regarding the point 4 I know<br>
&gt; there won&#39;t be any page fault otherwise its going to be a complete mess for<br>
&gt; the kernel. But since I have the confusion due to wrong understanding and I<br>
&gt; want to clear my concepts I am putting my inline comments. Pls confirm and<br>
&gt; correct my understanding by doing inline reply. Sorry in advance if my<br>
&gt; question/understanding is wrong.<br>
&gt;<br>
&gt; On Mon, Oct 27, 2014 at 6:35 PM, &lt;<a href="mailto:Valdis.Kletnieks@vt.edu">Valdis.Kletnieks@vt.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Mon, 27 Oct 2014 18:15:15 +0530, Er Krishna said:<br>
&gt;&gt;<br>
&gt;&gt; &gt; 1. In case of Paging and discontiguous memory allocation for a<br>
&gt;&gt; &gt; particular<br>
&gt;&gt; &gt; process, is it possible that all the segments say DS, SS, CS, Heap and<br>
&gt;&gt; &gt; all<br>
&gt;&gt; &gt; can be in different page frames. I am asking this for a particular<br>
&gt;&gt; &gt; segment<br>
&gt;&gt; &gt; (I know all the segments can be in different non contiguous pages<br>
&gt;&gt; &gt; seperately, but what about one segment in different non contiguous page<br>
&gt;&gt; &gt; frames). For example lets say stack segment (or data segment) which is<br>
&gt;&gt; &gt; in<br>
&gt;&gt; &gt; RAM requires 45 pages and in RAM 45 pages are not contiguous avilable,<br>
&gt;&gt; &gt; so<br>
&gt;&gt; &gt; can it be reside from page frame no 100-125 and then again in 140-160  ?<br>
&gt;&gt;<br>
&gt;&gt; Yes.  In fact, it *probably* ends up in frames 97, 215, 112, 438, etc etc<br>
&gt;&gt; - the<br>
&gt;&gt; kernel doesn&#39;t try too hard to keep them contiguous unless something<br>
&gt;&gt; specifically<br>
&gt;&gt; requests contiguous allocation.<br>
&gt;&gt;<br>
&gt;&gt; &gt; 2. In case of execution of  fast interrupt handler when other interrupts<br>
&gt;&gt; &gt; are disable, if device controller generate interrupt then it will not<br>
&gt;&gt; &gt; reaches to CPU ? Is it loss of interrupts and not a good condition on<br>
&gt;&gt; &gt; system/driver ? Can we ignore it safely for our driver or we must not<br>
&gt;&gt; &gt; fall<br>
&gt;&gt; &gt; into this scenario ?<br>
&gt;&gt;<br>
&gt;&gt; In general, losing interrrupts isn&#39;t a good idea.  Whether it&#39;s acceptable<br>
&gt;&gt; for your driver or not will depend on your hardware, and basically depends<br>
&gt;&gt; on the answer to the question &quot;What does your hardware do if it requests<br>
&gt;&gt; an interrupt, and it decides it needs another interrupt before the first<br>
&gt;&gt; one has been serviced?&quot;  Some devices are stupid, and totally lose the<br>
&gt;&gt; plot if this happens - others are smarter and can either coalesce the<br>
&gt;&gt; interrupts or just ask again after then first one has been serviced.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt; 3. Inside kernel page fault should not happen, I was trying to<br>
&gt;&gt; &gt; understand<br>
&gt;&gt; &gt; it w.r.t copy from/to usr api. Say on usr address the particular page is<br>
&gt;&gt; &gt; not there and kernel wants to copy it in kernel address space? What will<br>
&gt;&gt; &gt; happen if we use memcpy rather than copy from usr, will the kernel crash<br>
&gt;&gt; &gt; due to page fault? how copy from usr prevents this? Is the page fault<br>
&gt;&gt; &gt; handler code always remains in RAM in case of  Linux Kernel ?<br>
&gt;&gt;<br>
&gt;&gt; Copy from user basically checks for the page&#39;s availability first, and<br>
&gt;&gt; requests<br>
&gt;&gt; a page in, and then waits for the page to arrive, to avoid the nasty mess<br>
&gt;&gt; of taking a page fault inside the kernel.<br>
&gt;&gt;<br>
&gt;&gt; &gt; 4. In case of read/write system call, a normal user program wants to<br>
&gt;&gt; &gt; acess<br>
&gt;&gt; &gt; some file or more specifically (direct or indirect block of particular<br>
&gt;&gt; &gt; inode). This user space process page table which is in RAM doesn&#39;t<br>
&gt;&gt; &gt; contain<br>
&gt;&gt; &gt; valid bit for particular pages which correspond to these blocks.<br>
&gt;<br>
&gt;<br>
&gt; I think this scenario will call for page fault and page fault handler should<br>
&gt; be invoked.<br>
&gt; I believe Page fault handler code will be inside the kernel and it will try<br>
&gt; to fill the page<br>
&gt; frame with  that particular file data say with the particular block.<br>
&gt;<br>
&gt; Eventually this page fault handler code will do below mentioned Vector i/o<br>
&gt; to put the<br>
&gt; blocks into page frame.Once done Page table will be updated with valid bit<br>
&gt; entry and<br>
&gt; then user process can acess the data.<br>
<br>
</div></div>Read/Write would be done into your user space buffer. Page cache pages<br>
are not part of your process (well not unless you mapped them and even<br>
then only for Reads when you try to modify it you get a copy which<br>
becomes part of your process address space) If this memory buffer or<br>
page which is specific to your process is not present then it must&#39;ve<br>
been swapped out. So to bring them back file system isn&#39;t involved.<br>
<span class=""><br>
&gt;<br>
&gt; In this whole scenario, this page fault is a kind of  user space page fault<br>
&gt; and not a kernel space<br>
&gt; page fault, but the page fault handler will execute its handler in kernel<br>
&gt; space.<br>
</span>No it&#39;s not a signal to your userspace process. When you access a<br>
memory area the fault is triggered by the processor whenever that<br>
memory area doesn&#39;t have a valid page table entry. The kernel handles<br>
this processor fault and finds out if the offending address is present<br>
in any of the vm_area_struct belonging to your process. If it finds<br>
any then it&#39;ll install the PTE either from swap or by allocating a new<br>
page (in case of acess after a brk) or if it belongs to a file then by<br>
calling the file system specific code to read in the page from disk.<br>
<br>
If the address isn&#39;t found you get SEGFAULT, if you&#39;ve installed a<br>
handler in user-space to handle that segfault then it would execute<br>
the user space handler otherwise the process dies. So regardless of<br>
having a user space handler or not the kernel&#39;s fault handler code<br>
does executes but how the PTE is installed depends on how the fault<br>
was triggered.<br>
<span class=""><br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; If these<br>
&gt;&gt; &gt; blocks are not in page-cache, it will be bring ito RAM by vector i/o<br>
&gt;&gt; &gt; with<br>
&gt;&gt; &gt; the help of bio-vec data structures. Will this scenario triggers the<br>
&gt;&gt; &gt; page<br>
&gt;&gt; &gt; fault inside kernel ?<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ll leave this one for you to figure out. It&#39;s not that hard. (Hint - in<br>
&gt;&gt; the<br>
&gt;&gt; code path you describe, why would any of those steps cause a page fault?)<br>
&gt;<br>
&gt;<br>
&gt; Normal block driver Scsi or Sata fetch the particular sector/Block from Disk<br>
&gt; with the help of disk controller r/w command and put that block into the<br>
&gt; page<br>
&gt; frame (with the help of Bio structure of request queue) from where CPU acess<br>
&gt; it.<br>
&gt; In this scenario there is no page fault happens.<br>
</span>What you described above happens in response to a page fault. The<br>
above is not the cause but the effect of one of the ways in which page<br>
fault got triggered. It may not even happen if the pages were already<br>
in Page cache and they are uptodate.<br>
<span class="">&gt;<br>
&gt; Can Cpu directly acess the data bypassing the page cache/RAM ?<br>
</span>What do you mean by this I don&#39;t understand. Page cache isn&#39;t for CPU,<br>
it&#39;s purpose is to improve performance. I don&#39;t get your question<br>
really.<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt;<br>
&gt; Best Regards,<br>
&gt; Krishna<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;<br>
<br>
<br>
<br>
--<br>
        ---P.K.S<br>
</div></div></blockquote></div><br></div>