Linux实验总结:
运行mykernel
环境:ubuntu 18.04,实测21.04的默认GCC版本编译完无法生成bzImage
步骤
wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
xz -d linux-5.4.34.tar.xz
tar -xvf linux-5.4.34.tar
cd linux-5.4.34
patch -p1 < ../mykernel-2.0_for_linux-5.4.34.patch
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
make defconfig
make -j$(nproc)
sudo apt install qemu qemu-system-x86
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
结果
基于mykernel的极简内核
修改内核代码,使用时间片轮转调度多道程序
下载mykernel 代码,并将mypcb.h; mymain.c; myinterrupt.c 复制替换到Linux内核中的mykernel 文件夹,重新编译
make defconfig
make -j$(nproc)
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
Debug Linux Kernel
在Linux内核文件夹编译内核make 并make install ,使用qemu 验证无文件系统时的内核,会出现内核异常
完成内存跟系统镜像后,不要手贱更新系统,否则将无法正常启动。
跟踪启动
start_kernel() 静态创建0号进程init_task ,最终成为idle 进程,init_task 进程的内核栈通过静态方式分配rest_init() ,Linux内核初始化的尾声,做了很多剩下的初始化工作。调用kernel_thread() ,通过fork 创建内核进程,1号进程init 和2号进程kthreadd ,其中调用了kernel_init() kernel_init() ,通过调用do_execve() 来执行根文件系统的init 文件,其中调用了run_init_process() run_init_process() 通过execve() 来运行init 程序kthreadd 用来管理系统的资源
总结
感觉课程中的Linux内核更偏向于嵌入式系统中的Linux,在我的理解中,Linux的组成部分包括:进程管理(切换、调度)、内存分配与管理、系统内进程通信与同步机制、时钟与中断、驱动程序与模块、文件系统、网络以及系统调用等
课程主要讲解了Linux系统的编译与启动过程、进程管理、程序执行与文件系统、时钟与中断、驱动程序与模块、中断与系统调用等。即使有的内容在好几个课都接触过,但是记不住确实还是记不住= =。
406 参考资料庖丁解牛Linux操作系统分析https://gitee.com/mengning997/linuxkernel
|