cpu執行操作所需的信息直接來自哪里?
1、寫好一個程序,經過編譯、鏈接后會生成一個可執行文件,在linux平臺下是ELF(Executable Linkable Format)格式的,windows平臺下是PE(Portable Executable)格式的。
2、然后你執行這個可執行文件,這個可執行文件里面的代碼段、數據段和BSS段會被加載到PC或者某設備的內存中。代碼段里放的就是指令,所以內存里的指令是通過執行某可執行文件加載到內存里的。
3、CPU會從代碼段的起始地址,調用第一條指令,開始執行。如果沒有遇到跳轉指令就順序執行:假設代碼段起始地址是0x100,那么就是先執行0x100這個地址里的指令,然后再執行0x104、0x108地址里的指令。如果遇到跳轉指令,就跳轉到相應地址,取指令,繼續執行。如此往復,完成了整個程序的運行。
4、有些指令,比如add rD,rA,rB。需要去rA和rB寄存器里取值。rA和rB寄存器里的值來自哪里?來自內存里的數據段、BSS段或者棧里或者堆里。說白了,程序就是靠執行一條條執行運行起來的,而指令執行所需的數據放在數據段、BSS段、棧或者堆里。
5、數據加載到數據寄存器的過程:CPU先去數據cache里找這個數據,如果找到了就直接從數據cache加載到數據寄存器里,如果找不到的話就只能再去內存里找。然后就是cache把剛才找到的這個數據緩存起來。
6、另外,CPU讀數據的時候,cache的工作很簡單,就是緩存。如果是寫數據的話,cache就分為write though和wirte back兩種不同的工作方式了。此外,CPU發出的地址都是邏輯地址,必須經過MMU模塊把邏輯地址轉換為物理地址才能正確訪問內存。
7、注意,CPU執行指令的時候,也是從指令寄存器里取指令的,并不是直接跑到內存里去取指令,因為這樣太慢了。指令加載到指令寄存器的過程和加載數據是類似的。