Linux Kernel Development

Linux Kernel Development

Linux Kernel Development

获取内核源码

  • 直接去kernel.org下载即可
  • 各个版本的国内内核地址
  • 更早期的linux早期内核版本, use git checkout v0.01 get 0.01 version use git log获取版本相关信息
  • 这里需要注意,other resources里面的资源也可以看看,挺好的
  • 右下角的feed建议订阅一下,罗马不是一天建成的
  • 也可以通过git拉下来,git会带有丰富的历史记录

目录结构

我的另一篇文档介绍了,这里不再赘述

编译内核

这里需要使用busybox等工具,具体可以看b站视频对应文档 我这里以我的环境(Debian10)为例操作下

下载源码并进入目录
1
2
liuliancao@liuliancao:~/projects/linux-5.12.4$ pwd
/home/liuliancao/projects/linux-5.12.4
设置体系结构

export ARCH=x86

make config

liuliancao@liuliancao:~$ sudo apt-get install flex bison -y

make menuconfig

liuliancao@liuliancao:~/projects/linux-5.12.4$ make menuconfig 选中General setup–>Initial RAM filesystem and RAM disk 选中Device Drivers–>Block service–>Ram block device support并修改Default Ram Disk size为65536 选中是Y,退出是ESC,ESC

make

liuliancao@liuliancao:~/projects/linux-5.12.4$ sudo apt-get install -y libelf-dev libelf-dev liuliancao@liuliancao:~/projects/linux-5.12.4$ make liuliancao@liuliancao:~/projects/linux-5.12.4$ ls -lh arch/x86_64/boot/bzImage lrwxrwxrwx 1 liuliancao liuliancao 22 8月 25 09:42 arch/x86_64/boot/bzImage -> ../../x86/boot/bzImage liuliancao@liuliancao:~/projects/linux-5.12.4$ ls -lh arch/x86/boot/bzImage -rw-r–r– 1 liuliancao liuliancao 9.0M 8月 25 09:42 arch/x86/boot/bzImage

安装busybox

请务必看下官方文档 从官网的介绍看,busybox是一个盒子,里面放内核和一些必要的工具,这样可以在类似嵌入式或者其他平台快速构建一个系统使用(尤其是开发测试)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar xf busybox-1.33.1.tar.bz2
cd busybox-1.33.1/
make menuconfig
#选择setting build as static binary(no share libs)
make && make install
cd _install/
mkdir etc dev mnt
mkdir -p proc sys tmp
mkdir -p etc/init.d
cat <<EOF > etc/fstab
proc        /proc           proc         defaults        0        0
tmpfs       /tmp            tmpfs        defaults        0        0
sysfs       /sys            sysfs        defaults        0        0
EOF

cat <<EOF > etc/init.d/rcS
echo -e "Welcome to tinyLinux, liuliancao!"
/bin/mount -a
echo -e "Remounting the root filesystem"
mount  -o  remount,rw /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
EOF
chmod 755 etc/init.d/rcS
cat <<EOF > etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
EOF
chmod 755 etc/inittab
cd dev
sudo mknod console c 5 1
sudo mknod null c  1 3
sudo mknod tty1 c 4 1
打镜像

记得用sudo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
liuliancao@liuliancao:~/software/busybox-1.33.1$ cat make_image.sh
#!/bin/bash
#  作者:简说linux https://www.bilibili.com/read/cv11271232 出处:bilibili
rm -rf rootfs.ext3
rm -rf fs
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz
liuliancao@liuliancao:~/software/busybox-1.33.1$ sudo bash make_image.sh
32+0 records in
32+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 0.105959 s, 317 MB/s
mke2fs 1.44.5 (15-Dec-2018)
Discarding device blocks: done
Creating filesystem with 32768 1k blocks and 8192 inodes
Filesystem UUID: 2fb0169e-e846-408c-a8d4-20870787ee53
Superblock backups stored on blocks:
        8193, 24577

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
qemu模拟启动
1
2
3
4
  liuliancao@liuliancao:~/software/busybox-1.33.1$ sudo apt-get install qemu qemu-system-x86_64 -y
  root@liuliancao:/home/liuliancao/software/busybox-1.33.1# qemu-system-x86_64 -kernel ~liuliancao/projects/linux-5.12.4/arch/x86_64/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt
  Unable to init server: Could not connect: Connection refused
  gtk initialization failed

出错原因是尝试访问图形界面导致,关闭图形显示-nographic

1
2
3
root@liuliancao:/home/liuliancao/software/busybox-1.33.1# qemu-system-x86_64 -nographic -kernel ~liuliancao/projects/linux-5.12.4/arch/x86_64/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt
QEMU 3.1.0 monitor - type 'help' for more information
(qemu)

发现直接进入qemu monitor了,检查下output.txt发现没有信息,后来在评论下面发现用vnc :0发现可以看到信息了 ../../images/qemu01.jpg◎ ../../images/qemu01.jpg

然后发现tmpfs有问题,cat -A发现确实有异常字符,可能是中文字符在里面,改一下

1
2
3
4
  liuliancao@liuliancao:~/software/busybox-1.33.1$ cat -A _install/etc/fstab
  proc        /proc           proc         defaults        0        0$
  tmpfs       /tmp            tmpfs    M-cM-^@M-^@M-cM-^@M-^@defaults        0        0$
  sysfs       /sys            sysfs        defaults        0        0$

还有一个报错是can't create diretory /proc/sys/kernel/hotplug 这个报错目前我还没解决,不过已经能进系统了

内核开发的特点

  • 不能访问C库也不能访问标准的C头文件

虽然不能访问常见C库,但是可以include include目录下的头文件

  • 必须使用GNU C

内联函数 内联汇编 分支声明

  • 缺乏内存保护机制

用户程序进行非法内存访问,此时内核会发送SIGSEGV信号并结束整个进程。 内核非法访问内存,此时会导致oops。内核中的内存不分页。

  • 难以执行浮点运算
  • 每个进程只有很小的定长堆栈
  • 需要时刻注意同步和并发
  • 要考虑可移植性

尝试读下0.01版本内核

linux早期内核版本, use git checkout v0.01 get 0.01 version

首先git log看下readme

torvalds 91年的邮件,简述了linux的产生,支持多线程文件系统

有操作系统该有的内存管理,文件系统等等。由于是0.01所以还需要继续完善

具体可以到1.0版本看

boot

就两个文件boot.s, head.s

汇编这里大家大学可学到,我建议可以参考网上的解读,就不要一个一个比对了,