修改OS/Linux下的文件

This commit is contained in:
shzhxh 2019-01-31 19:01:37 +08:00
parent 8ea54e57c4
commit 2538c8f999
6 changed files with 173 additions and 131 deletions

View File

@ -1,38 +0,0 @@
### arch/riscv
##### kernel/setup.c
`setup_arch`:被外部的`start_kernel`(init/main.c)调用。设置内存与多处理器。
##### kernel/traps.c
`trap_init`:被外部的`start_kernel`init/main.c)调用。被内部的`smp_callin`(kernel/smpboot.c)调用。设置sscratch为0,告诉异常处理程序我们在内核中;为 stvec指定异常处理程序`handle_exception`(kernel/entry.S); 设置sie寄存器为-1使能所有的中断。
##### kernel/smpboot.c
`setup_smp`:被setup_arch调用。设置多处理器。
##### kernel/entry.S
`__switch_to`:通过被`switch_to`(asm/switch_to.h)封装的形式被外部的`context_switch` (kernel/sched/core.c)调用。
`SAVE_ALL`:宏,在进入系统调用或异常前将所有的寄存器保存在栈里。
`RESTORE_ALL`:宏,在从系统调用或异常返回前将栈中的值再保存到寄存器里。
`handle_exception`:入口,异常处理程序。
`ret_form_fork`入口从fork返回。
`ret_from_kernel_thread`:入口,从内核线程中返回。
`__fstate_save`:入口,文件状态保存。
`__fstate_restore`:入口,文件状态重新保存。
`excep_vect_table`:入口,异常向量表。
##### kernel/head.S
`_start`:是整个内核的入口。

View File

