看板 Soft_Job 關於我們 聯絡資訊
各位前輩好 最近面試的時候 遇到一位面試官問了一個問題 類似這樣 "你這支程式是user level還是kernel level?" 以前修OS大概還能區分這兩個名詞的差異 但是我發現我都沒去思考怎麼區分程式是屬於哪一個@@ 請問有什麼關係可以判斷程式是屬於user/kernel level呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.240.204.24 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1412689900.A.47B.html
Ting1024: OS, Firmware 屬於kernel, 其他歸user。 10/07 21:59
zelkova: 請問判斷方式是看程式放在哪個memory space嗎? 10/07 22:19
loveflames: kernel:ring 0,高位址 user:ring 3,低位址 10/07 23:13
loveflames: 韌體 OS driver是kernel 10/07 23:14
loveflames: 一般的debugger只能看見user space 10/07 23:16
hst326: 不知道的一定是user lv, 寫kernel的不會問這問題了 10/07 23:44
zelkova: 我說明一下困惑我的是什麼地方好了 10/08 00:20
zelkova: 我之前寫的是library(xxx.so) 它會被燒成firmware 10/08 00:20
zelkova: xxx.so會被放到rootfs 開機的時候會被叫起來 10/08 00:29
shortoneal: firmware這個稱呼現在已經不專屬於kernel了... 10/08 00:33
shortoneal: 現在很多嵌入式系統整包image都有人叫他是fw 10/08 00:33
zelkova: 感覺xxx.so好像是kernel的東西 但是放在rootfs又可以給us 10/08 00:35
zelkova: er抽換掉 所以不清楚xxx.so定位是哪個level 10/08 00:35
watz0n: Google: User space memory access from the Linux kernel 10/08 01:02
zelkova: watz0n大大您好 IBM那篇 好像只有講paging, swapping機制 10/08 01:37
zelkova: 不過看那篇的時候我想到so好像是透過dlopen開起來的 10/08 01:59
zelkova: 然後我讀了這篇 http://ppt.cc/TG78 10/08 02:00
zelkova: 看起來xxx.so應該就是user level的proccess嗎? 10/08 02:01
zelkova: 因為dlopen會請kernel用mmap把so掛到virtual memory? 10/08 02:01
askacis: rootfs裡都是userspace啊 10/08 02:43
askacis: 應該說除了kernel module之外… 10/08 02:43
askacis: kernel 就是指你的uImage/zlmage 10/08 02:45
askacis: 一般virtual memory是1:3這樣切 10/08 02:47
askacis: 但整個linux不論什麼模式都會跑在virtual memory上 10/08 02:51
askacis: bootloader會把kernel帶到記憶體上,然後自己解壓縮並初 10/08 02:58
askacis: 始化系統硬體之後開始執行userspace的第一個程式 10/08 02:59
askacis: 當然在執行之前會把 rootfs給掛載起來, 10/08 03:03
askacis: 這個程式會幫你跑inittab有的沒的東西 10/08 03:05
askacis: inittab通常會跑一些rc的script幫你把userspace 10/08 03:07
askacis: 但服務常式叫起來,之後這些程式想要 10/08 03:08
askacis: 存取硬體資源就需要透過系統呼叫 10/08 03:09
askacis: 如open read write ioctl mmap等 10/08 03:10
askacis: 切回kernel space去處理,然後再把結果送回userspace 10/08 03:11
askacis: 基本上你userspace跑的記憶體位置會在userspace專屬的虛 10/08 03:16
askacis: 擬空間,核心跟核心模組則是跑在另外專屬的虛擬空間裡 10/08 03:18
askacis: 也就是所謂1:3的分法 10/08 03:20
askacis: 一個情境就是userspace想要開啟一個uart 10/08 03:24
askacis: 所以使用open系統呼叫切到核心,核心幫你處理好之後再返 10/08 03:26
askacis: 回fd給你,之後userspace使用read來讀資料 10/08 03:27
askacis: 此時再切到kernel,由kernel幫你處理硬體中斷 10/08 03:28
askacis: 以及幫您從uart硬體fifo讀資料回記憶體上 10/08 03:29
askacis: 再把這個資料複製給你userspace的指標 10/08 03:30
askacis: 並切回userspace,就可讀到資料~ 10/08 03:31
RouterHsieh: 看你的程式是跑在kernel space還是user space啊 10/08 06:05
RouterHsieh: 跑在這兩者基本上要呼叫的API差蠻多的, 10/08 06:05
RouterHsieh: 這應該很好區分吧wwwwww 10/08 06:05
zelkova: 感謝幾位大大的幫忙<(_ _)> 10/08 08:30
KASUGAOSAKA: 感覺他在問user space/kernel space 10/08 18:44
usoko: 通常用的語言就會不同了 例如kernel用C/C++ user用java 10/08 20:23
usoko: 但還是有很多firmware不能算在kernel space 10/08 20:25
iamnumbea1: Kernel panic V.S segmentation fault 10/09 14:33
Lordaeron: 你的程式能直接存取kernel space 的資料,就kernel囉 10/09 16:44
loveflames: 只有kernel才能跑ring 0指令 10/09 17:39
PICASSO1: askacis, good job!!....^^ 10/09 22:09
roger00: 大推 11/07 22:26