我使用的是Ubuntu18.04版本,所使用的内核版本是linux4.16.8,接下来就开始我的新手之旅了。
我先谈谈在弄完这个之后我的一些认识,首先添加系统调用要知道是对操作系统的内核进行操作,然后编译内核重新生成操作系统,安装之后重启电脑进入你重新生成的系统,然后测试就ojbk了,虽然说的比较简单,但是对于初学者很多东西都需要自己摸索,而且在离开了windows熟悉的操作环境下,利用命令行一步步完成对系统调用的添加,完成之后可以说非常有成就感,废话不多说,进入正题。
首先你要有一个linux操作系统,无论是Ubuntu,Linux Mint,Debian还是Red Hat,我用的是Ubuntu18.04,安装在了我的移动硬盘里,周围很多同学安装了虚拟机,其实差不多,我想正好多了一个移动硬盘,不用白不用,没有移动硬盘的就用虚拟机吧,这个应该没什么影响,安装好了以后就进入Linux系统吧!
进入之后你会发现好难受,点右键里面没有刷新,开个小玩笑,首先进入火狐浏览器下载一个linux内核,这个内核就是你用来大展身手的东西,下载网址在上面,下载完成之后应该是在你的下载目录里面,你可以把它移出来,这时候你用鼠标操作会发现move到某些位置时会提示你权限不够(这电脑不是我的吗?)当然权限不是指的这个,linux操作系统大概分为内核态和用户态,当你从用户态变成内核态之后,你能做更多的事,比如访问一些特殊位置,执行一些特殊命令,具体切换命令可见[附1],密码就是你在安装时候设置的开机密码,先把你的内核解压到当前目录,然后把内核放到了/usr/src里面,这个地方需要用管理员权限
sudo mv /下载/linux-4.16.8 /usr/src
接下来就是修改内核的代码了
源码目录下涉及内核的三个文件有:
/arch/x86/entry/syscalls/syscall_64.tbl //设置系统调用号,如果是32位就用syscall_32.tbl
/include/linux/syscalls.h //系统调用的头文件
/kernel/sys.c //定义系统调用
先进第一个目录,点开之后在里面添加自己的系统调用号
接下来再在第二个目录里面添加函数声名
最后在最后一个目录实现函数的功能
有细心的小白可能会发现为什么这里是printk,而不是我们常用的printf呢?printk是内核态命令,在系统日志里面输出的,可通过dmesg命令显示出来,而printf就是用户态命令,在终端输出。
然后开始编译你的内核啦!先进入你的linux内核文件,cd /usr/src/linux-4.16.8,然后进行下面的操作
sudo make menuconfig
sudo make
sudo make modules_install
sudo make install
第一步执行的时候它提示我找不到flex命令,(有人还会提示ncures库没得)我网上找了找,执行下面的命令之后就好了
sudo apt-get update
sudo apt-get install flex
sudo apt-get install libncurses5-dev libssl-dev
接下来进入menuconfig界面
然后直接选择save,完了之后退出就可以了,完成会产生一系列文件,最关键的文件叫做 ".config",这个就是告诉内核哪些地方会编译,那些不需要
接下来就是漫长的编译了,执行第二步前要深呼吸,祈祷你的机器不会死机,哈哈,我的电脑有点菜,死了两次机,可能因为操作不当吧,安装的时候尽量什么也别干,我就是在复习古生物的时候来编译的,我还在网上看到了这样的命令
sudo make -j4
j后面的数字4代表你的处理器最大线程数四个,这个当然因电脑的不同而不用,就是用最快的方法编译,应该会快一些吧,有兴趣的可以试一下。
编译完成之后就是安装一些驱动和功能,也就是第三步的命令
最后进行第四步把内核安装到系统中
NICE!相信看到这一步你基本已经完成了,当时我弄好了这一步也这么想的
结果因为不熟悉,没有重启选择操作系统重新生成的内核,就直接测试了,结果函数返回-1
完了之后切记要重启选择你的重新生成的内核
重启之后不要进入第一个Ubuntu,选第二个Ubuntu高级选项
选择你刚刚生成的内核系统,然后进去吧!
现在就是测试阶段,你可以安装一个vim编辑器
sudo apt-get install vim-gtk
再在你的主目录下面创立一个.c文件,用作测试代码
vim hello.c
打开之后输入测试代码
然后利用gcc编译器编译(一般Ubuntu都会自带gcc的)没有的话安装一个吧
sudo apt-get build-depgcc
sudo apt-get install build-essential
两个都可以实现,然后编译输出
gcc hello.c
./a.out
可以看到函数返回1,证明成功了,然后输入命令dmesg看系统日志,发现有helloworld!
NICE!成功实现了系统调用!
注:我之前用的Linux内核版本4.4.4,编译器说啥不支持这系列版本的从4.4.0到4.4.20都不支持。没办法就换成了4.16.8,结果能成功了。
附1:ubuntu初始root密码和sudo、su命令
ubuntu初始root密码
安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下。
到网上搜了一下,原来是这么回事:
Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。
解决方法:
我们可以在终端输入命令“sudo passwd”,然后输入当前用户的密码后"Enter"。
终端会提示我们输入新的密码并确认,此时的密码就是root新密码。
修改成功后,输入命令 su root,再输入新的密码就ok了。
具体操作如下:
user@instant-contiki:~$ sudo passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
user@instant-contiki:~$
user@instant-contiki:~$ su -
Password:
root@instant-contiki:~#
若输入exit命令,则从root退回到普通用户。
Ubuntu进入root权限命令——sudo和su命令详解
sudo意思就是super-user do,让当前用户暂时以管理员的身份root来执行这条命令。
sudo 表示获取临时的root权限命令,如:
sudo gedit /etc/shadow,表示临时使用root权限来编辑/etc/shadow密码文件,因为/etc/shadow密码文件需要使用root权限才能打开与编辑。所以这里使用了sudo命令临时使用root权限来做一些普通账户无法完成的工作
su是用来改变当前用户的,su root,就是将当前用户切换为root,用了su root之后,下面所有的命令就可以不用打sudo了,因为当前用户已经是管理员root了。
root 用户为根用户,也就是 系统管理员 拥有全部权限
一个用户只能拥有一个 GID ,但是还可以归属于其它附加群组
su表示切换用户命令命令,如:
输入:su命令后回车表示切换当前的用户到root用户,或者:
输入:su - root(或者其他用户名)这里加了"-"后表示也切换的当前的环境变量到新用户的环境变量,su root(或者其他用户名)表示不切换环境变量到当前用户下。
相关主题