@ -1,111 +1,47 @@
#### 获取帮助
1. Documentation目录admin-guide/README.rst是基本的说明。00-INDEX说明了每个文件的内容。process/changes.rst说明了更新和编译内核的要求更新内核时碰到的问题。
2. [Linux内核交互图](http://makelinux.net/kernel_map/)
3. [Linux内核剖析](https://www.ibm.com/developerworks/cn/linux/l-linux-kernel/)
#### 编译内核
##### 编译过程
sudo make mrproper //清除中间文件和配置文件
sudo make menuconfig
sudo make //生成vmlinux内核文件双核CPU可用-j4参数提高编译速度
sudo make modules //编译可加载模块
sudo make modules_install //将模块安装到标准模块目录中,位于/lib/modules中
sudo make install //安装内核,即将镜像文件和符号表文件放入/boot目录
##### 引导内核
update-grub //更新启动菜单
在/etc/default/grub中确保GRUB_TIMEOUT非0
在/etc/grub.d/30_os-prober中确保timeout值与GRUB_TIMEOUT的值一致
##### 问题记录
1. make menuconfig产生了一个fatal error,提示找不到curses.h安装libncurses5-dev和libncursesw5-dev可解决此问题。
#### 逻辑结构
![logical structure](_img/struct-logic.jpg)
##### 系统调用接口(SCI)
kernel:不依赖于体系结构的部分。
arch:依赖于体系结构的部分。
##### 进程管理(PM)
创建fork, exec 或 POSIX
停止kill, exit
通信或同步signal或POSIX
kernel:不依赖于体系结构的部分。
arch:依赖于体系结构的部分。
##### 内存管理(MM)
slab分配器。
虚拟内存管理。
mm内存管理的源代码。
##### 虚拟文件系统(VFS)
![vfs](_img/vfs.jpg)
fs:文件系统的代码。
##### 网络堆栈
net:网络源代码。
##### 设备驱动(DD)
drivers:设备驱动程序的代码。
##### 依赖体系结构的代码
arch目录
#### 文件结构
#### 运行过程
##### step1: ROM
#### step1: ROM
BIOS
##### step2: bootloader
#### step2: bootloader
- first stage
##### 2.1 first stage
MBR
MBR
- second stage
##### 2.2 second stage
加载内核和initial RAM disk (initrd)。initrd是内存中的临时根文件系统可以使内核不必挂载任何物理磁盘而完全启动。内核启动完成后会卸载掉initrd而挂载上真正的根文件系统。
加载内核和initial RAM disk (initrd)。initrd是内存中的临时根文件系统可以使内核不必挂载任何物理磁盘而完全启动。内核启动完成后会卸载掉initrd而挂载上真正的根文件系统。
##### step3: Linux
#### step3: Linux
##### 3.1 _start
`_start`是整个内核的入口(对于rsicv来说)在arch/riscv/kernel/head.S。进行基本的硬件设置。
##### 3.2 start_kernel
`start_kernel`是整个内核的主函数在init/mian.c。初始化中断、内存最后运行init函数(用户空间的第一个进程)。
- set_task_stack_end_magic(&init_task)函数定义在kernel/fork.c它会找到栈的边界然后在边界上设置溢出标志`STACK_END_MAGIC`。
- smp_setup_processor_id()函数定义在init/main.c是个空函数。weak属性用于避免全局符号重名引发的重定义错误。当普通全局符号可用时忽略弱符号但普通全局符号不可用时链接器则使用弱符号。当有多个CPU的时候它就返回在启动的时候的那个CPU的id。
- debug_objects_early_init()函数定义在include/linux/debugobjects.h用于内核的对象调试。如果定义了`CONFIG_DEBUG_OBJECTS`则使用lib/debugobjects.c下的实现否则它是一个空函数。它的具体实现是初始化了obj_hash、obj_static_pool这两个全局变量以在调试的时候使用。
- boot_init_stack_canary()尽快设置最初的canary。
-
- cgroup_init_early()初始化cgroup所需要的参数。受参数`CONFIG_CGROUPS`控制如果没有定义则为空函数如果有定义则在kernel/cgroup/cgroup.c。
- local_irq_disable()关闭当前CPU的所有中断中断要在系统初始化结束后再打开。
###### 在开启中断前,进行必要的设置
- boot_cpu_init()在kernel/cpu.c用于激活第一个处理器。
- page_address_init()在当前定义为空,即定义了参数`WANT_PAGE_VIRTUAL`。但如果定义了`HASHED_PAGE_VIRTUAL`则在文件mm/highmem.c中。
- pr_notice()
- setup_arch(&command_line)用于内存映像的初始化参数command_line来自于bootloader。
###### 设置初始的canary和entropy
- add_latent_entropy()
- add_device_randomness()
- boot_init_stack_canary()
- mm_init_cpumask(&init_mm)定义在include/linux/mm_types.h初始化init_mm。
- setup_command_line(command_line)定义在init/main.c中保存command_line以备将来使用。
- setup_nr_cpu_ids()设置变量nr_cpu_ids。
@ -181,13 +117,13 @@ BIOS
- ftrace_init功能跟踪调试机制初始化初始化内核跟踪模块。ftrace的作用是帮助开发人员了解Linux内核的运行时行为以便于进行故障调试或者性能分析。
- rest_init内核的其余初始化工作。这个函数的作用是避免主线程和init线程之间的竞争防止主线程还没进行到`cpu_idle`的时候`start_kernel`就被`free_initmem`给释放掉了。
`rest_init`
##### 3.3 rest_init
`kernel_init`
##### 3.4 kernel_init
`run_init_process`
##### 3.5 run_init_process
##### step4: init进程
#### step4: init进程
用户空间的第一个进程

106
OS/Linux/源码分析.md Normal file
View File

@ -0,0 +1,106 @@
#### 获取帮助
1. Documentation目录admin-guide/README.rst是基本的说明。00-INDEX说明了每个文件的内容。process/changes.rst说明了更新和编译内核的要求更新内核时碰到的问题。
2. [Linux内核交互图](http://makelinux.net/kernel_map/)
3. [Linux内核剖析](https://www.ibm.com/developerworks/cn/linux/l-linux-kernel/)
### 逻辑结构
![logical structure](_img/struct-logic.jpg)
#### 系统调用接口(SCI)
#### 内核管理的核心代码
##### init:
##### kernel:
#### 进程管理(PM)
创建fork, exec 或 POSIX
停止kill, exit
通信或同步signal或POSIX
#### 内存管理(MM)
slab分配器。
虚拟内存管理。
##### mm
内存管理的源代码。
#### 虚拟文件系统(VFS)
![vfs](_img/vfs.jpg)
##### fs
文件系统的代码。
#### 网络协议栈
##### net
网络协议源代码。
#### 设备驱动(DD)
##### drivers
设备驱动程序的代码。
#### 依赖体系结构的代码
arch目录存放与体系结构相关的代码。每个子目录对应具体的CPU每个子目录下又有三个子目录boot(系统引导) mm(存储管理) kernel(系统调用)。
##### arch/riscv
- kernel/setup.c
`setup_arch`:被外部的`start_kernel`(init/main.c)调用。设置内存与多处理器。
- kernel/traps.c
`trap_init`:被外部的`start_kernel`init/main.c)调用。被内部的`smp_callin`(kernel/smpboot.c)调用。设置sscratch为0,告诉异常处理程序我们在内核中;为 stvec指定异常处理程序`handle_exception`(kernel/entry.S); 设置sie寄存器为-1使能所有的中断。
- kernel/smpboot.c
`setup_smp`:被setup_arch调用。设置多处理器。
- kernel/entry.S
`__switch_to`:通过被`switch_to`(asm/switch_to.h)封装的形式被外部的`context_switch` (kernel/sched/core.c)调用。
`SAVE_ALL`:宏,在进入系统调用或异常前将所有的寄存器保存在栈里。
`RESTORE_ALL`:宏,在从系统调用或异常返回前将栈中的值再保存到寄存器里。
`handle_exception`:入口,异常处理程序。
`ret_form_fork`入口从fork返回。
`ret_from_kernel_thread`:入口,从内核线程中返回。
`__fstate_save`:入口,文件状态保存。
`__fstate_restore`:入口,文件状态重新保存。
`excep_vect_table`:入口,异常向量表。
- kernel/head.S
`_start`:是整个内核的入口。
#### 内核的库代码
##### include
##### lib

22
OS/Linux/编译过程.md Normal file
View File

@ -0,0 +1,22 @@
##### 编译过程
```
sudo make mrproper //清除中间文件和配置文件
sudo make menuconfig
sudo make //生成vmlinux内核文件双核CPU可用-j4参数提高编译速度
sudo make modules //编译可加载模块
sudo make modules_install //将模块安装到标准模块目录中,位于/lib/modules中
sudo make install //安装内核,即将镜像文件和符号表文件放入/boot目录
```
##### 引导内核
```
update-grub //更新启动菜单
在/etc/default/grub中确保GRUB_TIMEOUT非0
在/etc/grub.d/30_os-prober中确保timeout值与GRUB_TIMEOUT的值一致
```
##### 问题记录
1. make menuconfig产生了一个fatal error,提示找不到curses.h安装libncurses5-dev和libncursesw5-dev可解决此问题。

View File

@ -45,6 +45,8 @@ git clone https://github.com/riscv/riscv-pk
cd linux
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv defconfig
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig
# Kernel hacking -> Compile-time checks and compiler options -> Compile the kernel with debug info 加入这个选项后可以用gdb调试kernel
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv -j8
cd ../riscv-pk/

View File

@ -64,6 +64,8 @@ watch
display # 程序停止的时候打印出表达式的值
print # 打印出表达式的值
set
set riscv # risc-v专有命令
set riscv use_compressed_breakpoints # 设置是否使用压缩的断点
undisplay # 程序停止的时候不再打印出某些表达式的值
x /FMT ADDRESS # 查看内存,ADDRESS是所要查看内存的表达式
# FMT的格式是nfu
@ -86,6 +88,13 @@ list # 列出指定的函数或命令
维护命令
```
flushregs
maintenance
```
##### obscure
obscure特性
@ -125,8 +134,13 @@ info # 显示各类信息
支持工具
```
help
quit
!
add-auto-load-scripts-path
add-auto-load-scripts-directory
alias # 为已有命令取别名
apropos # 查找满足REGEXP的命令
help # 打印出命令的帮助信息
quit # 退出gdb
```
##### 追踪点