怎么说呢?最近在写系统调用的时候,牵扯到从User空间拷贝内存到Kernel空间的问题,因为当前写的进程都是和Kernel一起编译的,也没有什么虚拟地址的问题,就都是保护模式下的4G空间的地址。所有的Kernel中的代码包括好几个进程都是在这个空间运行的。
比如TTY进程虽然是自己单独运行在Task特权级上的,但是因为和Kernel一起编译,Kernel中的代码随时可以调用TTY中的代码并修改TTY中的数据结构或者变量的值。
如果进程是单独编译,并且不使用虚拟地址空间,那么需要链接时候指定自己在内存中的地址,但是由于ldt的存在使得它其实还是可以被存放到其他实际内存地址的,如果它的内存地址已经有进程在用了。这里就要涉及到内存管理了,会稍微复杂一些。
所以这里暂时先不考虑 虚拟地址,不考虑内存管理,每次都先将进程和kernel一起编译,并且ldt都设为初始地址为0,这样能降低复杂度,等我掌握基本知识之后,再去看Linux内核,学习虚拟地址和内存管理。
并且明白当前系统调用将指针传给kernel,并让Kernel到User空间中复制数据在加入了虚拟地址后也是这么做的,所以暂时可以不考虑虚拟地址,不然那样会增加我学习的复杂度。