標籤:
通過進程2載入shell進程,詳解execve,這篇文章,最後shell程式開始執行的線性地址是128MB,由於free_page_tables,已經釋放了第32位頁目錄項。所以會產生缺頁異常。程式會執行,如下代碼:
do_no_page
void do_no_page(unsigned long error_code,unsigned long address)//address為128MB{int nr[4];unsigned long tmp;unsigned long page;int block,i;address &= 0xfffff000;tmp = address - current->start_code;//tmp為0if (!current->executable || tmp >= current->end_data) {get_empty_page(address);return;}if (share_page(tmp))return;if (!(page = get_free_page()))//擷取一頁記憶體oom();/* remember that 1 block is used for header */block = 1 + tmp/BLOCK_SIZE;// /bin/sh的第1個節點是檔案頭,開始執行的代碼在第二個節點for (i=0 ; i<4 ; block++,i++)nr[i] = bmap(current->executable,block);//得到執行的代碼所在的塊號bread_page(page,current->executable->i_dev,nr);//把可執行檔代碼放到了page所指向的頁面中.....if (put_page(page,address))return;free_page(page);oom();
put_page我們已經講過了,在第32位頁目錄項指向一個頁表,在該頁表的第一項,指向了可執行代碼所在的頁面。由於是異常,程式返回後還會執行線性地址(cs:eip)為128MB(剛剛產生缺頁異常的地址)的程式,經過分頁機制,就映射到最終的物理地址開始執行自己的程式了。
通過開始執行shell進程,理解缺頁異常