程式是指儲存在外部儲存(如硬碟)的乙個可執行檔案, 而程序是指處於執行期間的程式, 程序包括**段(text section)
和資料段(data section)
, 除了**段和資料段外, 程序一般還包含開啟的檔案, 要處理的訊號和cpu上下文等等.
linux程序使用struct task_struct
來描述(include/linux/sched.h), 如下:
struct task_struct
linux把所有的程序使用雙向鍊錶連線起來, 如下圖(**):
linux核心為了加快獲取當前程序的的task_struct結構, 使用了乙個技巧, 就是把task_struct放置在核心棧的棧底, 這樣就可以通過esp暫存器
快速獲取到當前執行程序的task_struct結構. 如下圖:
取當前執行程序的task_struct**如下:
static inline struct task_struct * get_current(void)
程序描述符的state欄位用於儲存程序的當前狀態, 程序的狀態有以下幾種:
個鐘狀態間的轉換如下圖:
程序的建立
在linux系統中,程序的建立使用fork()系統呼叫,fork()呼叫會建立乙個與父程序一樣的子程序,唯一不同就是fork()的返回值,父程序返回的是子程序的程序id,而子程序返回的是0。
linux建立子程序時使用了寫時複製(copy on write)
,也就是建立子程序時使用的是父程序的記憶體空間,當子程序或者父程序修改資料時才會複製相應的記憶體頁。
當呼叫fork()系統呼叫時會陷入核心空間並且呼叫sys_fork()函式,sys_fork()函式會呼叫do_fork()函式,**如下(arch/i386/kernel/process.c):
asmlinkage int sys_fork(struct pt_regs regs)
do_fork()主要的工作是申請乙個程序描述符, 然後初始化程序描述符的各個字段, 包括呼叫 copy_files() 函式複製開啟的檔案, 呼叫 copy_sighand() 函式複製訊號處理函式, 呼叫 copy_mm() 函式複製程序虛擬記憶體空間, 呼叫 copy_namespace() 函式複製命名空間. **如下:
int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)
值得注意的是do_fork() 還呼叫了 copy_thread() 這個函式, copy_thread()這個函式主要用於設定程序的cpu執行上下文struct thread_struct
結構. **如下:
int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
unsigned long unused,
struct task_struct * p, struct pt_regs * regs)
do_fork() 函式最後呼叫 wake_up_process() 函式喚醒子程序, 讓子程序進入執行狀態.
linux核心有很多任務需要去做, 例如定時把緩衝中的資料刷到硬碟, 當記憶體不足的時候進行記憶體的**等, 這些工作都需要通過核心執行緒來完成. 核心執行緒與普通程序的主要區別就是: 核心執行緒沒有自己的虛擬空間結構(struct mm)
, 每次核心執行緒執行的時候都是借助當前執行程序的虛擬記憶體空間結構來執行, 因為核心執行緒只會執行在核心態, 而每個程序的核心態空間都是一樣的, 所以借助其他程序的虛擬記憶體空間結構來執行是完成可行的.
核心執行緒使用 kernel_thread() 函式來建立, **如下:
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
因為這個函式式使用嵌入彙編來實現的, 所以有點難懂, 不過主要過程就是通過呼叫_clone()函式
來建立乙個新的程序, 而建立程序是通過傳入clone_vm
標誌來指定程序借用其他程序的虛擬記憶體空間結構 磁碟中的esp分割槽與msr分割槽
一 esp即efi系統分割槽 1 全稱efi system partition,簡寫為esp。msr分割槽本身沒有做任何工作,是名副其實的保留分割槽。esp雖然是乙個fat16或fat32格式的物理分割槽,但是其分割槽標識是ef 十六進製制 而非常規的0e或0c。因此,該分割槽在 windows 作...
善用EFI系統分割槽ESP
efi系統分割槽,即 efi system partition,簡寫為 esp。esp 是乙個 fat16 或 fat32 格式的物理分割槽,但是其分割槽標識是 ef 十六進製制 而非常規的 0e 或 0c,因此,該分割槽在 windows 作業系統下一般是不可見的。支援 efi 模式的電腦需要從 ...
ESP分割槽和MSR分割槽下怎麼重做GHOST系統
先科普一下兩個分割槽 efi系統分割槽,即 efi system partition,簡寫為 esp。esp 是乙個 fat16 或 fat32 格式的物理分割槽,但是其分割槽標識是 ef 十六進製制 而非常規的 0e 或 0c,因此,該分割槽在 windows 作業系統下一般是不可見的。支援 ef...