云网牛站
所在位置:首页 > Linux教程 > Ubuntu18.04小白添加系统调用(内核4.16.8)

Ubuntu18.04小白添加系统调用(内核4.16.8)

2018-05-20 16:13:16作者:AoyLaoTang稿源:linux社区

我使用的是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   //定义系统调用

先进第一个目录,点开之后在里面添加自己的系统调用号

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

接下来再在第二个目录里面添加函数声名

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

最后在最后一个目录实现函数的功能

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

有细心的小白可能会发现为什么这里是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界面

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

然后直接选择save,完了之后退出就可以了,完成会产生一系列文件,最关键的文件叫做 ".config",这个就是告诉内核哪些地方会编译,那些不需要

 

接下来就是漫长的编译了,执行第二步前要深呼吸,祈祷你的机器不会死机,哈哈,我的电脑有点菜,死了两次机,可能因为操作不当吧,安装的时候尽量什么也别干,我就是在复习古生物的时候来编译的,我还在网上看到了这样的命令

sudo make -j4

 

j后面的数字4代表你的处理器最大线程数四个,这个当然因电脑的不同而不用,就是用最快的方法编译,应该会快一些吧,有兴趣的可以试一下。

 

编译完成之后就是安装一些驱动和功能,也就是第三步的命令

 

最后进行第四步把内核安装到系统中

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

NICE!相信看到这一步你基本已经完成了,当时我弄好了这一步也这么想的

结果因为不熟悉,没有重启选择操作系统重新生成的内核,就直接测试了,结果函数返回-1

完了之后切记要重启选择你的重新生成的内核

 

重启之后不要进入第一个Ubuntu,选第二个Ubuntu高级选项

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

选择你刚刚生成的内核系统,然后进去吧!

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

现在就是测试阶段,你可以安装一个vim编辑器

sudo apt-get install vim-gtk

 

再在你的主目录下面创立一个.c文件,用作测试代码

vim hello.c

 

打开之后输入测试代码

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

然后利用gcc编译器编译(一般Ubuntu都会自带gcc的)没有的话安装一个吧

sudo apt-get  build-depgcc

sudo apt-get  install  build-essential

 

两个都可以实现,然后编译输出

gcc hello.c

./a.out

 

可以看到函数返回1,证明成功了,然后输入命令dmesg看系统日志,发现有helloworld!

Ubuntu18.04小白添加系统调用(内核4.16.8)

Ubuntu18.04小白添加系统调用(内核4.16.8)

 

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(或者其他用户名)表示不切换环境变量到当前用户下。

 

相关主题

Linux/Unix下Python代码调用C/C++共享库

精选文章
热门文章