介绍
本次尝试使用linux的源码编译linux内核,并常识在屏幕上运行简单的c程序
最小系统
linux内核
看起来是急速的系统调用开发方式,但似乎不太详细
小型linux的参考
小型linux的参考,好似没有上面的全
以上是参考部分操作方式,由于参考多篇,且代码部分完全是自写的,就舔着脸标识原创了
make distclean
make gconfig
make kconfig
make menuconfig
make allyesconfig #启用内核全部功能
make allnoconfig #内核功能选项全部为否
只编译某子目录中的相关代码:
cd /usr/src/linux
make path/to/dir/
只编译部分模块:
make M=path/to/dir
只编译一个模块:
make path/to/dir/MOD_NAME.ko
将编译生成的文件保存至别处:
make O=/path/to/somewhere
mkdir /path/to/somewhere #创建存放目录
cd /path/to/somewhere #进入目录
./configure --ksource=/usr/src/linux #指定源目录
make -j * #*为cup核心数
make clean #清理编译的文件,但保留配置文件
make mrproper #移除所有编译生成的文件、配置文件和备份文件
make distclean #完全清理
make modules_install #安装模块
下载源码
建议在百度搜索清华源进行下载,也可以选择下面这个大学的下载。
传送门
下载完成之后进行解压:
- 可以直接使用桌面板程序进行解压,可以自行搜索tar命令进行解压。
编译开始
cd linux-5.7.9
make distclean
sudo apt install bison flex
make menuconfig
sudo apt-get install libncurses5-dev
make -j4
sudo cp arch/x86/boot/bzImage /boot
在任意目录新建
mkdir initramfs
cd initramfs
gedit init.c
#include <stdio.h>
int main() {
printf("Hello World!\n");
int true = 1;
int input_data,number0,number1;
char sign;
while (true) {
printf("please input some integer data:");
scanf("%d", &input_data);
printf("Input is %d\n", input_data);
if (input_data == 2) {
printf("你输入的是2\n");
}else if (input_data == 1) {
printf("Input 2 number and sign.\n");
scanf("%d", &number0);
scanf("%d", &number1);
scanf("%s", &sign);
if (sign == '+') {
printf("%d\n", number0 + number1);
printf("count end\n");
}else {
printf("some error\n");
}
}else if (input_data == 0) {
break;
}else{
printf("Your input is %d\n", input_data);
}
}
printf("shutdown 10s\n");
for (int i = 1; i < 6; i++) {
printf("%ds+ \n", i);
sleep(1);
}
printf("end\n");
return 0;
}
gcc --static -o init init.c
mkdir -p dev
sudo mknod dev/console c 5 1
find .|cpio -o -H newc|gzip -3 > ../initrd.img
sudo cp ../initrd.img /boot/
修改/boot/grub/grub.cfg
sudo /boot/grub/grub.cfg
即找到menuentry 'Ubuntu’在其后添加这个即可
menuentry 'Ubuntu bzImage' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b5cc14de-6824-4a35-b0f7-44874cfb5563' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd1,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt2 --hint-efi=hd1,gpt2 --hint-baremetal=ahci1,gpt2 b5cc14de-6824-4a35-b0f7-44874cfb5563
else
search --no-floppy --fs-uuid --set=root b5cc14de-6824-4a35-b0f7-44874cfb5563
fi
linux /boot/bzImage root=UUID=b5cc14de-6824-4a35-b0f7-44874cfb5563 ro quiet splash $vt_handoff
initrd /boot/initrd.img
}
现在重启你的系统,就可以看到多出一个Ubuntu bzImage的选项
sudo apt-get install gtk+-2.0 glib-2.0 libglade2-dev
上面用于make gconfig
下面用于make kconfig
sudo apt-get install libncurses5-dev libtinfo-dev