修改OS/Linux下的文件
This commit is contained in:
parent
8ea54e57c4
commit
2538c8f999
|
@ -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`:是整个内核的入口。
|
||||
|
|
@ -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可解决此问题。
|
||||
|
||||
#### 逻辑结构
|
||||
|
||||

|
||||
|
||||
##### 系统调用接口(SCI)
|
||||
|
||||
kernel:不依赖于体系结构的部分。
|
||||
|
||||
arch:依赖于体系结构的部分。
|
||||
|
||||
##### 进程管理(PM)
|
||||
|
||||
创建:fork, exec 或 POSIX
|
||||
|
||||
停止:kill, exit
|
||||
|
||||
通信或同步:signal或POSIX
|
||||
|
||||
kernel:不依赖于体系结构的部分。
|
||||
|
||||
arch:依赖于体系结构的部分。
|
||||
|
||||
##### 内存管理(MM)
|
||||
|
||||
slab分配器。
|
||||
|
||||
虚拟内存管理。
|
||||
|
||||
mm:内存管理的源代码。
|
||||
|
||||
##### 虚拟文件系统(VFS)
|
||||
|
||||

|
||||
|
||||
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进程
|
||||
|
||||
用户空间的第一个进程
|
||||
|
|
@ -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/)
|
||||
|
||||
### 逻辑结构
|
||||
|
||||

|
||||
|
||||
#### 系统调用接口(SCI)
|
||||
|
||||
|
||||
|
||||
#### 内核管理的核心代码
|
||||
|
||||
##### init:
|
||||
|
||||
##### kernel:
|
||||
|
||||
#### 进程管理(PM)
|
||||
|
||||
创建:fork, exec 或 POSIX
|
||||
|
||||
停止:kill, exit
|
||||
|
||||
通信或同步:signal或POSIX
|
||||
|
||||
#### 内存管理(MM)
|
||||
|
||||
slab分配器。
|
||||
|
||||
虚拟内存管理。
|
||||
|
||||
##### mm
|
||||
|
||||
内存管理的源代码。
|
||||
|
||||
#### 虚拟文件系统(VFS)
|
||||
|
||||

|
||||
|
||||
##### 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
|
||||
|
|
@ -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可解决此问题。
|
|
@ -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/
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
##### 追踪点
|
||||
|
|
Loading…
Reference in New Issue