操作系統(tǒng)上的程序 (什么是程序和編譯器) [南京大學2022操作系統(tǒng)-P2]

文章鏈接:https://cpt1024.blog.csdn.net/article/details/127704221
P2操作系統(tǒng)上的程序
補ppt ppt
tmux 快捷鍵操作
https://www.jianshu.com/p/01a18efe2552
數(shù)字邏輯電路:模擬器
#define REGS_FOREACH(_)?_(X) _(Y)
#define RUN_LOGIC????X1 = !X && Y; \
?????????????Y1 = !X && !Y;
#define DEFINE(X)????static int X, X##1;
#define UPDATE(X)????X = X##1;
#define PRINT(X)?????printf(#X " = %d; ", X);
int main() {
?REGS_FOREACH(DEFINE);
?while (1) { // clock
??RUN_LOGIC;
??REGS_FOREACH(PRINT);
??REGS_FOREACH(UPDATE);
??putchar('\n'); sleep(1);
?}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
狀態(tài)機和數(shù)碼管實現(xiàn)
看文檔
gcc a.out | python3 seven-seg.py
http://jyywiki.cn/OS/2022/slides/2.slides#/2/2
py代碼 接受每一個輸入 然后顯示
通過 || 將c程序的輸出作為py程序的輸入
程序
程序 == 狀態(tài)機
gdb a.out 進入調(diào)試狀態(tài)
layout src 進入 用 c的方式
layout asm 用匯編的形式進入
start 運行 s 下一步 info frame 查看棧幀
C語言視角
C 程序的狀態(tài)機模型 (語義,semantics)
狀態(tài) = 堆 + 棧
初始狀態(tài) = main 的第一條語句
遷移 = 執(zhí)行一條簡單語句
任何 C 程序都可以改寫成 “非復合語句” 的 C 代碼
函數(shù)調(diào)用 : 創(chuàng)建棧幀 pc ++
函數(shù)返回 消除棧幀
本質(zhì)仍然是計算
二進制程序
構造最小的 Hello, World
int main() {
?printf("Hello, World\n");
}
1
2
3
gcc 編譯出來的文件不滿足 “最小” --verbose 可以查看所有編譯選項 (真不少)
printf 變成了 puts@plt -static 會復制 libc
匯編實現(xiàn) :http://jyywiki.cn/pages/OS/2022/demos/minimal.S
最小的 HolloWorld程序
程序== 狀態(tài)機 == 二進制代碼 = 狀態(tài)機
如果想讓程序退出 就必須得有一段系統(tǒng)調(diào)用 syscall
補充知識點
retq 的行為 : pop 棧頂內(nèi)容彈出給到PC
棧是由寄存器 rsp控制的
編譯器與編譯優(yōu)化
什么是正確的編譯?
編譯的優(yōu)化 : 沒有對狀態(tài)機狀態(tài)進行修改f的語句能刪
C代碼 -> 匯編代碼
c編譯器 code = compile(S) S; 源代碼
void foo() {
?int x = 1;
}?
1
2
3
compiler barrier 將可以合并的代碼劃分開了
操作系統(tǒng)的一般程序
補
總結