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
|