学号后三位为342
原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.tar.xz
//下载Linux 5.0.1内核
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar
cd linux-5.0.1
make menuconfig
//编译过程中出错
经过查阅资料,解决问题
sudo apt-get install bison
sudo apt-get install flex
完成编译,找到kernel hacking->Compile-time checks and compiler options->[*] compile the kernel with debug info
开始编译
make -j8
//make -j* * 为核心数
//中间报错,添加下面的库
sudo apt-get install build-essential libssl-dev libelf-dev
libncurses-dev
mkdir rootfs
git clone https://github.com/mengning/menu.git
//下载MenuOS
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
//出错
sudo apt-get install gcc-multilib
继续向下执行
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
启动MenuOS(如果不加-append nokaslr选项,start_kernel断点有可能断不住!!!)
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr
打开一个新终端
cd LinuxKernel/linux-5.0.1
gdb
gdb>file vmlinux
//在gdb界面中targe remote之前加载符号表
gdb>target remote:1234
//建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
gdb>break start_kernel
//断点的设置可以在target remote之前,也可以在之后
make i386_defconfig
//⽣成32位x86的配置⽂件
qemu-system-x86_64...
首先,几乎所有的内核模块均会在start_kernel进行初始化。在start_kernel中,会对各项硬件设备进行初始化,包括一些page_address、tick等等,直到最后需要执行的rest_init中,会开始让系统跑起来。
那rest_init这个过程中,会调用kernel_thread()来创建内核线程kernel_init,它创建用户的init进程,初始化内核,并设置成1号进程,这个进程会继续做相关的系统初始化。
然后,start_kernel会调用kernel_thread并创建kthread,负责管理内核中得所有线程,然后进程ID会被设置为2。(参考pianogirl123)
因为学号后两位为42,在/usr/include/asm/unistd_32.h中查找对应的系统调用
内核源文件中的调用是#define __NR_pipe 42
一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信。 一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据
在test.c下添加系统调用#int Pipe()
int Pipe(int argc, char *argv[])
{
int result=-1;
int fd[2];
result = pipe(fd);
if(result == -1)
printf("fail to create pipe\n");
else
printf("pipe was created successfully\n");
return 0;
}
在此文件中的main函数里加入以下代码,并重新编译制作rootfs.img文件
MenuConfig("pipe","Create Pipe",Pipe);
在系统中断时重新开启一个新终端,在其中调试
gdb
gdb>file linux-5.0.1/vmlinux
gdb>target remote:1234
gdb>break sys_pipe
操作系统为用户态进程与硬件设备进行交互提供的一组接口——系统调用