最近要把一个程序移植到Debian-kfreebsd上,并不如想象中的顺利。
主要是ptrace在两个平台上不太一样。
首先是宏定义,linux底下都叫PTRACE_*,freebsd上都是PT_*。这个也许不算什么
然后是ptrace函数的参数,主要是value这个,linux下面是long很好用,但是freebsd下是int,这样64位的时候就有些问题。
但是freebsd的ptrace有个更好用的操作PT_IO,可以自定义读写长度,而linux底下没有,要自己搞。
最后一个,花了我很长时间才解决的,是CONTINUE这个操作,linux下面addr这个参数是被忽略的,直接从中断的地方继续;但是freebsd下面则可以利用这个参数指定从哪里继续,如果希望从中断的地方继续,则指定为1即可。
目前只遇到这些,从这些方面来看,还是freebsd的接口更好用一些。
Recently I've been porting a software from Linux to Debian-kfreebsd, but it's not as easy as I had expected. The problem is the interface of ptrace is not exactly the same between linux and kfreebsd.
The first is the names of the macros, which are PTRACE_* under linux and PT_* under freebsd.
Secondly the function `ptrace' is not the same, the parameter `value' is `long' under Linux, but `int' under freebsd, so it seems that there'll be a problem on 64 bit freebsd.
However, there's another operation called PT_IO under freebsd, using which we can specify the number of bytes we want to read or write.
The last and the most annoying one I've met, is the parameter `addr' for the CONTINUE operations. Under linux this parameter is ignored, and the child process will continue at where it had been interrupted; but under freebsd, we can specify this location by setting this parameter, and we can also let it continue at where it had been interrupted but setting the value to 1.
Now that's all for my program, and it seems that the interface under freebsd is better than that under linux.
主要是ptrace在两个平台上不太一样。
首先是宏定义,linux底下都叫PTRACE_*,freebsd上都是PT_*。这个也许不算什么
然后是ptrace函数的参数,主要是value这个,linux下面是long很好用,但是freebsd下是int,这样64位的时候就有些问题。
但是freebsd的ptrace有个更好用的操作PT_IO,可以自定义读写长度,而linux底下没有,要自己搞。
最后一个,花了我很长时间才解决的,是CONTINUE这个操作,linux下面addr这个参数是被忽略的,直接从中断的地方继续;但是freebsd下面则可以利用这个参数指定从哪里继续,如果希望从中断的地方继续,则指定为1即可。
目前只遇到这些,从这些方面来看,还是freebsd的接口更好用一些。
Recently I've been porting a software from Linux to Debian-kfreebsd, but it's not as easy as I had expected. The problem is the interface of ptrace is not exactly the same between linux and kfreebsd.
The first is the names of the macros, which are PTRACE_* under linux and PT_* under freebsd.
Secondly the function `ptrace' is not the same, the parameter `value' is `long' under Linux, but `int' under freebsd, so it seems that there'll be a problem on 64 bit freebsd.
However, there's another operation called PT_IO under freebsd, using which we can specify the number of bytes we want to read or write.
The last and the most annoying one I've met, is the parameter `addr' for the CONTINUE operations. Under linux this parameter is ignored, and the child process will continue at where it had been interrupted; but under freebsd, we can specify this location by setting this parameter, and we can also let it continue at where it had been interrupted but setting the value to 1.
Now that's all for my program, and it seems that the interface under freebsd is better than that under linux.
Comments