作業系統--錯題集

Jan___發表於2020-10-09
1、作業系統採用緩衝技術,通過減少對CPU的()次數,提高資源的利用率
中斷

引入緩衝的主要原因包括:

  • 緩和CPU與I/O裝置間速度不匹配的矛盾;
  • 減少對CPU的中斷頻率,放寬對中斷時間的限制;
  • 提高CPU和I/O裝置之間的並行性。

所以採用緩衝技術,可減少對CPU的中斷次數,從而提高系統效率。

2、ls會引起哪些系統呼叫

execve、open、read…

使用strace ls命令我們可以檢視ls命令使用到的系統呼叫

jw@pc:~/w$ strace ls .
execve("/bin/ls", ["ls", "."], 0x7ffd4c677808 /* 63 vars */) = 0
brk(NULL)                               = 0x55e5088c7000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=74466, ...}) = 0
mmap(NULL, 74466, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc619ef9000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=154832, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef7000
mmap(NULL, 2259152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619abd000
mprotect(0x7fc619ae2000, 2093056, PROT_NONE) = 0
mmap(0x7fc619ce1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7fc619ce1000
mmap(0x7fc619ce3000, 6352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ce3000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc6196cc000
mprotect(0x7fc6198b3000, 2097152, PROT_NONE) = 0
mmap(0x7fc619ab3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7fc619ab3000
mmap(0x7fc619ab9000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ab9000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=464824, ...}) = 0
mmap(NULL, 2560264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc61945a000
mprotect(0x7fc6194ca000, 2097152, PROT_NONE) = 0
mmap(0x7fc6196ca000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7fc6196ca000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619256000
mprotect(0x7fc619259000, 2093056, PROT_NONE) = 0
mmap(0x7fc619458000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fc619458000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=144976, ...}) = 0
mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619037000
mprotect(0x7fc619051000, 2093056, PROT_NONE) = 0
mmap(0x7fc619250000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7fc619250000
mmap(0x7fc619252000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619252000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef5000
arch_prctl(ARCH_SET_FS, 0x7fc619ef6040) = 0
mprotect(0x7fc619ab3000, 16384, PROT_READ) = 0
mprotect(0x7fc619250000, 4096, PROT_READ) = 0
mprotect(0x7fc619458000, 4096, PROT_READ) = 0
mprotect(0x7fc6196ca000, 4096, PROT_READ) = 0
mprotect(0x7fc619ce1000, 4096, PROT_READ) = 0
mprotect(0x55e50876c000, 8192, PROT_READ) = 0
mprotect(0x7fc619f0c000, 4096, PROT_READ) = 0
munmap(0x7fc619ef9000, 74466)           = 0
set_tid_address(0x7fc619ef6310)         = 8782
set_robust_list(0x7fc619ef6320, 24)     = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7fc61903ccb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7fc61903cd50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffe7cb6d170) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffe7cb6d170)      = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0x55e5088c7000
brk(0x55e5088e8000)                     = 0x55e5088e8000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 369
read(3, "", 1024)                       = 0
close(3)                                = 0
access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=10281936, ...}) = 0
mmap(NULL, 10281936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc618668000
close(3)                                = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=28, ws_col=79, ws_xpixel=0, ws_ypixel=0}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents(3, /* 3 entries */, 32768)     = 80
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "ls.txt\n", 7ls.txt
)                 = 7
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++


3、程式是如何執行的?
fork -- exec--...

例如:在shell命令列執行ps命令,實際上是shell程式呼叫fork複製一個新的子程式,在利用exec系統呼叫將新產生的子程式完全替換成ps程式。

fork是一個UNIX術語,當fork一個程式(一個執行中的程式)時,基本上是複製了它,並且fork後的兩個程式都從當前執行點繼續執行,並且每個程式都有自己的記憶體副本。

原程式是父程式,新程式是子程式。可以通過fork()返回值區分。

父程式中fork呼叫返回的是新的子程式的pid(process id),而子程式中fork呼叫返回的是0

我們都要知道,linux系統的第一個使用者程式是init,pid=1,後續的程式,都是從init程式fork出來的。

4、簡述嵌入式系統的定義、應用和特點?

答:嵌入式系統定義:以應用為中心,以計算機技術為基礎,其軟硬體可裁剪配置,對功能、可靠性、成本、體積、功耗有嚴格約束的一種專用計算機系統。
嵌入式系統應用:應用於軍事裝置、資訊終端、汽車電子、製造工業、航天航空等領域。
嵌入式系統特點:專用性、可裁性、實時性好、可靠性高、功耗低。

5、bootloader經過哪些過程?

BL0----------------------> BL1 -->BL2-------> Linux kernel --> file system --> application
系統啟動RomBoot --> SPL --> u-boot --> Linux kernel --> file system --> start application
bootloader的啟動過程:
第一階段:
   ① 設定CPU工作模式svc特權模式
   ② 關閉MMU和cache
   ③ 關看門狗
   ④ 遮蔽中斷(防止程式跑飛)
   ⑤ 初始化時鐘
   ⑥ 初始化RAM,為第二階段做準備(非必須,例如對於NOR Flash可以直接在上面執行)
   ⑦ 設定棧,第二階段是C程式
   ⑧ 拷貝第二階段到RAM
   ⑨ 跳轉到第二階段的程式入口
第二階段:
   ① 硬體初始化,時鐘、串列埠、網路卡、LED燈…
   ② 檢測系統記憶體對映(memory map)
   ③ 將核心映像和根檔案系統映像從Flash上讀到RAM空間中。
   ④ 為核心設定啟動引數。
   ⑤ 拷貝dtb(裝置樹)到RAM空間中。
   ⑥ 啟動核心
   
Cache和MMU的設定
MMU和Cache必須必須關閉,指令Cache可以開啟也可以關閉。
由於MMU在上電之初是沒有任何作用的,也就是說U-boo第一階段的彙編程式碼以及第二階段的原始碼初始化相關外設時訪問的都是都是實際地址,MMU起不到任何作用,為了啟動之初不影響對程式的啟動常關閉MMU。

Cache是位於RAM和CPU內部暫存器之間的一個儲存設施,用來加速二者之間的資料傳輸速度,即用來加快CPU從記憶體中取出指令的速度。但是在上電後CPU的初始化要比記憶體RAM更快一步,當CPU初始化完成後,若記憶體還沒有準備好那勢必會造成異常。

7、uboot怎麼傳參給核心的?

簡單的講,uboot利用函式指標及傳參規範,它將
R0: 0x0
R1: 機器號
R2: 引數地址
三個引數傳遞給核心。
其中,R2暫存器傳遞的是一個指標,這個指標指向一個TAG區域。

8、如果系統的umask設定為244,建立一個新檔案後,它的許可權:()

–w-r–r--
-r-xr–r--
-r—w–w-
-r-x-wx-wx
umask是從許可權中“拿走”相應的位,且檔案建立時不能賦予執行許可權.
建立時,檔案 預設666,目錄預設777,減去umask的位就是結果。
666-244=422(-r—w–w-)

9、下列選項中,會導致使用者程式從使用者態切換到核心的操作是?

I. 整數除以零
II. sin( )函式呼叫
III. read系統呼叫

使用者態切換到核心態的 3 種方式
a. 系統呼叫
b. 異常
c. 外圍裝置的中斷

所以答案是:
I. 異常
III. 系統呼叫

10、C語言中, 32768 是不正確的 int 型別常數。請問這句話的說法是正確的嗎?

錯誤

考察C語言中int型別的常數的範圍。

  • ①int的取值範圍依賴於計算機系統:

在16位機器中,int佔16位,是兩個位元組,取值範圍為前面所說的-32768~32767(-216~216-1)。此時題中表述是正確的。
在32位和64位機器中,int佔32位,即4個位元組長度,取值範圍為-2147483648~2147483647(-232~232-1)。此時題中表述是錯誤的。

  • ②int的取值範圍也和語言標準有關:

ISO/ANSI C規定,int型別的最小範圍為-32768到32767。因此int型別常數的範圍不限於-32768到32767,可以得到題中表述是錯誤的。
C++官網中給出的C99標準中的巨集定義,int型別的範圍為-32767到32767。

相關文章