[請益] user/kernel level

看板Soft_Job作者 (*〞︶〝*)時間11年前 (2014/10/07 21:51), 編輯推噓23(23032)
留言55則, 14人參與, 最新討論串1/2 (看更多)
各位前輩好 最近面試的時候 遇到一位面試官問了一個問題 類似這樣 "你這支程式是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

10/07 21:59, , 1F
OS, Firmware 屬於kernel, 其他歸user。
10/07 21:59, 1F

10/07 22:19, , 2F
請問判斷方式是看程式放在哪個memory space嗎?
10/07 22:19, 2F

10/07 23:13, , 3F
kernel:ring 0,高位址 user:ring 3,低位址
10/07 23:13, 3F

10/07 23:14, , 4F
韌體 OS driver是kernel
10/07 23:14, 4F

10/07 23:16, , 5F
一般的debugger只能看見user space
10/07 23:16, 5F

10/07 23:44, , 6F
不知道的一定是user lv, 寫kernel的不會問這問題了
10/07 23:44, 6F

10/08 00:20, , 7F
我說明一下困惑我的是什麼地方好了
10/08 00:20, 7F

10/08 00:20, , 8F
我之前寫的是library(xxx.so) 它會被燒成firmware
10/08 00:20, 8F

10/08 00:29, , 9F
xxx.so會被放到rootfs 開機的時候會被叫起來
10/08 00:29, 9F

10/08 00:33, , 10F
firmware這個稱呼現在已經不專屬於kernel了...
10/08 00:33, 10F

10/08 00:33, , 11F
現在很多嵌入式系統整包image都有人叫他是fw
10/08 00:33, 11F

10/08 00:35, , 12F
感覺xxx.so好像是kernel的東西 但是放在rootfs又可以給us
10/08 00:35, 12F

10/08 00:35, , 13F
er抽換掉 所以不清楚xxx.so定位是哪個level
10/08 00:35, 13F

10/08 01:02, , 14F
Google: User space memory access from the Linux kernel
10/08 01:02, 14F

10/08 01:37, , 15F
watz0n大大您好 IBM那篇 好像只有講paging, swapping機制
10/08 01:37, 15F

10/08 01:59, , 16F
不過看那篇的時候我想到so好像是透過dlopen開起來的
10/08 01:59, 16F

10/08 02:00, , 17F
然後我讀了這篇 http://ppt.cc/TG78
10/08 02:00, 17F

10/08 02:01, , 18F
看起來xxx.so應該就是user level的proccess嗎?
10/08 02:01, 18F

10/08 02:01, , 19F
因為dlopen會請kernel用mmap把so掛到virtual memory?
10/08 02:01, 19F

10/08 02:43, , 20F
rootfs裡都是userspace啊
10/08 02:43, 20F

10/08 02:43, , 21F
應該說除了kernel module之外…
10/08 02:43, 21F

10/08 02:45, , 22F
kernel 就是指你的uImage/zlmage
10/08 02:45, 22F

10/08 02:47, , 23F
一般virtual memory是1:3這樣切
10/08 02:47, 23F

10/08 02:51, , 24F
但整個linux不論什麼模式都會跑在virtual memory上
10/08 02:51, 24F

10/08 02:58, , 25F
bootloader會把kernel帶到記憶體上,然後自己解壓縮並初
10/08 02:58, 25F

10/08 02:59, , 26F
始化系統硬體之後開始執行userspace的第一個程式
10/08 02:59, 26F

10/08 03:03, , 27F
當然在執行之前會把 rootfs給掛載起來,
10/08 03:03, 27F

10/08 03:05, , 28F
這個程式會幫你跑inittab有的沒的東西
10/08 03:05, 28F

10/08 03:07, , 29F
inittab通常會跑一些rc的script幫你把userspace
10/08 03:07, 29F

10/08 03:08, , 30F
但服務常式叫起來,之後這些程式想要
10/08 03:08, 30F

10/08 03:09, , 31F
存取硬體資源就需要透過系統呼叫
10/08 03:09, 31F

10/08 03:10, , 32F
如open read write ioctl mmap等
10/08 03:10, 32F

10/08 03:11, , 33F
切回kernel space去處理,然後再把結果送回userspace
10/08 03:11, 33F

10/08 03:16, , 34F
基本上你userspace跑的記憶體位置會在userspace專屬的虛
10/08 03:16, 34F

10/08 03:18, , 35F
擬空間,核心跟核心模組則是跑在另外專屬的虛擬空間裡
10/08 03:18, 35F

10/08 03:20, , 36F
也就是所謂1:3的分法
10/08 03:20, 36F

10/08 03:24, , 37F
一個情境就是userspace想要開啟一個uart
10/08 03:24, 37F

10/08 03:26, , 38F
所以使用open系統呼叫切到核心,核心幫你處理好之後再返
10/08 03:26, 38F

10/08 03:27, , 39F
回fd給你,之後userspace使用read來讀資料
10/08 03:27, 39F

10/08 03:28, , 40F
此時再切到kernel,由kernel幫你處理硬體中斷
10/08 03:28, 40F

10/08 03:29, , 41F
以及幫您從uart硬體fifo讀資料回記憶體上
10/08 03:29, 41F

10/08 03:30, , 42F
再把這個資料複製給你userspace的指標
10/08 03:30, 42F

10/08 03:31, , 43F
並切回userspace,就可讀到資料~
10/08 03:31, 43F

10/08 06:05, , 44F
看你的程式是跑在kernel space還是user space啊
10/08 06:05, 44F

10/08 06:05, , 45F
跑在這兩者基本上要呼叫的API差蠻多的,
10/08 06:05, 45F

10/08 06:05, , 46F
這應該很好區分吧wwwwww
10/08 06:05, 46F

10/08 08:30, , 47F
感謝幾位大大的幫忙<(_ _)>
10/08 08:30, 47F

10/08 18:44, , 48F
感覺他在問user space/kernel space
10/08 18:44, 48F

10/08 20:23, , 49F
通常用的語言就會不同了 例如kernel用C/C++ user用java
10/08 20:23, 49F

10/08 20:25, , 50F
但還是有很多firmware不能算在kernel space
10/08 20:25, 50F

10/09 14:33, , 51F
Kernel panic V.S segmentation fault
10/09 14:33, 51F

10/09 16:44, , 52F
你的程式能直接存取kernel space 的資料,就kernel囉
10/09 16:44, 52F

10/09 17:39, , 53F
只有kernel才能跑ring 0指令
10/09 17:39, 53F

10/09 22:09, , 54F
askacis, good job!!....^^
10/09 22:09, 54F

11/07 22:26, , 55F
大推
11/07 22:26, 55F
文章代碼(AID): #1KC-_iHx (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1KC-_iHx (Soft_Job)