-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathos_note
29 lines (19 loc) · 2.52 KB
/
os_note
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1. how to use different functions of paging in the linux
https://www.kernel.org/doc/gorman/html/understand/understand006.html
2. The memory of kernel, as opposed to the one used by applications, is never swapped.
3. 宏内核比微内核优秀的一个点:
宏内核的新加载的module和内核中本来就存在的部分是一样的,都是通过共享内存以及锁的方式相互传递信息,而微内核需要通过消息传递的方式互相交换信息
4. 插入一个新模块通过insmod命令,lsmod可以查看所有加载的模块,rmmod可以移除一个模块
比起insmod和rmmod,modprobe用得更多,直接用modprobe就是插入模块,modprobe -r则是删除模块
5. modinfo 可以查看一个模块的相关信息
6. 内核一级页表放在0xc0004000~0xc0008000,其中low memory区域的映射一直会保持,这部分不需要同步,因为不会变
需要同步只是vmalloc,kmap,kmap_atomic三个区域
用一个场景来说明:
1),
进程A ioremap映射了一个设备,内核对这个映射关系使用的是二级页表,一级页表项只是指向这个二级页表的一个索引,一般只需耗费二级页表中一个项就能够映射这个设备。
要注意这里写的一级页表项不是进程A的,而是写的内核主页表(0xc0004000),所以进程A去读写这个设备时会发生会发生段错误,
然后进入异常处理流程,最后会在函数do_translation_fault中去处理,在这个函数中就会填充进程A的相应一级页表项(直接从内核主页表中拷贝相应的entry过来),然后异常返回去重新执行引发异常的那条指令(就是读写设备的那条指令)。
2),进程B也要访问这个设备,他也去用上述ioremap的返回值,也会发生段错误,处理流程和1一样
假如将来iounmap,内核仅仅是将二级页表项设置为无效,即使这个二级页表中所有的项都设置无效了,也不会去释放这个二级页表,也就是说内核主页表将会一直指向这个二级页表。
然后如果进程B想继续访问这个设备,这个进程B通过自己的一级页表项找到了二级页表,但是二级页表中的内容已经被清零了,所以此时又发生段错误,那么这次在函数do_translation_fault处理时,就会真正报错了,内核会crash。
将来如果又要映射一个别的设备,那么可以直接使用上面说的二级页表,就无需去分配新的内存来作为二级页表了,所以二级页表即使不释放也不会浪费多少内存。